Shigeaki Matsumura

CEO of Backflip180, LLC.

リーダブルコード

理解しやすいコード

  • コードは理解しやすくなければならない
  • コードは他人が最短時間で理解できるように書かなければならない

表面上の改善

名前に情報を詰め込む

  • 明確な単語を選ぶ
  • tmpやretvalなどの汎用的な名前を避ける(あるいは使う状況を選ぶ)
  • 具体的な名前を使って物事を詳細に説明する
  • 接尾辞や接頭辞を使って情報を追加する
  • スコープの大きな変数には長い名前をつける
  • 大文字やアンダースコアなどに意味を含める

誤解されない名前

  • 最善の名前は誤解されない名前
  • get()やsize()には軽量なメソッドが期待されている

美しさ

  • 複数のコードブロックで同じようなことをしていたら、シルエットも同じようなものにする
  • コードの「列」を整列すれば概要が把握しやすくなる
  • ある場所でA,B,Cのように並んでいたものを、他の場所でB,C,Aのように並べてはいけない。意味のある順番を選んで常にその順序を守る
  • 空行を使って大きなブロックを論理的な「段落」に分ける

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

コメントをすべきでは「ない」こと

  • コードからすぐに抽出できること
  • ひどいコードを補う」「補助的なコメント」。コメントを書くのではなくコードを修正する

記録すべき自分の考え

  • なぜコードが他のやり方ではなくこうなっているのか
  • コードの欠陥をTODO:やXXX:などの記法を使って示す
  • 定数の値にまつわる「背景」

読み手の立場になって考える

  • コードを読んだ人が「え?」と思うところを予想してコメントをつける
  • 平均的な読み手が驚くような動作は文書化しておく
  • ファイルやクラスには「全体像」のコメントを書く
  • 読み手が細部に囚われないように、コードブロックにコメントをつけて概要をまとめる

コメントは正確で簡潔に

  • 複数のものをさす可能性のある代名詞を避ける
  • 関数の動作はできるだけ正確に説明する
  • コメントに含める入出力の実例を慎重に選ぶ
  • コードの意図は詳細レベルではなく高レベルで記述する
  • よくわからない引数にはインラインコメントを使う
  • 多くの意味が詰め込まれた言葉や表現を使って、コメントを簡潔に保つ

ループとロジックの単純化

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

  • 条件式の引数の並び順
  • if/elseブロックの並び順
  • 三項演算子
  • do/whileループを避ける
  • 関数から早く返す
  • 悪名高きgoto
  • ネストを浅くする

巨大な式を分割する

説明変数を導入する

  • 巨大な式を分割できる
  • 簡潔な名前で式を説明することでコードを文書化できる
  • コードの主要な概念を読み手が認識しやすくなる

変数と読みやすさ

  • 邪魔な変数を削除する
  • 変数のスコープをできるだけ小さくする
  • 一度だけ書き込む変数を使う

コードの再構成

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

  • 関数やコードブロックを見て「このコードの高レベルの目標は何か?」と自問する
  • コードの各行に対して「高レベルの目標に直接的に効果があるか?あるいは無関係の下位問題を解決しているか?」と自問する
  • 無関係の下位問題を解決しているコードが相当量あればそれらを抽出して別の関数にする

一度に1つのことを

  • コードは1つずつタスクを行うようにしなければならない

コードに思いを込める

  • コードの動作を簡単な言葉で同僚にもわるように説明する
  • その説明の中で使っているキーワードやフレーズに注目する
  • その説明に合わせてコードを書く

短いコードを書く

  • 不必要な機能をプロダクトから削除する。過剰な機能は持たせない
  • 最も簡単に問題を解決できるような要求を考える
  • 定期的にすべてのAPIを読んで標準ライブラリに慣れ親しんでおく

選抜テーマ

テストと読みやさ

「分/時間カウンタ」を設計・実装する

あわせて読みたい