観照日記

主にIT・ゲームなどの日々の役に立ちそうなことを書いていきます

リーダブルコード 要点まとめ

リーダブルコード(オライリー社)を読んで感銘を受けたので,メモを残します。この記事を読んで面白そうだなと思ったあなた。ぜひ書籍を読んで良いコードを増やす人になってくださいよろしくお願いします。

この内容を実践することで,

  • メンテナンスしやすいコードになる
  • 理解しやすいので新入りでもすぐコードの意図が理解できる
  • ドキュメントを見ないと何やっているかわからないコードになることを防ぐ
  • 実装の詳細ではなく高レベルの問題を意識できるようになる

などの恩恵を受けることができます。

1. 名前に情報を詰め込む

名前をみただけで情報を読み取れるようにする。 - 明確な単語 ー 例)❌ Get ,✅ FetchDownload

  • 汎用的な名前ダメ ー 例)❌ tmp, retval など,

  • 具体的な名前で,詳細に説明 ー 例)❌ ServerStart()ListenOnPort()

  • 変数名に情報を追加する ー 変数名に単位 _ms をつけるなど

  • スコープの大きな変数に長い名前 をつける

  • 大文字やアンダースコアに意味を含める ー 例)クラスのメンバ変数にだけアンダースコアをつける

2. 誤解されない名前

  • boolean 変数 には is, has をつける

  • 否定形の変数名を避ける

  • get(), size() は軽量であることが一般に期待される(重い処理を行わない)

3. 美しさ

  • シルエットを揃える ー 複数のコードブロックで同じことをしていたらね

  • コードの列を揃える ー 概要を把握しやすくなる

  • 規則性を持たせる ー ある場所で「A・B・C」と並んでいたら,他のところで「B・A・C」にしたりしない

  • コード全体を分割 ー 空行を使って意味的な段落に分ける

4. コメントすべきこと

記録すべき自分の考え ー

  • なぜコードが他のやり方ではなく,こうなっているのか

  • コードの欠陥を TODO: XXX: FIXME: などの記法で強調する

  • 定数の値にまつわる背景

    例) python epoch_limit = 100 # この上限値は速度と性能の面でバランスが良い

読み手の立場になって考える ー

💡コメントの目的は,コードの意図を読み手に理解してもらうこと

  • 読んだ人が「?」となるところを予想してコメントする

  • 平均的な読み手が驚く動作は文書化しておく

  • ファイルやクラスには「全体像」のコメントを

  • コードブロックの先頭には概要コメントをつける

コメントすべきでないこと ー

  • コードからすぐにわかること

  • ひどいコードを補うコメントを書くのではなく,コードを修正する

5. コメントは正確で簡潔に

小さな領域に情報量の多いコメントを書くことが肝要。

  • ❌「それ」「これ」

  • 関数の動作は正確に記述

  • コメントに含める入出力の実例を吟味する

  • コードの意図は高レベルで記述

  • よくわからない引数にはインラインコメントをつける

  • パターンやイディオムについての 情報量の多い単語 を使う(例:ヒューリスティック,総当たり,キャッシュ など)

6. 制御フローを読みやすくする

  • 条件分岐では,変化する値を左辺 にする python if (100 > count) # ❌ if (count < 100): # ✅

  • if/else のブロックの並び替え。肯定形・単純・目立つ物 を先に する

  • 三項演算子は読みやすくなる場合にだけ使う

  • ネストを深くしない。ガード節を使う。値を早めに返す。

7. 巨大な式を分割する

  • 「説明変数」を追加 ```python # わかりづらい if line.split(':')[0] == 'root': ...処理...

    # 分割するとわかりやすい↓ username = line.split(':')[0] if username == 'root': ...処理... ```

  • 論理式を変形 ー by applying ド・モルガンの法則

9. 変数と読みやすさ

プログラムの変数はすぐ増えて,いずれ追跡が困難になる。変数を減らして軽量にする。

  • 邪魔な変数の削除 ー 結果をすぐ使って,中間変数を削除

  • 変数のスコープを小さくする ー 変数を数行のコードからしか見えない位置に移動。使う場所の近くで宣言。

  • 一度だけ書き込む変数を使う ー 変数を宣言した後で書き換えない。const, final で宣言してイミュータブル(不変)にする。

10. 無関係の下位問題を抽出する

  • 詳細すぎる下位問題を関数にまとめて分離 ー 読みやすく,かつ変更を加えやすくなる

  • 汎用コードは積極的にユーティリティ化する

  • メソッド内部の処理は同じ抽象度のレベルになるようにする

11. 一度に1つのことを

  • コードを構成する際に,一度に複数のことをしない

  • リファクタリングするときは,一度コード全体をタスクで分割する

12. コードに思いを込める

コーディングの理想的な手順

  1. コードの動作を簡単な言葉で同僚にもわかるように説明する
  2. その説明のなかで使っているキーワードやフレーズに注目する
  3. その説明に合わせてコードを書く
  • ラバーダッキング ー プログラムのデバッグに悩んだときは,テディベアに問題を声に出して説明する

  • 本質的なことはシンプルな言葉で説明できることが多い

"おばあちゃんがわかるように説明できなければ,理解しているとは言えない"

ー アインシュタイン

13. 短いコードを書く

おわりに

いかがだったでしょうか。本書に書いてある内容はコーディングだけでなく,文書作成やプレゼンにおける 「読みやすさ」にも通ずるものがあると思います。

例えば,

  • 「高レベルの内容についてコメントする」→「記事を書くときはまず概要を書く」

  • 「似たような内容はシルエットを揃える」→「箇条書きするときは粒度を揃える」

対応しています。

実はこの記事でも,「情報量の多い単語を使う」→「絵文字を使ってスペースあたりの情報量を増やす」とかやってみてます。

ということで,みなさんも読んでみてください m(_ _)m