概要
社内でリーダブルコードの輪読会を開催してみるので、1章から3章までをまとめた。 せっかくなのでblogにも記載。
はじめに
- 本書の目的は、読みやすいコードを書く事。
- 本書の目的は、君のコードを良くすること。
- コードは理解しやすくなければいけない。
- 誰かが君のコードを読んで理解する時間を最短にする。
1章 理解しやすいコード
1.1 「優れた」コードって何?
1.2 読みやすさの基本定理
- 優れたコードとは読みやすいコード。
- コードは他の人が最短時間で理解できるように書かなければならない。
- ○日後の自分自身も含む
1.3 小さなことは絶対いいこと?
- 大きいより小さい方が理解するまでに係る時間は短い。
- ただしコードが小さければ必ず良いということではない。
- コードは短くしたほうが良いが、「理解するまでにかかる時間」を短くするほうが大切。
1.4 「理解するまでにかかる時間」は競合する?
- 高度に最適化されたコードでも、もっと理解しやすくはできる。
- 理解しやすいコードは設計、テストを行いやすい傾向がある。
でもやるんだよ
- 理解しやすいかどうかを考えるのは大変だが、優秀なプログラマになるために頑張ろう。
2章 名前に情報を詰め込む
2.1 明確な単語を選ぶ
- 「get*」では何をどこからどのように取ってくるのか不明瞭。
- FetchPage,DownloadPageなどはどうか。
- 「size」は何のサイズか不明瞭。
- Height,NumNodes,MemoryBytesなどはどうか。
もっと「カラフル」な単語を探す
2.2 tmpやretvalなどの汎用的な名前を避ける
- 変数の値を表す名前を選ぶ。
- 私はやりがちなので気をつける。
- 汎用的な名前を使用するときには、それ相応の理由がある場合。
tmp
- 生存期間が短くて、一時的な補完が最も適切な変数に使用する。
- temporaryとしての本来の意味がある場合に使用する。
ループイテレータ
- 明確な名前を使用する。(club_i、ci、members_i、miなど)
- club_iならまだわかるが、ciとなると分かりにくい気がする。
- forがネストしてi,jを間違えるというのはよくあるが、名前を付けるほどか?
- そもそも最近はstreamなどループを使用しないようにするのか?
2.3 抽象的な名前よりも具体的な名前を使う
- 正直この辺りは英語が苦手なので難しい。
DISALLOW_EVIL_CONSTRUCTORS
- 正直よくわからず。
--run_locally
- この場合、使用用途ではなく、機能をOptionにするべきという理解しかできなかった。
2.4 名前に情報を追加する
値の単位
- 有効な場合もあると思うが、単位を入れることで助かるケースは少ない気がする。
その他の重要な属性を追加する
- htmlの文字コード : html_utf8
- エスケープ前のコメント : unescaped_comment
- 安易に変数名を付けガチ。ここは意識していきたい。
2.5 名前の長さを決める
スコープが小さければ短い名前でもいい
- 逆に、スコープが大きければ長い名前を付ける。
- 1文字で良いスコープの範囲は数行か?
長い名前を入力するのは問題じゃない
- 補完がある
- が、やはり限界があると思う。(似た長い名前など。)
頭文字と省略形
- 一般的な略語はOK。(str、doc、evalなど)
不要な単語を投げ捨てる
- これによって短くなるのはわかるが、選別が難しい。
2.6 名前のフォーマットで情報を伝える
その他のフォーマット規約
- 大文字やアンダースコアなどに意味を含める。
- Javaではfinalは全て大文字とか。
2.7 まとめ
- 略
3章 誤解されない名前
- 名前が「他の意味と間違えられることはないだろうか?」と何度も自問自答する。
3.1 例 : filter()
- フィルタリングの条件でtrueの値かfalseの値か不明瞭。
- 通常はtrueの値ではないか?
3.2 例 : Clip(text, length)
- 正直Clipという単語に馴染みがないのでなんとも言えなかった。
3.3 限界値を含めるときはminとmaxを使う
3.4 範囲を指定するときはfirstとlastを使う
3.5 包含/排他的範囲にはbeginとendを使う
- startといったらendな気がしたが、これは日本人だから?
3.6 ブール値の名前
- is,has,can,shouldを頭に。
- 個人的にcanとshouldはあまり使わない。shouldは見たことないがどうか?
3.7 ユーザの期待に合わせる
例 : get*()
例 : list::size()
- Javaでも以下のコードはあまりよろしくない。
for (int i = 0; i < list.getLength(); i++) {}
3.8 例 : 複数の名前を検討する
- 2章の最初、2.1辺りと被るが、類語辞典などか?
3.9 まとめ
- 最善の名前とは誤解されない名前。