リーダブルコード〜表面上の改善〜

名前に情報を詰め込む

明確な単語を選ぶ
  • getはあまり明確でない。
    • GetPage(url)ではどこからとってきたのかわからないのでインターネットからとってくるならFetchPageやDownloadPageにする
  • size
    • HeightやNumNodes、MemoryBytesのように具体的にする
  • シソーラスを使ってもっといい名前がないかさがしてみよう
tmpやretvalなどの汎用的な名前を避ける
  • tmp_fileのようにする
  • 一時的な保存でなければtmp自体使用禁止
  • ループイテレータ
    • i、j、kではわかりにくいときがあるので、culb_i、members_i、users_iのようにする
    • もっと簡潔にci、mi、uiでもよい
名前に情報を追加する
  • idのフォーマットが大切ならidでなくhex_idに
  • 単位がミリ秒ならstart_ms
  • その他の例
    • password→palaintext_password(処理を剃る前に暗号化が必要なことがわかる)
    • comment→unescaped_comment(表示するまえにエスケープする必要あり)
    • html→html_utf8
    • data→data_urlenc
  • すべてに追加するのではなくバグになりそうなとこにだけ追加
スコープの大きな変数には長い名前をつける
  • 短い名前はスコープが数行の変数につけるべき
名前のフォーマットで情報を伝える
  • メンバ変数なら末尾にアンダースコアを加えるなど(例:offset_)

誤解されない名前

例:filter()
  • 選択するならselect、除外ならexclude
例:Clip(text, length)
  • 最後からlength文字削除する場合remove、最大length文字切り詰める場合truncate
  • lengthもmax_lengthに
    • バイト数か文字数か単語数かわからないのでmax_charsにするべき
範囲を指定するときはfirstとlastを使う
包含/排他的範囲にはbeginとendを使う(イベントの開始時刻、終了時刻など)
ブール値の名前
  • is、has、can、shouldなどをつけることが多い
ユーザーの期待に合わせる
  • 平均値を取得するメソッド名にgetMeanはよくない
    • getMeanがその場で平均値を計算する実装でコストが高かったとしても、ユーザーはgetMeanを呼び出してしまう
    • computeMeanのほうがよい
    • list.size()もcountSizeやcountElementsのほうがよい

美しさ

本に載ってるコード例を見よ

貫性のある簡潔な改行位置
メソッドを使った整列
縦の線をまっすぐに
一貫性を意味のある並び
    • inputフィールドと同じ並び順にする
    • 最重要なものから重要度順
    • アルファベット順
宣言をブロックにまとめる

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

すべきではないこと
  • コードを読んですぐわかることをコメントに書かない
  • 名前がひどければコメントをつけずに名前を変えろ
自分の考えを記録する
    • 「このクラスは汚くなってきている。サブクラスResourceNodeを作って整理したほうがいいかもしれない」
  • コードの欠陥にコメントをつける
    • TODO: (あとでてをつける)
    • FIXME: (既知の不具合があるコード)
    • HACK: (あまりキレイじゃない解決策)
    • XXX: (危険!大きな問題がある)
定数にコメントをつける
  • 値を設定した理由などをかく
読み手の立場になって考える
  • コードを読んだ人が「え?」と思うところにコメント
  • ファイルやクラスには全体像のコメントを書く
  • コードブロックに概要を

コメントは正確で簡潔に

代名詞は避ける
関数の動作を正確に記述
入出力のコーナーケースに実例を使う
コードの意図をかく
  • 「listを逆順にイテレートする」ではなく、「値段の高い順に表示する」に