シンプルな条件分岐

条件分岐の階層が深くなってくると、ソースコードはどんどん読みにくくなります。

以下の例を確認して見ましょう。

<?php

$a = mt_rand(0, 2);
$b = mt_rand(0, 2);
$c = mt_rand(0, 2);

echo 'a:' . $a . '<br>';
echo 'b:' . $b . '<br>';
echo 'c:' . $c . '<br>';

if($a < $b){
  // aはbより小さい
  if($b < $c){
    echo '一番値が大きいのはcです。';
  } else if($b === $c){
    echo '一番値が大きいのはbとcです。';
  } else {
    echo '一番値が大きいのはbです。';
  }
} else if ($a > $b){
  // aはbより大きい
  if($a < $c){
    echo '一番値が大きいのはcです。';
  } else if($a === $c){
    echo '一番値が大きいのはaとcです。';
  } else {
    echo '一番値が大きいのはaです。';
  }

} else {
  // aとbは等しい
  if($a < $c){
    echo '一番値が大きいのはcです。';
  } else if($a === $c){
    echo '3つは同じ値です';
  } else {
    echo '一番値が大きいのはaとbです。';
  }
}

上記の例では、3つの値から一番値が大きいものを見つけ出していますが、

  • 実際のパターンはa, b, c, ab, bc, cd, abcの7通りであるが、分岐は9つになっている
  • if文のネスト(入れ子)が利用されており、現在自分がどの枝にいるのかを覚えておかないといけない

という問題点があります。

階層を浅くするためには様々な方法論がありますが、まずは

  • 分岐のゴールから考える

というポイントを押さえておくとよいでしょう。

では、このポイントを先ほどのケースに適用します。 今回の場合は

  1. aが一番大きい
  2. bが一番大きい
  3. cが一番大きい
  4. a,bが一番大きい
  5. b,cが一番大きい
  6. a,cが一番大きい
  7. 全て等しい

という7つのパターンがあるので、それぞれに対応するif文を作成します。

<?php

$a = mt_rand(0, 2);
$b = mt_rand(0, 2);
$c = mt_rand(0, 2);

echo 'a:' . $a . '<br>';
echo 'b:' . $b . '<br>';
echo 'c:' . $c . '<br>';

if($b < $a && $c < $a){
  echo '一番値が大きいのはaです。';
} else if($a < $b && $c < $b){
  echo '一番値が大きいのはbです。';
} else if($a < $c && $b < $c){
  echo '一番値が大きいのはcです。';
} else if($a === $b && $c < $a){
  echo '一番値が大きいのはaとbです。';
} else if($b === $c && $a < $b){
  echo '一番値が大きいのはbとcです。';
} else if($a === $c && $b < $a){
  echo '一番値が大きいのはaとcです。';
} else {
  echo '3つは同じ値です';
}

このように書き換えることで、

  • 条件と結果の対応が明確になる
  • if文のネストが解消される

というメリットが生まれます。

繰り返しになりますが、

  • 条件分岐を作成するときには、条件のパターンではなく、結果のパターンから考える(ゴールから考える)

ということを意識しましょう。

なお、関数の内部では、条件を満たさない場合のケースについては早々にreturnする「ガード節」というテクニックがあります。こちらも非常に便利なテクニックですので、検索等で調べておくことをお勧めします。

results matching ""

    No results matching ""