山pの楽しいお勉強生活

勉強の成果を垂れ流していきます

リーダブルコード1章から3章までまとめ

概要

社内でリーダブルコードの輪読会を開催してみるので、1章から3章までをまとめた。 せっかくなのでblogにも記載。

はじめに

  • 本書の目的は、読みやすいコードを書く事。
  • 本書の目的は、君のコードを良くすること。
  • コードは理解しやすくなければいけない。
    • 誰かが君のコードを読んで理解する時間を最短にする。

1章 理解しやすいコード

1.1 「優れた」コードって何?

1.2 読みやすさの基本定理

  • 優れたコードとは読みやすいコード。
  • コードは他の人が最短時間で理解できるように書かなければならない。
    • ○日後の自分自身も含む

1.3 小さなことは絶対いいこと?

  • 大きいより小さい方が理解するまでに係る時間は短い。
  • ただしコードが小さければ必ず良いということではない。
  • コードは短くしたほうが良いが、「理解するまでにかかる時間」を短くするほうが大切。

1.4 「理解するまでにかかる時間」は競合する?

  • 高度に最適化されたコードでも、もっと理解しやすくはできる。
  • 理解しやすいコードは設計、テストを行いやすい傾向がある。

でもやるんだよ

  • 理解しやすいかどうかを考えるのは大変だが、優秀なプログラマになるために頑張ろう。

2章 名前に情報を詰め込む

2.1 明確な単語を選ぶ

  • 「get*」では何をどこからどのように取ってくるのか不明瞭。
    • FetchPage,DownloadPageなどはどうか。
  • 「size」は何のサイズか不明瞭。
    • Height,NumNodes,MemoryBytesなどはどうか。

もっと「カラフル」な単語を探す

  • 類語辞典を使う。
    • オンラインでは良い所みつからず。
  • 気取った言い回しよりも明確で正確な方がいい。
    • 正直気取った言い回しかどうかがわからないので、注意しようがないか?
    • githubとかの使用頻度とか?

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*()

  • Javaの場合、メソッド内で変換してるという事自体がイレギュラーか?

例 : list::size()

  • Javaでも以下のコードはあまりよろしくない。
for (int i = 0; i < list.getLength(); i++) {}

3.8 例 : 複数の名前を検討する

  • 2章の最初、2.1辺りと被るが、類語辞典などか?

3.9 まとめ

  • 最善の名前とは誤解されない名前。