2009-08-05 54 views
3

在这样一种情况的变量可以有两种不同的价值观,你做的东西,如果它的一个,东西可依使用如果其他的,你只需要做:一般编程 - 其他否则,如果为清楚起见

if(myVariable == FIRST_POSSIBLE_VALUE) { ... } 
else { ... } 

或会怎么做:

if(myVariable == FIRST_POSSIBLE_VALUE) { ... } 
else if (myVariable == SECOND_POSSIBLE_VALUE) { ... } 

为清晰起见,在这样一种情况:读者不一定能够告诉他们做同样的事情(但否则,如果确实是“不必要的”表达)? 那么你会怎么做? 谢谢!

编辑:实际上有很多不同的选项,像这样:三元运算符,if-else,if-elseif,if-elseif-else,-if-else(带有断言),开关。每个人都有自己的位置,但很难决定。

回答

1

难道这就是assert的原因吗?

if (condition1) { ... } 
else { assert(condition2); } 

这也可以扩展为三态逻辑。使用assert使您的代码易读,易于维护和清除。这就是说,assert和评论几乎是可以互换的。

+0

断言在else中比使用else更好吗? – mk12 2009-08-05 06:36:06

2

其他是默认设置。这意味着数据有很多种可能性,或者它是意想不到的数据。

我走的基本规则:如果有一个可以满足的参数,使用else if,如果没有,则使用else。我通常使用其他的错误。

0

这取决于具体情况。如果满足某些标准,你只想采取行动,还是有一个特殊情况的一个值和另一个逻辑的任何其他值?

7

当变量没有其他可能的状态时(即检查null和所有这些状态),我总是比较喜欢其他状态。我可以添加评论说变量是什么,如果它不是第一个条件,但这只是在情况下,它像

if(color==red){ 
.... 
}else{ //our theme only allows for red and yellow, so the color must be yellow. 
.... 
} 

而且,这样可以节省一些时间处理导致它不会有检查无用的变量(OOP中,或者更糟的地方检查变量占用相当多的指针引用,函数调用和内存读取)

我从来没有这样做

if(file.is_open==1){ 
.... 
}else if(file.is_open==0){ 
.... 

}

as is_open是一个布尔值,因为剩下的唯一选项是0,所以当你必须重构代码以使用is_open()时,这可以节省一点点输入,因为现在你只需要改变一个而不是两个。

和'else if'语句我认为应该将其转换为开关,如果有多于1个'else if',除非语言使得它不可能(例如C如何不能处理开关中的字符串)

+0

它确实没有什么意义的布尔变量,但想到一个整数结果代码。您始终可以将返回值分配给本地变量以节省处理器时间。 – Scoregraphic 2009-08-05 06:03:22

1

有时else语句的条件非常明显。例如,

if(user.IsNew) { } else { /*in this case user.IsNew != true*/ } 

但在其他一些情况下,其他情况并不明显,最好澄清其他情况。如果添加其他可能的条件,这也是更有前途的证据。

此外,您可以在(最后)else中插入一个异常来通知有关未实现的情况。当例如后端和前端分开并有人向枚举器添加新值时(或者在使用文本键时引入了新键),当第一次使用新值时,您将收到错误,这可能非常有用。如果不使用,如果你不会看到发生了什么,并可能使调试非常困难。

if(user.SelectedStyle == Styles.Red) { 
} else if(user.SelectedStyle == Styles.Basic) { 
} else { 
throw new Exception("Not implemented"); 
} 

在上面的情况下,新的Style(例如Style.Blue)将导致您的应用程序抛出异常。

1

这的确是一个风格问题和你自己的世界观。玻璃杯是半空半满的,但你可以得到关于它的最深的争论。

如果布尔测试都是相同的类型,那么switch语句是最好的。

如果不是这样,我建议不要做额外的测试,但要插入一条关于落入最后一条语句的操作含义的评论。见上面的Gertjan的评论。

2

我只使用if-else作为布尔检查,这意味着如果表达式不匹配,那么只能有else。或者我想把所有东西都拿出来:把它想成默认。

如果你想检查枚举或什么的,你应该尝试通过switch语句来检查,如果可能的话在你的语言。

在Java中,不可能为字符串使用开关。所以,你可以使用这样的事情:

if(string.equals("foo")) { 
    // first case 
} else if(string.equals("bar")) { 
    // second case 
} else { 
    throw IllegalArgumentException(" ... "); 
    // or log it 
} 

如果你不知道你的支票不能扩展,你应该如果你能提供一个默认的方式。

1

当您的输入可以清楚地分为不同的情况时,我觉得明确说明这些情况是什么更好,例如,如果您希望'n'是0到100之间的数字,并且您有三种情况:

if (n >= 0 && n < 30) { 
    case1(); 
} else if (n >=30 && n < 70) { 
    case2(); 
} else if (n >=70 && n < 100) { 
    case3(); 
} 

在某些情况下,“别人的情况是良好的错误检查

} else { 
    error("n should be between 0 and 100"); 
} 

如果你的数据被检查为早期错误的值,那么有可能是别人使用的情况下,最后一种情况,为语言提供小的性能提升就像C:

} else { // (n >= 70 && n < 100) 
    case3(); 
} 

但是这仅仅是必要的,因为某些语言无法表达一个函数的定义域,在语言的域中可以清楚地表示,该优化器应该添加此性能优势,为你,让你需要明确你的代码,并且以后可以更容易地添加更多的案例

...当然,这是一门艺术,而不是一门科学,而且在某些情况下,你就不能按照硬遵守的规则,我经常发现自己写的代码,如:

if (p == NULL) { 
    doSomething(); 
} else { 
    doSomethingElse(); 
} 

...的事实理由这是非常明显的和隐含的,如果条件是什么其他用于。

1

else是被发明出来的,使用起来很有道理。你在哪里使用它应该由你试图达到的逻辑来决定,而不是一种人为的风格。

有人认为这是更自我记录在else if明确的条件;然而,这可能会导致逻辑与缺省的差距或捕获所有条件。

此外,有人说在未来修改更容易。这个说法是铺张的。使用设计模式和编写模块化代码是未来更容易修改的内容,编写一行不应该符合这些类型的语句。

相关问题