複数のネストされたIFステートメントを使用するにはそれが悪いアイデアの場合だと思います。
例えば:
function change_password($email, $password, $new_password, $confirm_new_password)
{
if($email && $password && $new_password && $confirm_new_password)
{
if($new_password == $confirm_new_password)
{
if(login($email, $password))
{
if(set_password($email, $new_password))
{
return TRUE;
}
}
}
}
}
この関数は次のように使用されます:
if(!change_password($email, $password, $new_password, $confirm_new_password)
{
echo 'The form was not filled in correctly!';
exit;
}
私はこのようにすべての関数を呼び出しますが、私のコーディングスタイルに問題があるのではないかと思っています。私がこの設計に従っていると、私が書くすべての関数がIFでネストされ、すべての段階でエラーがあるかどうかをチェックするので、私は疑問を抱いています。これは他の人がすることですか?
このように書かれた他の多くのスクリプトは見られません。ネストされたIFが三角形の形をしていて、真ん中に望ましい結果しかありません。途中に達していない場合は、何かが台無しになっています。
これは良い関数構造ですか?
ネストを深くしすぎることは、一般的に悪い考えです。スパゲッティロジックであり、理解するのが困難です。検証の各ステップは、前のステージが成功したかどうかに依存するため、ネストしないでください。ステージが失敗した場合はベイルアウトしてください。
function change_password(blah blah blah) {
if (!$condition1) {
return false;
}
if (!$condition2) {
return false;
}
etc....
// got here, must have succeeded
return true;
}
これにより、ロジックシーケンスが明確にわかります。
私はそれが間違いなく読みやすく、ただ1つのif
ステートメントを使用するのと比較して簡単に理解できると思います
if (blah and blah and blah and blah and blah and blah and blah) {}
しかし、私はまだこのようにしたいと思います-インデントが多すぎると、少し迷惑になります:
function change_password($email, $password, $new_password, $confirm_new_password)
{
if (!$email || !$password || !$new_password || !$confirm_new_password) return false;
if ($new_password != $confirm_new_password) return false;
if (!login($email, $password)) return false;
if (!set_password($email, $new_password)) return false;
return true;
}
順序を変更することにより、余分な比較を行わないようにすることができるため、それらをネストすることは良いことです。今やっていることは良いように見えますが、代わりに次のように記述した場合、関数の効率は低下します。
function change_password($email, $password, $new_password, $confirm_new_password)
{
if($new_password == $confirm_new_password && $email && $password && $new_password && $confirm_new_password)
{
if(login($email, $password))
{
if(set_password($email, $new_password))
{
return TRUE;
}
}
}
}
$ new_password == $ confirm_new_passwordがtrueであるが、$ emailが空の場合、追加の比較が行われます。
他の人が言ったように、すべてを入れ子にせずにこれを回避する他の方法があります。これは機能的に同等です。