Help us understand the problem. What is going on with this article?

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

最初に

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

ガード節とは

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした