格式化具有多个条件的if语句的最佳方法

时间:2008-10-31 10:15:18

标签: language-agnostic if-statement

如果你想根据两个或多个条件执行某些代码,这是格式化if语句的最佳方法吗?

第一个例子: -

if(ConditionOne && ConditionTwo && ConditionThree)
{
   Code to execute
}

第二个例子: -

if(ConditionOne)
{
   if(ConditionTwo )
   {
     if(ConditionThree)
     {
       Code to execute
     }
   }
}

最容易理解和阅读,请记住每个条件可能是一个很长的函数名称。

11 个答案:

答案 0 :(得分:120)

我更喜欢选项A

bool a, b, c;

if( a && b && c )
{
   //This is neat & readable
}

如果你确实有特别长的变量/方法条件,你可以直接断开它们

if( VeryLongConditionMethod(a) &&
    VeryLongConditionMethod(b) &&
    VeryLongConditionMethod(c))
{
   //This is still readable
}

如果它们更复杂,那么我会考虑在if语句之外单独执行条件方法

bool aa = FirstVeryLongConditionMethod(a) && SecondVeryLongConditionMethod(a);
bool bb = FirstVeryLongConditionMethod(b) && SecondVeryLongConditionMethod(b);
bool cc = FirstVeryLongConditionMethod(c) && SecondVeryLongConditionMethod(c);

if( aa && bb && cc)
{
   //This is again neat & readable
   //although you probably need to sanity check your method names ;)
}

恕我直言选项'B'的唯一原因是,如果您为每个条件运行单独的else函数。

e.g。

if( a )
{
    if( b )
    {
    }
    else
    {
        //Do Something Else B
    }
}
else
{
   //Do Something Else A
}

答案 1 :(得分:28)

其他答案解释了为什么第一种选择通常是最好的。但是如果你有多个条件,可以考虑创建一个单独的函数(或属性)来执行选项1中的条件检查。这使代码更容易阅读,至少在你使用好的方法名时。

if(MyChecksAreOk()) { Code to execute }

...

private bool MyChecksAreOk()
{ 
    return ConditionOne && ConditionTwo && ConditionThree;
}

条件只依赖于局部范围变量,您可以使新函数静态并传递您需要的所有内容。如果有混合,请传入当地的东西。

答案 2 :(得分:9)

第一个例子更“易读”。

实际上,在我看来,只要你必须添加一些“其他逻辑”,你就应该只使用第二个,但是对于一个简单的条件,使用第一个味道。如果你担心条件很长,你总是可以使用下一个语法:

if(ConditionOneThatIsTooLongAndProbablyWillUseAlmostOneLine
                 && ConditionTwoThatIsLongAsWell
                 && ConditionThreeThatAlsoIsLong) { 
     //Code to execute 
}

祝你好运!

答案 3 :(得分:9)

这个问题被提出并且到目前为止已得到回答,好像该决定应该完全基于“句法”理由。

我会说正确的答案是你如何在if,应该中布置一些条件来依赖于“语义”。因此,条件应该根据“概念上”的内容进行分解和分组。

如果两个测试确实是同一枚硬币的两面,例如。如果(x> 0)&amp;&amp; (x <= 100)然后将它们放在同一行上。如果另一个条件在概念上远远更远,例如。 user.hasPermission(Admin())然后把它放在它自己的行

例如

if user.hasPermission(Admin()) {
   if (x >= 0) && (x < 100) {
      // do something
   }
}

答案 4 :(得分:5)

    if (   ( single conditional expression A )
        && ( single conditional expression B )
        && ( single conditional expression C )
       )
    {
       opAllABC();
    }
    else
    {
       opNoneABC();
    }

Formatting a multiple conditional expressions in an if-else statement this way:
1) allows for enhanced readability:
    a) all binary logical operations {&&, ||} in the expression shown
       first
    b) both conditional operands of each binary operation are obvious
       because they align vertically
    c) nested logical expressions operations are made obvious using
       indentation, just like nesting statements inside clause
2) requires explicit parenthesis (not rely on operator precedence rules)
    a) this avoids a common static analysis errors
3) allows for easier debugging
    a) disable individual single conditional tests with just a //
    b) set a break point just before or after any individual test
    c) e.g. ...

    // disable any single conditional test with just a pre-pended '//'
    // set a break point before any individual test
    // syntax '(1 &&' and '(0 ||' usually never creates any real code
    if (   1
        && ( single conditional expression A )
        && ( single conditional expression B )
        && (   0
            || ( single conditional expression C )
            || ( single conditional expression D )
           )
       )
    {
       ... ;
    }

    else
    {
       ... ;
    }

答案 5 :(得分:4)

第二个是Arrow Anti-pattern的典型例子所以我要避免它......

如果您的条件太长,请将它们提取到方法/属性中。

答案 6 :(得分:3)

第一个更容易,因为,如果你从左到右阅读,你得到: “如果有什么东西和某些东西,那就是那么多”,这是一个容易理解的句子。第二个例子是“如果有什么东西,那么如果那么其他那么那么”,这是笨拙的。

另外,考虑一下你是否想在你的子句中使用一些OR - 你会如何在第二种风格中使用OR?

答案 7 :(得分:2)

我认为switch...case语句是在这种情况下编写整洁代码的最佳方式,如果编程语言支持它的话。

switch (//variable or Boolean) {
  case //Condition A:
  case //Condition B:
  case //Condition C:
    //Code to execute;
}

答案 8 :(得分:0)

在Perl中你可以这样做:

{
  ( VeryLongCondition_1 ) or last;
  ( VeryLongCondition_2 ) or last;
  ( VeryLongCondition_3 ) or last;
  ( VeryLongCondition_4 ) or last;
  ( VeryLongCondition_5 ) or last;
  ( VeryLongCondition_6 ) or last;

  # Guarded code goes here
}

如果任何条件失败,它将在块之后继续。如果要在块之后定义要保留的任何变量,则需要在块之前定义它们。

答案 9 :(得分:-1)

我已经面临这个困境很长时间了,但我仍然找不到合适的解决方案。我认为,唯一的好方法是先尝试摆脱条件,然后再突然比较5个条件。

如果没有其他选择,则像其他人建议的那样-将其分解为单独的名称,并缩短名称或将其分组,例如如果所有条件都必须为true,则使用“如果x数组中没有false则运行”之类的内容。

如果一切都失败了,@ Eoin Campbell给出了很好的主意。

答案 10 :(得分:-2)

当条件非常复杂时,我使用以下样式(PHP实际示例):

if( $format_bool &&
    (
        ( isset( $column_info['native_type'] )
            && stripos( $column_info['native_type'], 'bool' ) !== false
        )
        || ( isset( $column_info['driver:decl_type'] )
            && stripos( $column_info['driver:decl_type'], 'bool' ) !== false
        )
        || ( isset( $column_info['pdo_type'] )
            && $column_info['pdo_type'] == PDO::PARAM_BOOL
        )
    )
)

我认为它比嵌套if()的多个级别更好,更易读。在某些情况下,你可以简单地将复杂的条件分解成碎片,否则你必须多次在if() {...}块中重复相同的语句。

我也相信添加一些&#34; air&#34;进入代码总是一个好主意。它极大地提高了可读性。