概要
大きなクラス、長いメソッドを書いたり読んだりしていて、ロジックが追えなくなってきています。
私の周りではすごく理解が良く、長い処理でも追っていける人がいますが私はそうではありません。
私はごくごく短いロジック、意図が明確な名称でないとちゃんと頭に入りません。
読み返してももう一回理解し直さなくてはならなかったりとかで、結構つらいものがあります。
そんな私が自分自身に対して、もっと短くて、もっとわかり易くて、もっと美しいコードを書きたいという思いと、周りの人にもそのようにしてほしい(自己都合)という願いで執筆しました。
実装例
リーダブルでないコード
Q. さて、このコードは何を行っているでしょうか?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public static void main(String[] args) { String str = null; int value = -100; boolean flg = true; List<String> error = new ArrayList<String>(); if(str == null) { error.add("備考を記入してください。"); if(value < 0) { error.add("負数は入力できません。"); if(flg == true) { error.add("すでに削除されています。"); } } } for(String e: error) { System.out.println(e); } } |
A. エラーがある場合は全てを表示する。
簡単なコードなので見てすぐわかる人にはわかると思いますが、
見にくく(醜く)ないですか?
私は見にくいです。
それに、視覚的に頭に入ってきません。
これをリーダブルに変えます。
リーダブルなコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public static void main(String[] args) { String remarks = null; int amount = -100; boolean isDeleted = true; tryError(remarks, amount, isDeleted); } private static void tryError(String remarks, int amount, boolean isDeleted){ List<String> errorList = new ArrayList<String>(); if(remarks == null) errorList.add("備考を記入してください。"); if(amount < 0) errorList.add("負数は入力できません。"); if(isDeleted == true) errorList.add("すでに削除されています。"); for(String error: errorList) { System.out.println(error); } } |
<改善ポイント>
- 各変数で正確な意味が表現されている。
- ロジックがメソッド名で明確に表現されている。
- ifのネストが無くなり、判定ロジックが独立するようになった。(メンテナンスしやすい!)
- エラーを追加する列の位置を合わせたので、見やすくなっている。
実際、現場で自分またはレビュー対象のコードをリーダブルにしようと思ったら、これくらいの単位から行うものなんじゃないかと思う。
リーダブルであることは「文化」なので、読みにくいコードを書いているプロジェクトや会社ではそもそもリーダブルにしようとすることを多くの人が諦めているだろうと思っています。
でも諦めないでほしい!
まずは自分から、ちょっとでも読みやすいコードを書こう!
ソースコードだけじゃなく、設計書もリーダブルにしていこう!
理解しやすいとコミュニケーションロスがなくなって、仕様が明確になって、手戻りが減る!
良いこと尽くめ!!
私も今のプロジェクトで悪戦苦闘しながら、少しでもリーダブルになる努力を続けています。
まとめ
- 変数やメソッド名で意図を明確に表現するとわかり易い。
- 列を揃えると、思いのほか読みやすい!
- ifをネストしないのは読みやすさの定番。
- 自分の状況がどうであれ、リーダブルに行こう!
コメント