4

在一个变量可能有两个不同的值的情况下,如果它是一个,你会做某事,如果是另一个,你会做些什么:

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

或者你会这样做:

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

为了清楚起见,在读者不一定能说他们做同样的事情的情况下(但 else if 做了一个“不必要的”表达)?那你会怎么做?谢谢!

编辑:对于这样的事情实际上有更多不同的选项:三元运算符、if-else、if-elseif、if-elseif-else、-if-else(with assert)、switch。每个人都有自己的位置,但很难决定..

4

9 回答 9

7

当变量没有其他可能的状态时(即检查 null 和所有这些),我总是更喜欢简单的 else。如果变量不是第一个条件,我可能会添加一条评论,说明变量是什么,但这仅在类似的情况下

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){
....

}

由于 is_open 是一个布尔值,因此指定它是没有意义的,因为剩下的唯一选项是 0,当您必须重构代码以改用 is_open() 时,这也可以节省一点打字时间,因为现在您只需更改一行而不是两个。

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

于 2009-08-05T04:15:34.737 回答
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
}

如果你不确定你的支票不能被延长,你应该提供一个默认的方式。

于 2009-08-05T05:33:20.400 回答
2

否则是默认值。这意味着数据存在大量可能性,或者它是意外数据。

我遵循基本规则:如果有一个参数可以满足,使用else if,如果没有,使用else。我通常使用 else 来判断错误。

于 2009-08-05T04:12:40.263 回答
1

这真的是一个风格问题和你自己对世界的看法。杯子是半空半满的,但你可以得到最该死的争论。

如果布尔测试都属于同一类型,则最好使用 switch 语句。

如果没有,我建议省略额外的测试,但插入一条关于落入最后一条语句的操作意义的评论。请参阅上面 Gertjan 的评论。

于 2009-08-05T05:30:45.520 回答
1

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

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

但在其他一些情况下, else 并不那么明显,最好澄清 else 条件。如果添加了一些其他可能的条件,这也是更多的未来证明。

此外,您可以在(最后一个)else 中插入异常以告知未实现的案例。当例如后端和前端分离并且有人向枚举器添加新值(或者当使用文本键时引入了新键)时,这可能非常有用,您将在首次使用新值时收到错误消息。如果不使用 if else 如果您看不到发生了什么,那可能会使调试变得非常困难。

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

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

于 2009-08-05T05:02:29.087 回答
1

else被发明并被使用是有充分理由的。你在哪里使用它应该由你试图实现的逻辑决定,而不是一种人为的风格感。

一些人认为通过在else if; 但是,这可能会导致默认或捕获所有条件的逻辑空白。

此外,有人说将来更容易修改。这种说法是胡说八道。使用设计模式和编写模块化代码是将来更容易修改的东西,写一行不应该符合这些类型的陈述。

于 2009-08-05T06:25:36.330 回答
1

这不就是assert为了这个吗?

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

这也可以扩展到三态逻辑。

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

使用assert使您的代码可读、易于维护和清晰。话虽这么说,asserts 和评论几乎可以互换。

于 2009-08-05T05:39:41.417 回答
1

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

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

在某些情况下,“else”情况有利于错误检查

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

如果您的数据较早地检查了错误值,那么可能有一种情况可以在最后一种情况下使用 else ,以在 C 等语言中提供小的性能改进:

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

但这只是因为某些语言无法表达函数的域而有必要,在可以清楚地表达域的语言中,优化器应该为您添加这种性能优势,允许您在代码中具体化,并使其以后更容易添加更多案例

...当然这是一门艺术,而不是一门科学,在某些情况下,你不能遵循严格的规则,我经常发现自己编写的代码如下:

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

...从第一个 if 条件中非常明显和隐含的事实证明 else 的用途是合理的。

于 2009-08-05T05:58:04.840 回答
0

这取决于实际情况。您是否只想在满足某些条件时采取行动,或者是否存在一个值的特殊情况和任何其他值的另一组逻辑?

于 2009-08-05T04:13:24.803 回答