『リーダブルコード』読書メモ

『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』は、読みやすく、理解しやすいコードを書くための具体的な指針を示した書籍です。以下に、その主要なポイントをまとめます。

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

変数をはじめとする名前は、その役割や内容を明確に伝えるべきです。

  • 汎用的な単語ではなく、明確な単語を使う:

    汎用的な単語代替案の例
    getfetch, download, retrieve
    sizeheight, numNodes, memoryBytes
    stopkill, pause, halt
    senddeliver, dispatch, announce, distribute, route
    findsearch, extract, locate, recover
    startlaunch, create, begin, open
    makecreate, setUp, build, generate, compose, add, new
  • 抽象的な名前ではなく、具体的な名前:

    • tmp は、生存期間が非常に短く、一時的な保管が最も重要な変数にのみ使用します。
    • イテレータ変数には、安易に i, j, k を使うのではなく、club_idx, member_idx, user_idx のように、何を表すインデックスなのかがわかるように命名します。
    • より直接的で、明確な表現にします。
      1
      2
      3
      4
      
      // 悪い例
      ServerCanStart
      // 良い例
      CanListenOnPort
      
  • 接尾辞や接頭辞で情報を追加する:

    • delaydelay_secs (単位)
    • sizesize_mb (単位)
    • limitmax_kbp (限界値)
    • angledegree_cw (単位と方向)
    • htmlhtml_utf8 (エンコーディング)
  • 名前の長さを適切に決める:

    • 長すぎる名前は短縮を検討します。
      • FormatStringFormatStr
      • ConvertToStringToString
    • 短すぎる名前は長くします。
  • 名前のフォーマットで情報を伝える:

    • 大文字やアンダースコアなどの命名規則に意味を含ませる(例: 定数にはすべて大文字とアンダースコアを使用する)。

2. 誤解されない名前を使う

名前は、読み手が誤解しないように慎重に選びます。

  • 多義語に気をつける:

    • filterselect (含める), exclude (除外する)
    • clipremove (削除する), truncate (切り詰める)
  • 限界値を示す:

    • 最大値には maxlimit を、最小値には min を使う。
    • 例: max_users, min_length
  • 範囲を示す:

    • 包含的な範囲には firstlast を使う。
    • 排他的な範囲には beginend を使う。
  • ブール値の変数名:

    • ブール値の変数には、is_, has_, can_, should_ などの接頭辞をつけ、真偽が明確にわかるようにします。
    • 例: is_valid, has_permission, can_read, should_process
  • ユーザーの期待に合わせる:

    • get メソッドは、通常、軽量で副作用のないアクセサ(ゲッター)であるという認識があります。計算コストが高い処理や副作用がある場合は、computecalculate などの動詞を使います。
    • size メソッドは、通常 $O(1)$ の計算量で返されると期待されます。計算量が多い場合は、countcalculate_size など、計算を伴うことを示唆する名前にします。

3. 美しさ(コードのフォーマットとレイアウト)

コードの見た目は、読みやすさに大きく影響します。

  • 読み手が慣れているパターンと一貫性のあるレイアウトを使う:
    • プロジェクトや言語のコーディング規約に従います。
  • 似ているコードは似ているように見せる:
    • 構造が似ているコードブロックは、同じようなフォーマットで記述します。
  • 関連するコードはまとめてブロックにする:
    • 論理的に関連する行は、空行などで区切ってグループ化します。
  • 一貫性のある改行:
    • 改行のルールを統一し、視覚的なノーズを減らします。
  • 縦の線を揃える:
    • 代入演算子や引数などを縦に揃えることで、コードの構造が把握しやすくなります。
    1
    2
    3
    
    details  = request.POST.get('detail')
    location = request.POST.get('location')
    phone    = request.POST.get('phone')
    
  • 意味のある並びにする:
    • 変数宣言や関数呼び出しの引数などは、論理的な順序で並べます。
  • 宣言をブロックにまとめる:
    • 関連する変数宣言は、コードブロックの先頭など、一箇所にまとめます。

4. コメント

コメントは、コードだけでは伝わりにくい「なぜ(Why)」や「何が(What)」を補足するために書きます。

  • コードからすぐにわかることをコメントに書かない:
    • 例: i = 0; // iを0に初期化 のようなコメントは不要です。
  • 定数にコメントをつける:
    • マジックナンバー(意味不明な数値)ではなく、名前付き定数を使用し、その定数の意味をコメントで補足します。
  • 代名詞の使用を避ける:
    • 「それ」「これ」のような代名詞は避け、具体的な名詞を使います。
  • 関数の動作は正確に説明する:
    • 関数の目的、引数、戻り値、副作用、例外などを簡潔かつ正確に記述します。
  • よくわからない引数にはインラインコメント:
    • 関数呼び出しの際に、引数の意味が分かりにくい場合は、その場でコメントを追加します。

参考文献

  • Dustin Boswell, Trevor Foucher, 『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』, オライリージャパン (2012)