『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』は、読みやすく、理解しやすいコードを書くための具体的な指針を示した書籍です。以下に、その主要なポイントをまとめます。
1. 名前に情報を詰め込む
変数をはじめとする名前は、その役割や内容を明確に伝えるべきです。
-
汎用的な単語ではなく、明確な単語を使う:
汎用的な単語 代替案の例 get
fetch
,download
,retrieve
size
height
,numNodes
,memoryBytes
stop
kill
,pause
,halt
send
deliver
,dispatch
,announce
,distribute
,route
find
search
,extract
,locate
,recover
start
launch
,create
,begin
,open
make
create
,setUp
,build
,generate
,compose
,add
,new
-
抽象的な名前ではなく、具体的な名前:
tmp
は、生存期間が非常に短く、一時的な保管が最も重要な変数にのみ使用します。- イテレータ変数には、安易に
i
,j
,k
を使うのではなく、club_idx
,member_idx
,user_idx
のように、何を表すインデックスなのかがわかるように命名します。 - より直接的で、明確な表現にします。
// 悪い例 ServerCanStart // 良い例 CanListenOnPort
-
接尾辞や接頭辞で情報を追加する:
delay
→delay_secs
(単位)size
→size_mb
(単位)limit
→max_kbp
(限界値)angle
→degree_cw
(単位と方向)html
→html_utf8
(エンコーディング)
-
名前の長さを適切に決める:
- 長すぎる名前は短縮を検討します。
FormatString
→FormatStr
ConvertToString
→ToString
- 短すぎる名前は長くします。
- 長すぎる名前は短縮を検討します。
-
名前のフォーマットで情報を伝える:
- 大文字やアンダースコアなどの命名規則に意味を含ませる(例: 定数にはすべて大文字とアンダースコアを使用する)。
2. 誤解されない名前を使う
名前は、読み手が誤解しないように慎重に選びます。
-
多義語に気をつける:
filter
→select
(含める),exclude
(除外する)clip
→remove
(削除する),truncate
(切り詰める)
-
限界値を示す:
- 最大値には
max
やlimit
を、最小値にはmin
を使う。 - 例:
max_users
,min_length
- 最大値には
-
範囲を示す:
- 包含的な範囲には
first
とlast
を使う。 - 排他的な範囲には
begin
とend
を使う。
- 包含的な範囲には
-
ブール値の変数名:
- ブール値の変数には、
is_
,has_
,can_
,should_
などの接頭辞をつけ、真偽が明確にわかるようにします。 - 例:
is_valid
,has_permission
,can_read
,should_process
- ブール値の変数には、
-
ユーザーの期待に合わせる:
get
メソッドは、通常、軽量で副作用のないアクセサ(ゲッター)であるという認識があります。計算コストが高い処理や副作用がある場合は、compute
やcalculate
などの動詞を使います。size
メソッドは、通常 $O(1)$ の計算量で返されると期待されます。計算量が多い場合は、count
やcalculate_size
など、計算を伴うことを示唆する名前にします。
3. 美しさ(コードのフォーマットとレイアウト)
コードの見た目は、読みやすさに大きく影響します。
- 読み手が慣れているパターンと一貫性のあるレイアウトを使う:
- プロジェクトや言語のコーディング規約に従います。
- 似ているコードは似ているように見せる:
- 構造が似ているコードブロックは、同じようなフォーマットで記述します。
- 関連するコードはまとめてブロックにする:
- 論理的に関連する行は、空行などで区切ってグループ化します。
- 一貫性のある改行:
- 改行のルールを統一し、視覚的なノーズを減らします。
- 縦の線を揃える:
- 代入演算子や引数などを縦に揃えることで、コードの構造が把握しやすくなります。
details = request.POST.get('detail') location = request.POST.get('location') phone = request.POST.get('phone')
- 意味のある並びにする:
- 変数宣言や関数呼び出しの引数などは、論理的な順序で並べます。
- 宣言をブロックにまとめる:
- 関連する変数宣言は、コードブロックの先頭など、一箇所にまとめます。
4. コメント
コメントは、コードだけでは伝わりにくい「なぜ(Why)」や「何が(What)」を補足するために書きます。
- コードからすぐにわかることをコメントに書かない:
- 例:
i = 0; // iを0に初期化
のようなコメントは不要です。
- 例:
- 定数にコメントをつける:
- マジックナンバー(意味不明な数値)ではなく、名前付き定数を使用し、その定数の意味をコメントで補足します。
- 代名詞の使用を避ける:
- 「それ」「これ」のような代名詞は避け、具体的な名詞を使います。
- 関数の動作は正確に説明する:
- 関数の目的、引数、戻り値、副作用、例外などを簡潔かつ正確に記述します。
- よくわからない引数にはインラインコメント:
- 関数呼び出しの際に、引数の意味が分かりにくい場合は、その場でコメントを追加します。
参考文献
- Dustin Boswell, Trevor Foucher, 『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』, オライリージャパン (2012)