用多种条件格式化if语句的最佳方法

如果你想要一些代码来执行基于两个或更多的条件,这是格式化if语句的最佳方式?

第一个例子: –

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

第二个例子: –

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

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

我更喜欢选项A.

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

如果你确实有特别长的variables/方法条件,你可以把它们换行

 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”的唯一原因是如果你有elsefunction运行每个条件。

例如

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

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

 if(MyChecksAreOk()) { Code to execute } ... private bool MyChecksAreOk() { return ConditionOne && ConditionTwo && ConditionThree; } 

它的条件只依赖局部范围variables,你可以使新的函数静态并传递你所需要的一切。 如果有混合,通过当地的东西。

第一个例子更“易读”。

实际上,在我看来,只有当你不得不添加一些“其他逻辑”时才应该使用第二个,但是对于一个简单的条件,使用第一个风格。 如果你担心这种情况,你总是可以使用下面的语法:

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

祝你好运!

到目前为止,这个问题已经得到了答复,并且已经得到了回答,好像这个决定纯粹是基于“句法”的理由。

我想说如果你在一个if里面布置了一些条件的正确答案,也应该依赖于“语义”。 所以应该根据“概念上”的情况将条件分解和分组。

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

例如。

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

第二个是箭头反模式的典型例子所以我会避免它…

如果你的条件太长,将它们提取成方法/属性。

  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) eg ... // 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 { ... ; } 

第一个是比较容易的,因为如果你从左到右阅读,你会得到:“如果某件事情和某些事情有关,那么这是一个容易理解的句子。 第二个例子的内容是:“如果某件事发生了,那么如果有其他事情发生,那么很笨拙”。

另外,考虑一下,如果你想在你的条款中使用一些OR,你将如何在第二种风格中做到这一点?

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

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

在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 } 

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

当条件非常复杂时,我使用下面的样式(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() {...}重复相同的语句多次。

我也相信,在代码中添加一些“空气”总是一个好主意。 它极大地提高了可读性。

我想在C你不能只写:

 if ( variable = (1 || 2 || 3) ) { do stuff; } 

或者,使用switch语句可能更好?