2010-08-20 105 views
2

这是一个微不足道的问题,但我一直在想。在不需要的情况下应该保留还是放弃?

在风格方面(我假设性能是相同的),在if语句中保留一个'else'是否更好?

例如,以下中的哪一个更好:

if (x < 10) 
    doSomething(); 
else if (x > 20) 
    doSomethingElse(); 

if (x < 10) 
doSomething(); 
if (x > 20) 
doSomethingElse(); 

另一种情况:

if (x < 10) 
return; 
else doSomething(); 

if (x < 10) 
return; 
doSomething(); 

谢谢,

卢克

回答

5

在第一个例子,绝对保持在else - 它可以防止一个额外的评估,如果第一部分是真实的。

(也就是说,如果你这样做:

if (x < 10) 
    doSomething(); 
    if (x > 20) 
    doSomethingElse(); 

两个IFS是总是评估

但是,如果你这样做:

if (x < 10) 
    doSomething(); 
else if (x > 20) 
    doSomethingElse(); 

第二部分只计算,如果首先是错误的[如果x < 10,你甚至不想检查x> 20,这是对评估的浪费......])

第二个是个人设计决定;选择哪些更吸引你,更符合特定的逻辑,或者如果他们有任何符合你公司的标准。

+0

同意,但我建议在第二种情况下删除'else',因为它没有效果。还有一个事实是,如果包含它,那么就意味着它是需要的。它当然不会混淆每个人,但它可能会混淆某人。 – William 2010-08-20 18:49:27

+0

我认为这不仅仅是“个人”设计决定。在这个例子中'x> 20'可能不是非常昂贵,但有时候'if'表达式可能是昂贵的。在那种情况下,为什么浪费时间评估两个这样的表达式时,你可能只需要评估第一个表达式呢?这就是为什么''''和'&&'是“短路”操作符的原因:只要知道了全部结果,它们就会停止并返回。 – 2010-08-20 18:53:41

+0

@Daniel Earwicker - 我只是说这是第二个例子(带回归)的个人设计决策,没有额外的评估,两种方法的流程都是相同的。 – froadie 2010-08-20 18:57:04

5

让它们提高代码清晰度。在第一个示例中,保留else,因为它略有不同,因此可以保存评估结果。第二种情况不太明确;通常我会在返回后使用elses作为备用案例,但在返回错误处理时省略else。

0

作为一般规则,请始终将它们留在中,并为其为什么没有问题添加注释,否则其中没有代码。这样,进入你脚步的人不必问 “其他人的含义是什么?应该在那里还是不存在?”

如果你发现自己无法提出正确的措辞来解释为什么其他不重要,那么这是一个很好的机会。

失踪的elses通常是一种代码味道。

+0

...所以请发表评论,为什么它不需要,而不是空的其他! – froadie 2010-08-20 18:43:53

1

一般来说,我会远离任何不必要的东西。更多的代码意味着更多的错误空间。但是,如果对程序流程来说不必要的代码,使得阅读它的人更加清楚,那毕竟可能是必需的。

在你的第一个例子中,没有数字会小于10并且大于20,但是有时逻辑不那么明显。其他情况很容易看出这些条件是同一代码块的一部分,因此应该包括在内。

在你的第二个例子中,还没有改变程序的流程,所以它确实没有必要。事实上,你可能会考虑再处理逻辑一点:

if(x>10){ 
    doSomething; 
} 

现在,你甚至不必担心return语句,或额外的else块。

编辑:添加括号..对于图灵的缘故!

1

如果您在多行中打破if声明,那么对于图灵来说,请使用括号!所以:

if (x < 10) return; 

或者

if (x < 10) { 
    return; 
} 

但不是

if (x < 10) 
    return; 

else问题是主观的,但我在它的观点是,if/else在概念上被打破你的代码更 - 或更少的平等案件。你的第一个例子是处理两个概念上相似但相互排斥的案例,所以我发现else是合适的。通过两个单独的if声明,乍看起来好像两个条件是独立的,而他们不是。

returnif上时,情况有所不同。这些情况是自动互斥,因为return将阻止其他代码无论如何运行。如果另一种情况(没有回报)很短,并且特别是如果它返回,那么我倾向于使用else。如果常见的替代代码很长或很复杂,那么我不会使用else,将if视为更多的守卫子句。

这主要是一个清晰度和可读性的问题,而这两个因素都是主观的。

+0

同意。应该总是包括括号。 – Skunkwaffle 2010-08-20 19:14:55

1

在少数平台上,代码有时可以更快地执行,并省略'else'语句。例如:

 
    if (a & 1) 
    b |= 2; 
    if (!(a & 1) 
    b &= ~2; 

将为Microchip PIC生成四条指令,并在恒定的四个周期内执行。一种替代方案:

 
    if (a & 1) 
    b |= 2; 
    else 
    b &= ~2; 

将需要五个指令,并且执行时间将取决于是否(一个& 1)是真的还是假的是四个或五个周期。

除非您知道在“冗余”测试中离开会使您的代码更快,否则请使用“其他”语句来消除它们。

相关问题