web-dev-qa-db-ja.com

PHP-ネストされたIFステートメント

複数のネストされた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が三角形の形をしていて、真ん中に望ましい結果しかありません。途中に達していない場合は、何かが台無しになっています。

これは良い関数構造ですか?

13
Kausheel

ネストを深くしすぎることは、一般的に悪い考えです。スパゲッティロジックであり、理解するのが困難です。検証の各ステップは、前のステージが成功したかどうかに依存するため、ネストしないでください。ステージが失敗した場合はベイルアウトしてください。

function change_password(blah blah blah) {
   if (!$condition1) {
      return false;
   }
   if (!$condition2) {
      return false;
   }
   etc....


   // got here, must have succeeded
   return true;
}

これにより、ロジックシーケンスが明確にわかります。

33
Marc B

私はそれが間違いなく読みやすく、ただ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;
}
3

順序を変更することにより、余分な比較を行わないようにすることができるため、それらをネストすることは良いことです。今やっていることは良いように見えますが、代わりに次のように記述した場合、関数の効率は低下します。

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が空の場合、追加の比較が行われます。

他の人が言ったように、すべてを入れ子にせずにこれを回避する他の方法があります。これは機能的に同等です。

0
Brett Thomas