480
378

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

初心者向け。覚えておきたい 「早期リターン」という書き方。

Last updated at Posted at 2018-03-10

最初に

何においてもそうですが、どのような場合にも当てはまるやり方というものではありません。
ケースによっては逆に読みづらくバグを生みやすくなる場合もあります。
これから紹介するものは、コードを最適化するとき、読みやすくするときの手段の一つとして理解していただければと思います。

早期リターンとは

処理の対象外とする条件を、関数やループの先頭に集めて 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文の最後まで読む必要がある点を考慮すると早期リターンのほうがより良いコードだと考えます。

480
378
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
480
378

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?