リーダブルコードを読んだ記録【5つの理念と、50個のテクニック】

f:id:aotree423:20180408173804j:image

リーダブルコードを読んで、個人的に「忘れてはいけない」と思った5つの理念と、「今日から実践しよう」と思った50個のテクニックをテーマごとにまとめました。

5つの理念

  • コードは、他の人が読んで最短時間で理解できるように書く
  • 簡潔さや短さより、読み手への親切さを重視する
  • 他人だけでなく、何もかも忘れた未来の自分が見た時に理解可能なコードを書く
  • コードの整理は、やりすぎて逆に見にくくならないように注意
  • 新しいコードは、なるべく書かない

50個のテクニック

名前(変数名, メソッド名, クラス名, ファイル名)
  • 名前に情報を詰め込む (名前は短いコメント)
  • 英単語はなるべく具体的にする (抽象的: get → 具体的: download)
  • 時間やバイト数を格納する変数の名前には単位をつける (ミリ秒: _ms, キロバイト: _kb)
  • アンダースコア、ダッシュ、大文字に意味を込める
  • 限界値 max_, min_を付ける
  • 範囲指定first_, last_を付ける
  • 包含/排他的範囲にはbegin_, end_を付ける
  • ブール値にはis, hasを付ける
  • get(), size()は軽量アクセサという共通認識があるので、重い処理の命名にはcompute()など重そうな単語を使う
  • イテレータは【i, j, k, iter】などで問題ないが、複数のイテレータがあるときには【配列A_i, 配列B_i, 配列C_i】のようにどのイテレータがどの配列に対応するかが瞬時にわかるようにする
レイアウト
  • 似たコードが並ぶ時は、改行位置を統一する
  • 空白を使ってカンマの位置を合わせるなど、縦の線を意識する
コメント
  • コードを読んで、すぐにわかることをコメントに書かない
  • 優れたコメントは考えを記録する
  • 既知の欠陥にコメントをつける
  1. TODO: あとで手をつける (大きな問題)
  2. todo: あとで手をつける (小さな問題)
  3. FIXME: 既知の不具合があるコード
  4. HACK: あまりキレイじゃない解決策
  5. XXX: 危険! 大きな問題がある
  • 定数にコメントをつける (定数を設定した背景)
  • 質問されそうなことを予測してコメントで回答しておく
  • ファイルの全体像を理解するためのコメントを先頭に入れる
  • 関数の全体像を理解するためのコメントを関数の先頭に入れる
  • コメントを書いた方が良いと感じた際は、変な文章でも書かないより良いので、書いとく(その後、時間があれば改善する)
  • あいまいな代名詞を避ける(2つ以上のの意味で捉えられる表現をしない)
  • よくわからない引数には、インラインコメントを使う (method(/* name: */ aoki, /* age: */ 27))
  • コメントは必要な情報を削らずに、コンパクトな表現方法でかく
制御フロー 
  • 条件式は左側に調査対象(変化する)、右側に比較対象(あまり変化しない)を書く
  • if/else条件は、肯定形を否定形より先に書く (ただし、否定形の条件でも単純で関心を引くものは先に処理する)
  • 単純な条件を先に書く(ifとelseのブロックの距離が近づくように)
  • 関心を引く条件や目立つ条件を先に書く
  • 三項演算子は基本的には使用せず、if/elseを使う
  • do/whileループは条件が最後にあって分かりにくいので、最低1回は実行されるという特徴を残したままwhileループで書き直せるときは書き直すb(ただし、本体をwhileループの前に書くということは冗長なのでしない)
  • 関数から早く返すようにする (return文は複数あって良い)
  • ネストをなるべく浅くするため、ブロックを分割する
  • 直線的に読めるコードを書くことを心がける
巨大な式
  • 説明変数, 要約変数は巨大な式を分割するのに有効
  • ド・モルガンの法則で見やすくなる条件式は変換する
  • DRY原則に従い、冗長は避ける
スコープ
  • スコープは、出来るだけ縮める
  • アクセスは、出来るだけ制限する
  • グローバル変数は、出来るだけ使わない
  • メソッドは、出来るだけstaticにする
  • javascriptグローバル変数は、var付きのローカル変数にするか、クロージャで包んでスコープを縮める
  • 変更しなくてよい変数は、定数にする
無関係の下位問題の抽出
  • 関数の中に、その関数の高レベルの目的に無関係な処理があれば、別の関数として抽出する
  • インターフェースが汚い関数は、ラッパー関数を作りインターフェースをシンプルにする
  • プロジェクト固有のコードから、汎用コードを分離する
ライブラリ
  • 標準ライブラリで何ができるのかを知り、最大活用する
  • jQueryなどデファクトスタンダードなライブラリで何ができるのかを知り、最大活用する
テスト
  • コードを完全にテストする、最も単純な入力値の組合せを選択する
  • エラーメッセージは、バグの発見や修正に役に立つものにする
  • テスト関数の名前は、テストする関数や状況を表したものにする (Test_関数名_状況)
  • テストしやすいように、コードを設計する
広告を非表示にする