シンプルな条件分岐
条件分岐の階層が深くなってくると、ソースコードはどんどん読みにくくなります。
以下の例を確認して見ましょう。
<?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文のネスト(入れ子)が利用されており、現在自分がどの枝にいるのかを覚えておかないといけない
という問題点があります。
階層を浅くするためには様々な方法論がありますが、まずは
- 分岐のゴールから考える
というポイントを押さえておくとよいでしょう。
では、このポイントを先ほどのケースに適用します。 今回の場合は
- aが一番大きい
- bが一番大きい
- cが一番大きい
- a,bが一番大きい
- b,cが一番大きい
- a,cが一番大きい
- 全て等しい
という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する「ガード節」というテクニックがあります。こちらも非常に便利なテクニックですので、検索等で調べておくことをお勧めします。