「リーダブルコード」を読んだ

読みました。

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

読みやすいコードを書くための方法がまとめられた本。読みやすいコードを「他人(未来の自分も含む)が最短時間で理解できるコード」と定義し、そのようなコードを書くために何をすれば良いのかが書かれている。いろいろと気をつけるべき点はあるが、とにかく常識的に考えてコードの読み手が混乱したり嫌になったりしないことを徹底するべきということが永遠に述べられている。とりあえず、すぐにできそうなこととして、以下の3点に気をつけていこうと思った。

  • 明確に書く
    • 変数名を具体的で意味のわかりやすいものにする
    • 制御構文の順序や使い方を直感に沿うようにする
  • 短く書く
    • コードからわかること/コードを改善すればわかることをコメントしない
    • 未使用なコードは削除する
    • ライブラリに親しんでおく
  • 変数の値を把握しやすくする
    • 変数のスコープはできるだけ狭くする
    • イミュータブルな変数を使う

以下読書メモ。

1章 理解しやすいコード

  • 他人が最短時間で理解できるようなコードを書く
    • 「他人」には未来の自分も含まれる

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

  • より明確な単語を選ぶ
    • 単にgetとするよりもfetch/download、stopとするよりもkill/pause
  • tmp/retvalのような意味のない名前は避ける
    • ただし、swapに使う一時変数など「意味がない」変数ではあえて使ったほうがわかりやすいことも
  • 変数名の中に不要な単語があれば捨てる。逆に、変数名が長くなっても意味を明確にできるなら付け足す

3章 誤解されない名前

  • 範囲を指定するときは変数名で境界値を含むか含まないかを明確にできる
    • max/minを使うと境界値を含むことを明示できる(limitでは不明瞭)
    • first/lastを使うと境界値を含むことを明示できる(start/stopでは不明瞭)
    • begin/endでは範囲の始まりは含んで終わりは含まないという慣例がある
  • 軽量なアクセサにはget、重い処理にはcompute/countを使うなど言葉が持つイメージや慣例を重視する

5章 コメントすべきことを知る

  • コメントする価値のあることだけコメントする
    • コードからすぐわかることをコメントしない
    • コメントする代わりに変数/メソッド名をわかりやすくできないか考える
  • コメントには自分の考えを記録する
    • 何を思ってそのコードを書いたのか
    • 特に平均的な読み手が驚きそうな処理にはそのように書いた理由を書く

6章 コメントは正確で簡潔に

  • 曖昧な代名詞を避けて、簡潔に分かりやすく書く
  • 入出力のコーナーケースについて書く場合、実例を使うと良い(ex: // Strip("abba/a/ba", "ab"は"/a/"を返す))

7章 制御フローを読みやすくする

  • if/else文の並び順に注意する。以下の方針をもとに判断
    • ifの条件は肯定形を使う
    • 単純な条件を先に書く
    • 関心を引く/目立つ条件を先に書く
  • 「ガード節」を使って関数から早くreturnすると分かりやすい場合が多い
    • ネストを浅くすることにも寄与

8章 巨大な式を分割する

  • 説明変数を使って式を分割することで式の意味を明確にする
if line.split(':')[0].strip() == "root":

# 説明変数 username により意味を明示
username = line.split(':')[0].strip()
if username == "root":

9章 変数と読みやすさ

  • 不要な変数は削除する
    • 意味を明確にすることに寄与しない説明変数は削除
    • 一度しか使わない要約変数は削除
    • フラグ変数はループを途中で抜ける/returnを使えば不要になることも
  • 変数のスコープは可能な限り縮める
  • 変数を操作する場所が増えると現在値の判断が難しくなるため、変数をイミュータブルにすると良い
  • 変数の定義は変数を使う直前に行う

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

  • 下位の問題を関数に抽出することで、高レベルの目標に集中できるとともに、処理を再利用したり単体テストしたりできるようになる

13章 短いコードを書く

  • コードを常に軽量に維持する
    • 未使用のコードを削除する
    • プロジェクトをサブプロジェクトに分割する
  • ライブラリを利用する。たまには標準ライブラリを時間をかけて読んでみて、どんなことができそうか感じ取っておく