在if-then-else语句中明确表示范围是否有害?

sil*_*lph 5 java conditional

(我搜索了"其他如果范围"但没有提出任何回答我的问题的帖子).

当使用if .. elseif .. else根据某些(互斥)范围内的变量选择要做什么时,我喜欢明确指定范围:

int num = 55;
String message;

if (num >= 20) {
    // update message variable
    message = "Bigger or equal to than 20";
}
else if (10 <= num && num < 20) {
    // update message variable
}
else if (0 <= num && num < 10) {
   // update message variable
}
else if (num < 0) {
   // update message variable
}

System.out.println(message);
Run Code Online (Sandbox Code Playgroud)

但是我看到的所有教科书和讲义都写了这样一个例子:

int num = 55;
String message;

if (num >= 20) {
    // update message variable
    message = "Bigger or equal to than 20";
}
else if (num >= 10) {
    // update message variable
}
else if (num >= 0) {
   // update message variable
}
else {
   // update message variable
}

System.out.println(message);
Run Code Online (Sandbox Code Playgroud)

我明白为什么他们确保最后使用else(即阻止Java编译器认为像消息这样的变量可能没有被初始化,如果该变量是原始的),但考虑到所有教科书和讲义都显示了其他风格,是否有明确写出所有其他条件范围所引起的问题,我喜欢这样做?

And*_*mas 7

不要重复自己.

使用您的方法,您将不必要地在代码中重复两次相同的值.这有几个缺点,包括:

  • 通过更改其中一个值而不是另一个值,可以更轻松地在维护期间引入错误.
  • 在执行期间,它执行冗余检查.如果你在else if,你已经知道先前的条件是错误的.
  • 代码更长,无需添加任何其他信息.阅读时间更长,检查时间更长.

以后的维护可能会改变其中一个值,但不会改变另一个值,从而导致一些令人惊讶的行为.

if ( num >= 30 ) {
    // update message variable
}
else if (10 <= num && num < 20 ) { // Whoops! 
    // update message variable
}
...
Run Code Online (Sandbox Code Playgroud)

您可以通过为每个值定义常量来避免这种情况.但是,您的代码仍在指定冗余检查.

final int HIGH = 20;
final int MEDIUM = 10;
final int LOW = 0;

if (num >= HIGH ) {
   // update message variable
}
else if (MEDIUM <= num && num < HIGH ) { // We already know num<HIGH
    // update message variable
}
...
Run Code Online (Sandbox Code Playgroud)

  • @silph - 它绝对没有*意味着它是一个愚蠢的问题.它只是意味着这个网站努力坚持可以用事实回答的问题,并避免争吵.有时候人们可能会过快地关闭问题.有时像"风格"这样的关键词会导致关闭,尽管存在一个真实的,可回答的问题.如果是我,我会问你的方法是否有害*,而不是询问它是不正确还是坏的风格. (2认同)

Bat*_*eba 2

如果我正在构建一些可以在某种飞行器上运行并成功降落在另一个星球上的代码,那么我总是会说得很清楚。请记住,一行代码将被写入一次,但可以被读取数百次。在凌晨 4 点的调试会话中,您的第一个代码片段将更容易理解。

您的第一种方法确实更清晰,如果错误的重构者重新排序条件检查,则不会引入错误。

} else {如果程序控制不应该达到这一点,我总是以“虽然”结束,理想情况下以某种断言结束。

  • 我不同意重构部分:第一个版本也很容易出现重构错误,因为你必须确保每个范围的上限恰好是下一个范围的下限。 (3认同)