リーダブルコードまとめ
はじめに
可読性や保守性の良いコードを書けるようになるため"リーダブルコード"を読みました。
ある程度のコーディングルールはわかっているつもりでしたが、自己流になっている部分も多いことを痛感しました。
今回は自分的にコーディング時に意識したいポイントをまとめていこうと思います。
そもそも"優れたコード"とは?
本書では"優れたコード" = 他の人が最短時間で理解できるコード としている。
ただし、"理解"とは変更を加えたりバグを発見できるという意味。
"他の人"とは半年後、1年後の自分なのかもしれない。
命名時のポイント
名前は短いコメントだと思ってより多くの情報を誤解なく伝えることを意識する。
①明確な単語を選ぶ
例えば、getPageでは情報が少なくどこからページをどこから取ってくるのか不明確である。
インターネットからであればfetchPageやdownloadPageの方が明確。
②汎用的な名前を避ける
tmp,retval,fooなどの名前には情報がない。
変数の値を表すような名前を使う。
※"この変数には他に役割がない"という明確な意味を伝えている場合は例外、汎用的な名前を使用する場合はそれ相応の理由を用意する。
③誤解されない名前をつける
名前が他の意味に解釈されることがないか自問自答する。
-
compare
比較した結果がどうなるかわかりにくい。
代替: contains,equals,max,minなど -
check
意味の範囲が広すぎる、trueを返すのかfalseを返すのかわからない
代替: isEmpty,canSave,hasSaved,existsなど -
限界値を含めるときはminとmaxを使う
-
範囲を指定するときはfirstとlastを使う
-
ブール値の変数名は頭にis,has,can,shouldなどをつけると明確
→否定形は避け、肯定形で命名する(読みやすく短くて済む)
コメントのポイント
コメントの目的はコードの意図を読み手に理解してもらうこと
①コメントすべきでは"ない"こと
-
コードからすぐに読み取れること
新しい情報を提供するわけでもなく、読み手がコードを読みやすくなるわけでもないコメントは不要 -
ひどいコードを補うためのコメント
優れたコード > ひどいコード + 優れたコメント
ひどいコードはコメントで補うのではなく書き換える
②コメントすべきこと
- コードを書いていたときの自分の考え
なぜ他のやり方ではなくこうなっているのか - コードの欠陥をTODO:やXXX:などのアノテーションコメントで示す
- 読み手の立場になり質問されそうなこと
制御フローのポイント
制御フローはできるだけ"自然に"を意識する
①引数の並び順
1. if(age >= 18)
2. if(18 <= age)
1.と2.では1.の方が読みやすい。
左辺に変化する値、すなわち"調査対象"
右辺にあまり変化しない値、すなわち"比較対象"を書く。
◎ 1.もしあなたの年齢が18歳以上ならば
△ 2.もし18年があなたの年齢以下ならば
②条件は肯定形を使う
1. if(isEmpty)
2. if(!isEmpty)
2.の場合頭の中で一度肯定形を否定形に変換する必要があるため、理解しにくい。
③説明変数を使う
if (line.split(":")[0].equals("root")) {
...
}
このコードでは何を比較しているのかわからない。
以下のように説明変数(userName)を用意するとコードは長くなるが、はるかに理解しやすくなる。
userName = line.split(':')[0].strip()
if (userName.equals("root")) {
...
}
コード構成のポイント
①目的を明確にする
関数の目的を明確にし、無関係の問題を扱っている場合は別の関数に抽出する。
汎用コードとすることで複数箇所で再利用することもできる。
独立したコードにすることで改善も簡単になる。
②"一度に1つのタスク"を意識する
書いたコードのタスクを列挙し、別の関数に分割できないか検討する。
ロジックを簡単な言葉で説明してみる。
③標準ライブラリに慣れ親しむ
定期的にすべてのAPIを読み、いざという時に利用できるようにする。
Discussion