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

时间:2016-10-21 18:40:12

标签: 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);

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

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);

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

2 个答案:

答案 0 :(得分:7)

不要重复自己。

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

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

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

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

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

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

答案 1 :(得分:2)

如果我构建一些可以在某种车辆上运行的代码成功登陆另一个星球,那么我总是会为清晰度而烦恼。请记住,一行代码将一次写入,但可以读取数百次。在凌晨4点的调试会话中,您的第一个代码段将更容易理解。

如果错误的重构器重新排序条件检查,那么第一种方式确实更清楚,并且不会引入错误。

我总是以} else {完成,理想情况下,如果程序控制不应达到,那么理想情况下会有某种断言。