最初に
何においてもそうですが、どのような場合にも当てはまるやり方というものではありません。
ケースによっては逆に読みづらくバグを生みやすくなる場合もあります。
これから紹介するものは、コードを最適化するとき、読みやすくするときの手段の一つとして理解していただければと思います。
早期リターンとは
処理の対象外とする条件を、関数やループの先頭に集めて return や continue/break で抜ける方法です。
ネストを減らし正常系の処理がわかりやすくなるメリットがあります。
具体例
まずは悪い例です。
function check($a, $b, $C) {
if (is_null($a)) {
$result = 0;
} else {
if (is_null($b)) {
$result = 0;
} else {
if (is_null($c)) {
$result = 0;
} else {
$result = 1;
}
}
}
return $result;
}
$aがNULLの場合は返却値に0を入れ、そうでなければ$bの値を確認する。その$bがNULLの場合は..... と思考のままにプログラムを行うとこのような形になりがちです。正常系コードがネストの深い位置にあり、他の人が処理を追う時に苦労しますね。
これを「早期リターン」を使い書き換えた場合、以下のようになります。
function check($a, $b, $c) {
if (is_null($a)) return 0;
if (is_null($b)) return 0;
if (is_null($c)) return 0;
return 1;
}
関数の先頭に異常系となる条件を集め、即座にreturnしています。正常系と異常系が明確になっていますね。
なお、forループで使う場合は以下のように Continue をつかいます。
$result = PDOStatement::fetchAll();
foreach ($result as $rows) {
if ($rows['kind'] != 2) continue; // XXXの場合
// 正常系の処理
}
これを早期リターンを使わずに書いた場合は以下のようになります。
$result = PDOStatement::fetchAll();
foreach ($result as $row) {
if ($row['kind'] == 2) {
// 正常系の処理
}
}
悪くはありませんが、ネストが増える事と、kindが0と1の場合の処理を追うのにif文の最後まで読む必要がある点を考慮すると早期リターンのほうがより良いコードだと考えます。