🔰

【リーダブルコード】制御フローの整理整頓

2023/10/30に公開

条件やループなど制御フローがないコードは読みやすい

これはリーダブルコード第7章の冒頭の前説である。
https://www.oreilly.co.jp/books/9784873115658/
本当にこれに尽きる。自分のコードでも他人のでも複雑な制御が増えれば増えるだけ読みづらくなってしまうことはほとんどのプログラマが経験で理解することだろう。
だからといって条件やループを全く使わずにすべての処理を行うことは至難の業。
どうしたって使うのなら、なるべく単純に、誰が読んでもわかりやすいように書きたいものだ。

そんなことで、今回はリーダブルコードを読んで得た制御フローの制御(?)を自分用にいくつかメモしておこうと思う。順不同(自分が参考になった順)なので悪しからず。

1.条件式の引数の並び順

今まで当たり前のように書いていたが、意識したことはなかったルール

書き方のルール

左側 右側
調査対象(変化する) 比較対象(あまり変化しない)
if ($len > 5) // 〇
if (5 < $len) // × 右の値は可変なので

2.if/elseの並び順

if/elseにおいても深く考えずに使っていた

  • 条件は否定形よりも肯定形を使う

if ($a == $b) {
 // 第一条件
} else {
 // 第二条件
}

×if ($a != $b) {
 // 第二条件
} else {
 // 第一条件
}

単純な条件を先に書く->if/elseが画面内に表示される(見やすい)
関心のある/目立つ条件を先に書く->わかりやすさ向上

※否定形の条件でも、関心/注意を引く場合がある。
その場合は先に処理->状況によって判断基準が変わる

脳が疲れない順番にすることを意識する

3.ガード節

関数から早く返すようにする技術
処理の対象外とする条件を、関数やループの先頭に集めてreturn/continue/breakで抜ける

ガード節の例
function contains($str, $substr) {
  if ($str == null || $substr == null) return false;
  if ($substr == "") return true;
  ......続き
  }

可読性向上・ネストが減る
だが、関数の出口が複数になってしまうため使いどころを考える必要がある

4.ネストは浅めに

ネストの深さは条件の多さ

自分がどこの条件ブロックにいるのかわからなくなってしまう

だが、ネストを減らす目的はロジックをわかりやすくするためなのでネストを減らしたことで読みにくくなってしまう場合は減らすことを目的とせずわかりやすさに焦点を向ける

5.三項演算子

三項演算子によって簡潔になるときに使う

簡潔だ~
$time_str = ($hour >= 12) ? "pm" : "am";
わかりずらい…
$total_time = ($hour !== 0) ? $hour * 3600 + ($minute * 60 + $second) : $minute * 60 + $second  

省略することだけに美徳を感じてはいけない

行数を短くするよりも他の人が理解するのにかかる時間を減らす

Discussion