代码之家  ›  专栏  ›  技术社区  ›  Rupert Madden-Abbott

构造条件逻辑的最佳方法是什么[[关闭]

  •  4
  • Rupert Madden-Abbott  · 技术社区  · 15 年前

    例1

    if($condition1) {
        trigger_error("The script is now terminated");
        }
    
    if($condition2) {
        trigger_error("The script is now terminated");
        }
    
    echo "If either condition was true, we won't see this printed";
    

    例2

    if(!$condition1) {
        if(!$condition2) {
            echo "If either condition was true, we won't see this printed";
            }
        else {
            trigger_error("The script is now terminated");
            }
        }
    else {
        trigger_error("The script is now terminated");
        }
    

    例3

    if($condition1) {
        trigger_error("The script is now terminated");
        }
    else {
        if($condition2) {
            trigger_error("The script is now terminated");
            }
        else {
            echo "If either condition was true, we won't see this printed";
            }
        }
    

    例4 --改编自 Fraser's Answer

    function test($condition) { 
        if($condition) {
            trigger_error("The script is now terminated");
            }   
        }
    
    test($condition1);
    
    test($condition2);
    
    echo "If either condition was true, we won't see this printed";
    

    就我个人而言,我倾向于编写示例1中的代码。这是因为我觉得通过检查以这种方式结束脚本(或函数)的条件,我可以清楚地定义脚本执行和未执行的内容,即条件执行之前的所有内容和行之后的所有内容。这意味着当我在第147行遇到错误时,我立即知道发生了什么,帮助我更快地找到错误。此外,如果我突然意识到需要在$condition1之前测试$condition2,我可以通过简单的复制粘贴来进行更改。

    我看到了很多类似于示例2中编写的代码,但对我来说,调试起来要复杂得多。这是因为,当嵌套太大时,一个错误将在底部的某个遥远的行中触发,并与由大量嵌套代码引起的条件分离开来。另外,改变条件序列可能会更加混乱。

    您可以混合这两种样式,例如在示例3中,但这似乎使问题过于复杂,因为所有的“else”基本上都是多余的。

    我错过什么了吗?构造条件代码的最佳方法是什么?有没有比这些例子更好的方法? 是否存在一种风格优于另一种风格的具体情况?

    编辑:示例4看起来很有趣,不是我考虑过的。您还可以将错误消息作为第二个参数传入。

    另外,请记住,在检查$condition1和$condition2之间,我可能需要执行一些任意的步骤,因此任何替代方法都必须适应这一点。否则,还有更好的选择,比如if($condition1 | |$condition2)。

    10 回复  |  直到 9 年前
        1
  •  8
  •   John Kugelman Michael Hodel    15 年前

    我在办公室 例1 营地。根据经验,压痕越少越好。

    // Exit early if there are errors.
    if ($n < 0) {
        die "bad n: $n";
    }
    
    // Handle trivial cases without fuss.
    if ($n == 0) {
        return 0;
    }
    
    /* Now the meat of the function. */
    $widget->frob($n);
    foreach ($widget->blaxes as $blax) {
        checkFrobbingStatus($blax);
    }
    // ...And another 20 lines of code.
    

    当您使用if/else并将成功代码和错误代码放在并行部分时,您会使它看起来好像两个代码块相等。在现实中,边缘情况和误差条件应该被忽略。故意提前处理错误 把“重要的”代码放在else子句中,我觉得这样可以使重要代码的位置看起来更清晰。

    “这些都是先决条件。现在好东西来了。”

        2
  •  3
  •   Fraser    15 年前

    function test($condition) { 
      if($condition) {
        trigger_error("The script is now terminated");
      }   
    }
    
    test($condition1);
    
    //do stuff...
    
    test($condition2);
    
    //passed the tests
    

    编辑:我越想,函数方法是迄今为止最好的方法,因为它不必编写多次测试条件的逻辑。它还允许更大的可读性,因为很明显您正在“测试”条件(只要您给函数一个有意义的名称)。另外,正如问题edit中指出的,将其他参数传递给函数是很简单的。即

    function test($c, $msg) { 
      if($c) {
        trigger_error($msg);
      }   
    }
    
    test($condition1, "condition1 error");
    test($condition2, "condition2 error");
    
        3
  •  2
  •   Amber    15 年前

    停止一些事情,这样在10年内维护你的代码的人就不会因为修改代码而意外地破坏它。

        4
  •  1
  •   Jeffrey Blake    15 年前

    condition2 如果 condition1 是假的。在这种情况下 else elseif 效果很好。

        5
  •  1
  •   Daniel    15 年前

    我建议对任何可能有错误的部分使用try子句,并在每次发生错误时使用throw“error description”(如示例1)。

        6
  •  1
  •   Manfre    15 年前

    我更喜欢这种风格,如果条件块中的任何一个被更改了,它们就不会中断,这样它们就不会退出执行。

    if($condition1) {
        trigger_error("The script is now terminated");
    }
    if($condition2) {
        trigger_error("The script is now terminated");
    }
    
    if (!$condition1 && !$condition2) {
      echo "If either condition was true, we won't see this printed"; 
    }
    

    编辑:错过了PS,所以更新了代码以匹配完整的问题细节。

        7
  •  1
  •   Community Mohan Dere    9 年前

    我大体上同意 Amber 因为你的第一个选择看起来最清晰。这是我与自己斗争过的一件事——到目前为止,我唯一偶然发现的理由如下:

    • 第一种形式在阅读线性脚本时最为清晰,因此非常适合于简单的脚本
    • 当您需要确保整洁/清理操作时,第二种形式是最干净的

    我提到第二点是因为这是一个棘手的问题。每个脚本可能是一个更大系统的一部分,事实上,您正在注入“纾困”代码的脚本元素可能会被多个地方调用。加上一些OO,你就有了一个真正的潜在泡菜。

    随着当今一些更强大的调试和跟踪工具的出现,这越来越成为个人风格的问题,而不是必要性。你可能会考虑的另一个选择是在每个纾困区之前(可能之后)的评论中加入信息,以明确如果满足(或失败)标准,备选方案是什么。

    编辑:

    我得说 Fraser's answer 是最干净的封装。我要补充的唯一一点是,通过将对象或哈希数组传递到标准的“bail out,I'm dead”方法中,您可能会从中受益,这样您就可以修改提供给函数的信息,而无需一直更改参数列表(非常烦人……)。

    也就是说,在生产系统中,您可能需要清理处于中间状态的资源,所以要小心。

        8
  •  0
  •   Jhong    15 年前

    我也更喜欢1。

    另外,我非常喜欢在条件语句中指定变量

    例如

    if ( !$userName = $user->login() ) {
        die('could not log in');
    }
    
    echo "Welcome, $username";
    

    我通常会发现,在第一次编写代码时,我会得到一些杂乱无章的嵌套条件语句,所以通常是在第二次运行时,我会返回并清理这些内容,尽可能多地取消嵌套条件语句。

        9
  •  0
  •   Community Mohan Dere    5 年前

    例5

    if($condition1 || $condition2)
    {
        echo "If either condition was true, we won't see this printed";
    }else
    {
        trigger_error("The script is now terminated");
    }
    

    例6

    function allAreTrue()
    {
        foreach(func_get_args() as $check)
        {
           if(!$check)
           {
               return false;
           }
        }
        return true;
    }
    
    if(allAreTrue(true,true,$condition1,$condition2,false))
    {
       exit("Invalid Arguments");
    }
    
    //Continue 
    
        10
  •  -3
  •   Your Common Sense    15 年前

    构造条件逻辑的最佳方法是 遵循逻辑本身。

    如果你有依赖关系,比如说,第一个条件的失败会使其他的不必要是一回事。那么 return , goto ,嵌套条件和异常由您选择。

    如果你要在考试中做决定,说

    if (!isset($_GET['id'])) { 
      //listing part: 
    } else { 
      // form displaying part: 
    }  
    

    是的 else , elseif case 王国。

    等。

    trigger_error()

    推荐文章