PHPのif-elseステートメントの数を減らす方法は?
-
05-07-2019 - |
質問
多くのif-elseステートメント、特にネストされたif elseステートメントがあることがわかりました。これらのステートメントによりコードが読みにくくなります。 PHPのif elseステートメントの数を減らす方法は?
私のヒントは次のとおりです。 1.適切な場合はswitchステートメントを使用します。 2.可能な場合はexit()ステートメントを使用します。 3.実行可能な場合は3項ステートメントを使用します。
if elseステートメント、特にネストされたif-elseステートメントを減らすことができる他のヒントはありますか?
解決
コードを小さな作業単位にリファクタリングします。条件付きロジックが多すぎるとコード臭がし、通常、関数をリファクタリングする必要があることを示します。
他のヒント
「早期復帰」を使用してみてください可能であれば、ネストの深さを減らすために。ブール式の評価を使用してみてください。
例:
function foo($param)
{
$ret = false;
if(userIsLoggedIn()) {
if(is_array($param)) {
if($param['count'] > 0) {
$ret = true;
}
else {
$ret = false;
}
}
}
return $ret;
}
次のように書き換えることができます:
function foo($param)
{
if(!userIsLoggedIn()) return false;
if(!is_array($param)) return false;
return $param['count'] > 0;
}
Karnaughマッピングと呼ばれる、多くの if
条件をリファクタリングおよび簡略化する公式の学術的方法があります。
複数のテスト条件を取り、必要なすべてのケースをカバーする単純化された if
ステートメントの作成を支援しようとします。
wikiの詳細については、こちらをご覧ください。
三項演算子を使用し、コードをリファクタリングし、必要なif elseステートメントをすべて実行する関数またはクラスを作成します。
ポリモーフィズムも同様に少数を取り除くことができますが、PHPのif / elseを減らすのは実装が難しく、型安全ではありません...
私は、絶えず進化するビジネスロジックに満ちた1日おきに変更する必要のある多くのコードに取り組んでいます。修正に追いつくのに確かに役立つ2つのヒントは、elseステートメントをすべて避け、できるだけ早くreturn / exitすることです。深く入れ子にしないでください->サブルーチン/関数を作成します。
すべてのelseステートメントを否定ifステートメントに置き換えると、コードが上から下に読みやすくなります(条件とコードブロックの近く):
# business logic block
if ( $condition ) {
# do something
# code code code
} else {
# code code code
return;
}
# refactored:
if ( ! $contition ) {
# code code code
return;
}
if ( $condition ) {
# code code code
}
次に、できるだけ早く戻り/終了します。もちろん私の意見ですが、サブルーチンの結果を決定したら、特にコードを最初から最後まで読みたい場合は、追加の条件/テストを実行することには意味がありません。あいまいさをすべて削除すると、物事が簡単になります。
結論として、特にBLの長いリストではelseの使用を避けたいと思います。結果がわかったらすぐに戻ってください。ネストレベルが2を超える場合、サブルーチン/関数を作成します。