kawa-tの日記: 余計なelseは書かない 6
日記 by
kawa-t
if (condition1) {
...
return v;
} else if (condition2) {
...
return w;
} else if (condition3) {
...
return x;
} else if (condition4) {
...
return y;
} else {
...
return z;
}
と書くよりも
if (condition1) {
...
return v;
}
if (condition2) {
...
return w;
}
if (condition3) {
...
return x;
}
if (condition4) {
...
return y;
}
...
return z;
と書いた方が、各分岐の後に必ずreturnがあるのが分かりやすいということに、今さらながら気が付いた。
特にネストしていた場合、elseを使っていると、閉じ括弧が連続してしまうから、それぞれのネストのレベルで必ずreturnするのかをチェックするのが面倒だが、elseを使わなければ、閉じ括弧が連続しないので、それぞれのブロックの末尾にreturnがあることだけを確認すればいい。
逆に言えば、returnがないことも分かりやすくなるので、複雑な処理を簡潔に書きやすくなる。
stateパターン良いですよ (スコア:0)
私は,余計なif文は書かない,という方針です.
具体的には,
単純な処理なら switch/case 文を使う
複雑な場合は stateパターン を使う
ようにしています
Re:stateパターン良いですよ (スコア:1)
コメントありがとうございます。
ただ、次元としては、「switch文の分岐がreturnで終了する場合でもbreakを付けるべきか」という議論とほぼ同等で、if文そのものを使わないようにしようというのは、また別の次元の話です。
良し悪し... (スコア:0)
誤って、途中の returnを消さない前提なら問題ないですね。
昔なら、コメントを if 文毎に書きたくない(いや、書きたい)とかで
else で連ねたものですが、というか、そのチームのコード規約に殉じたというか。
ぱっと見、疑問を持たなくて済むコードなら何でもいいかと。
Re: (スコア:0)
前者はreturnを忘れた場合returnが無いパスがあると警告が出てelseを忘れた場合は動作が変わらない
後者はreturnを忘れた場合動作が変わる
明らかに前者が安全
Re:良し悪し... (スコア:1)
コメントありがとうございます。
if文がネストしていない場合は確かにそうなんですが、ネストしていて外側に続きの処理があった場合には、returnを書き忘れたとしても警告を出してくれません。ネストしていた場合でも、ブロックの最後に必ずreturnが来ることで、そのブロックの処理には続きがないことを明確にすることが狙いです。
処理が同じグループかどうかで変えたい (スコア:0)
個人的には、処理が同じグループかどうかで書き方を変えたい。ようするに、
「if と else if, else は同じ判定の別バージョンである」 → 前者
「if と else if, else はたまたま一つの文として書けるが判定対象は異なる」 → 後者
としたい。例をあげると
if (empty($input)) {
return false;
} else if ($input === 'invalid') {
return false;
}
なら、両方とも同じバリデートの判定なので一つにまとめてもよい。
if (empty($input)) {
return false;
}
if ($input != ADMIN_ID) {
return false;
}
はバリデートと権限チェックかなんかの別の判定なので2つに分けたい。