LoginSignup
362

More than 3 years have passed since last update.

posted at

updated at

初心者向け。覚えておきたい 「ガード節」という書き方。

最初に

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

ガード節とは

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

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
What you can do with signing up
362