はじめに
お疲れ様です。
新卒エンジニアです。
最近「動いてるけど読みづらいコード」を何度も書いてしまって、レビューで止まることが増えました。
そんなときに先輩から言われたのが、
😼 「リーダブルコード、今読むと効くよ(意訳)」
学生のときに軽く読んでたけど、「ふーん」で終わってたあの本ですが、
久々に真面目に読んでみたら、今の自分に効きすぎたのでわかりやすく、一部抜粋してまとめます。
結論:コードは「動く」基準ではなく、「読まれる」基準で書く
リーダブルコードが繰り返し伝えてるのはこれです。
「コードは人間のために書くもの」
業務でコードを書くというのは、
「他人が保守・レビュー・改修する前提」で組む必要がある、ということ。
この意識、学生の時にはなかったものでした。
実際に刺さったポイント3選
1. 名前で9割決まっちゃう
× 悪い例
$a = 20;
$b = getUserAge($user);
if ($a < $b) {
echo "OK";
}
◎ 良い例
$minimumAge = 20;
$userCurrentAge = getUserAge($user);
if ($userCurrentAge >= $minimumAge) {
echo "OK";
}
マジで当たり前ですが、「何をしてるのか」が一目でわかる名前にするだけで、読み手の理解速度が段違いに上がります。
ただ、「何をしているのか」が一目でわかる名前をつけるのがまた難しいです。
2. 使おう早期リターン(+ 循環的複雑度)
× ネスト地獄
(読み手の集中力が死ぬ)
(なんならレビューを通らない)
if ($user !== null) {
if ($user->isAdmin()) {
if ($user->hasPermission('edit')) {
// 処理
}
}
}
◎ 早期リターンでスッキリさせる
if ($user === null) return;
if (!$user->isAdmin()) return;
if (!$user->hasPermission('edit')) return;
// 処理
ネストが深くなると 循環的複雑度(Cyclomatic Complexity) が上がります。
レビューが通りません。この複雑度に何度も苦しめられてます。
tips : 循環的複雑度とは?
細かい計算方法は複雑なのですが、ざっくり以下の様に算出できます。
複雑度 = 分岐の数 + 1
例えば以下のコード↓↓↓
if ($a > 0) {
if ($b > 0) {
return true;
}
}
return false;
これは if
が2つ → 複雑度 = 2 + 1 = 3
複雑度が高いコードは:
- 多くのテストケースが必要になる
- バグの温床と化す
- 何より読みにくい
図解:ネスト vs 早期リターン
// ネスト
┌─ if A
│ └─ if B
│ └─ if C
│ └─ 処理
// 早期リターン
if !A return
if !B return
if !C return
処理
圧倒的に早期リターンの方が見やすい!!
3. コメントは「なぜ」を書く
× 意味のないコメント
// ユーザー情報を取得
$user = getUserById($id);
→ コード見たらわかるやん
◎ 良いコメント
// キャッシュが信用できないときはDBから再取得する
$user = getUserById($id);
→ 「何でこれやってるの?」がここみるだけでわかる。
コメントは コードを書いた人間の思考プロセス を書く場所です。
単なる処理の説明は不要!コードを見たらわかるからね〜
まとめ:リーダブルコードとは「思いやりの心」
最初に言われた「コードは人間のために書くもの」という言葉、読んでみてかじりくらいは理解できたと思います。
◎ 名前で伝える
◎ ネストを減らす(複雑度を下げる)
◎ コメントでは意図を補足する
これらを意識することで
“初見でスラスラ読めるコード” = 良いコードができあがります。
おわりに
コードは「動けばいい」じゃない。
「伝わるかどうか」= クオリティの差です。
心を込めて、”良い”コードを書いていきましょう。
参考:
『リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック』
著:Dustin Boswell, Trevor Foucher
出版社:オライリー・ジャパン