15

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

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

4

3 に答える 3

37

入れ子を深くしすぎることは一般的に悪い考えです-それはスパゲッティロジックであり、従うのは難しいです。各検証手順は、前のステージが成功したかどうかに依存するため、ネストしないでください。ステージが失敗したときにベイルアウトするだけです。

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


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

これにより、論理シーケンスが何であるかが明確になります。

于 2012-08-07T04:31:53.583 に答える
4

私はそれが間違いなく読みやすく、次のifような1つのステートメントを使用する場合と比較して簡単に理解できると思います

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;
}
于 2012-08-07T04:34:15.687 に答える
0

順序を変更することで余分な比較を回避できる場合があるため、ネストすることをお勧めします。現在行っていることは良さそうですが、代わりに次のように記述した場合、関数の効率は低下します。

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

他の人が言っているように、すべてをネストせずにこれを実行する他の方法があります。これは機能的に同等です。

于 2012-08-07T04:36:31.207 に答える