リーダブルコード
理解しやすいコード
- コードは理解しやすくなければならない
- コードは他人が最短時間で理解できるように書かなければならない
表面上の改善
名前に情報を詰め込む
- 明確な単語を選ぶ
- tmpやretvalなどの汎用的な名前を避ける(あるいは使う状況を選ぶ)
- 具体的な名前を使って物事を詳細に説明する
- 接尾辞や接頭辞を使って情報を追加する
- スコープの大きな変数には長い名前をつける
- 大文字やアンダースコアなどに意味を含める
誤解されない名前
- 最善の名前は誤解されない名前
- get()やsize()には軽量なメソッドが期待されている
美しさ
- 複数のコードブロックで同じようなことをしていたら、シルエットも同じようなものにする
- コードの「列」を整列すれば概要が把握しやすくなる
- ある場所でA,B,Cのように並んでいたものを、他の場所でB,C,Aのように並べてはいけない。意味のある順番を選んで常にその順序を守る
- 空行を使って大きなブロックを論理的な「段落」に分ける
コメントすべきことを知る
コメントをすべきでは「ない」こと
- コードからすぐに抽出できること
- ひどいコードを補う」「補助的なコメント」。コメントを書くのではなくコードを修正する
記録すべき自分の考え
- なぜコードが他のやり方ではなくこうなっているのか
- コードの欠陥をTODO:やXXX:などの記法を使って示す
- 定数の値にまつわる「背景」
読み手の立場になって考える
- コードを読んだ人が「え?」と思うところを予想してコメントをつける
- 平均的な読み手が驚くような動作は文書化しておく
- ファイルやクラスには「全体像」のコメントを書く
- 読み手が細部に囚われないように、コードブロックにコメントをつけて概要をまとめる
コメントは正確で簡潔に
- 複数のものをさす可能性のある代名詞を避ける
- 関数の動作はできるだけ正確に説明する
- コメントに含める入出力の実例を慎重に選ぶ
- コードの意図は詳細レベルではなく高レベルで記述する
- よくわからない引数にはインラインコメントを使う
- 多くの意味が詰め込まれた言葉や表現を使って、コメントを簡潔に保つ
ループとロジックの単純化
制御フローを読みやすくする
- 条件式の引数の並び順
- if/elseブロックの並び順
- 三項演算子
- do/whileループを避ける
- 関数から早く返す
- 悪名高きgoto
- ネストを浅くする
巨大な式を分割する
説明変数を導入する
- 巨大な式を分割できる
- 簡潔な名前で式を説明することでコードを文書化できる
- コードの主要な概念を読み手が認識しやすくなる
変数と読みやすさ
- 邪魔な変数を削除する
- 変数のスコープをできるだけ小さくする
- 一度だけ書き込む変数を使う
コードの再構成
無関係の下位問題を抽出する
- 関数やコードブロックを見て「このコードの高レベルの目標は何か?」と自問する
- コードの各行に対して「高レベルの目標に直接的に効果があるか?あるいは無関係の下位問題を解決しているか?」と自問する
- 無関係の下位問題を解決しているコードが相当量あればそれらを抽出して別の関数にする
一度に1つのことを
- コードは1つずつタスクを行うようにしなければならない
コードに思いを込める
- コードの動作を簡単な言葉で同僚にもわるように説明する
- その説明の中で使っているキーワードやフレーズに注目する
- その説明に合わせてコードを書く
短いコードを書く
- 不必要な機能をプロダクトから削除する。過剰な機能は持たせない
- 最も簡単に問題を解決できるような要求を考える
- 定期的にすべてのAPIを読んで標準ライブラリに慣れ親しんでおく
選抜テーマ
テストと読みやさ
「分/時間カウンタ」を設計・実装する
あわせて読みたい