If statement 使用多个条件格式化if语句的最佳方法

If statement 使用多个条件格式化if语句的最佳方法,if-statement,formatting,language-agnostic,If Statement,Formatting,Language Agnostic,如果您想根据两个或多个条件执行某些代码,那么格式化If语句的最佳方式是什么 第一个例子:- if(ConditionOne && ConditionTwo && ConditionThree) { Code to execute } if(ConditionOne) { if(ConditionTwo ) { if(ConditionThree) { Code to execute } } }

如果您想根据两个或多个条件执行某些代码,那么格式化If语句的最佳方式是什么

第一个例子:-

if(ConditionOne && ConditionTwo && ConditionThree)
{
   Code to execute
}
if(ConditionOne)
{
   if(ConditionTwo )
   {
     if(ConditionThree)
     {
       Code to execute
     }
   }
}
第二个例子:-

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

这是最容易理解和阅读的,记住每个条件可能是一个很长的函数名或其他东西。

第一个条件更容易理解,因为如果从左到右阅读,您会得到: “如果某物、某物、某物、那么”,这是一个容易理解的句子。第二个例子是“如果某件事,那么如果某件事,那么如果另一件事,那么”,这很笨拙


也可以考虑,如果你想在你的子句中使用一些OR——你将如何用第二种方式来做?< /P> < P>其他答案解释了为什么第一个选项通常是最好的。但是如果您有多个条件,请考虑在选项1中创建一个单独的函数(或属性)进行条件检查。这使得代码更易于阅读,至少在使用好的方法名时是如此

if(MyChecksAreOk()) { Code to execute }

...

private bool MyChecksAreOk()
{ 
    return ConditionOne && ConditionTwo && ConditionThree;
}
如果条件仅依赖于局部范围变量,则可以使新函数成为静态函数,并传入所需的所有内容。如果有混音,就把本地的东西传进来。

我更喜欢选项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 ;)
}
IMHO选择“B”的唯一原因是如果您有单独的
else
函数为每个条件运行

e、 g

第一个例子更“易于阅读”

实际上,在我看来,当你必须添加一些“else逻辑”时,你应该只使用第二个,但是对于一个简单的条件,使用第一个味道。如果您担心这种情况会持续很长时间,则始终可以使用下一种语法:

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

祝你好运

第二个是一个经典的例子,所以我要避免它


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

这个问题被问到了,到目前为止,已经得到了回答,好像这个决定应该完全基于“语法”的理由

我想说的是,关于如何在if中设置许多条件的正确答案也应该取决于“语义”。因此,条件应该根据“概念上”事物的组合进行分解和分组

如果两个测试实际上是同一枚硬币的两面,例如,如果(x>0)&&(x),您可以这样做:
如果任何条件失败,它将在块后继续。如果要定义块后要保留的任何变量,则需要在块前定义它们。

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

我相信它比嵌套多个级别的
if()
更好,可读性更好。在某些情况下,像这样的情况下,您无法将复杂的条件分解成碎片,因为否则您将不得不在
if(){…}
块中多次重复相同的语句

我还认为,在代码中添加一些“air”总是一个好主意。它大大提高了可读性。

if((单个条件表达式a)
&&(单个条件表达式B)
&&(单个条件表达式C)
)
{
蛋白石();
}
其他的
{
opNoneABC();
}
按以下方式格式化if else语句中的多个条件表达式:

  • 允许增强可读性:
    a、 首先显示的表达式中的所有二进制逻辑运算{&,| |}
    b、 每个二进制操作的两个条件操作数都是明显的,因为它们垂直对齐
    c、 嵌套的逻辑表达式操作通过缩进变得显而易见,就像在子句中嵌套语句一样
  • 需要显式括号(不依赖于运算符优先级规则)
    a、 这避免了常见的静态分析错误
  • 允许更轻松地调试
    a、 仅使用//
    b、 在任何单独测试之前或之后设置断点
    c、 例如
  • //仅使用一个预挂起的“//”禁用任何单个条件测试
    //在任何单独测试之前设置断点
    //语法“(1&&”和“(0 | |)”通常不会创建任何实际代码
    如果(1)
    &&(单个条件表达式A)
    &&(单个条件表达式B)
    && (   0
    ||(单个条件表达式C)
    ||(单个条件表达式D)
    )
    )
    {
    ... ;
    }
    其他的
    {
    ... ;
    }
    
    我已经面临这个困境很长一段时间了,但我仍然找不到合适的解决方案。我认为唯一的好办法是先尝试摆脱之前的条件,这样你就不会突然比较其中的5个

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


    If all failes@Eoin Campbell给出了非常好的想法。

    我喜欢它。虽然我不太喜欢这个方法想法,除非这些方法已经存在并返回布尔值。在第二个例子中,你不是在没有理由的情况下评估所有东西吗?我会在条件之前使用“&&”。很难让条件具有相同的字符leng如示例中所示。这看起来很幼稚——在“它做什么?”的意义上;)但一旦你习惯了它,它实际上是可读的。我发现这是最有效的,也更容易在+1之后添加条件。起初我皱起了眉头,但这确实是最好的答案。将布尔
    isoktodoother
    作为属性非常有意义。但这只是将相同的复杂条件移到了其他地方它还需要可读性,所以我们回到原点。这不仅仅是关于
    if
    语句可读性,而是关于条件可读性。@RobertKoritnik我理解你的意思
    {
      ( 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
    }
    
    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
            )
        )
    )