【问题标题】:Is it harmful to explicitly state ranges in if-then-else statements? [closed]在 if-then-else 语句中明确声明范围是否有害? [关闭]
【发布时间】:2017-03-04 03:59:32
【问题描述】:

(我搜索了“else if range”,但没有找到任何回答我问题的帖子)。

当使用 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 编译器认为像消息这样的变量可能不会被初始化,如果该变量是一个原始变量),但考虑到所有教科书和讲义显示另一种风格,是否像我喜欢做的那样,明确写出所有其他条件的范围会导致任何问题?

【问题讨论】:

    标签: java conditional


    【解决方案1】:

    不要重复自己。

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

    • 通过更改其中一个值而不是另一个值,可以更轻松地在维护期间引入错误。
    • 在执行期间,它会执行冗余检查。如果您在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
    }
    ...
    

    【讨论】:

    • 多么有趣;我从来没有想过“后期维护”的问题。因此,似乎每种方法都有利有弊。不知道有没有行业标准可以给我一些权威的指导?
    • @silph “后期维护”一直是现实生活中的一个问题。在学校作业中可能不是这样,但最好开始像现在这样思考。
    • 就个人而言,我总是将else if} 放在同一行,以强调这是同一if 声明的延续。没有它,代码结构在粗略扫描代码时是不清楚的。
    • @silph - 有用的原则包括简约、优雅和干燥。只执行必要的。只表达必要的东西。避免重复自己。另请参阅 Antoine de Saint-Exupéry 的名言:“最终达到完美的不是不再有任何东西可添加,而是不再有任何东西可去除。”
    • @silph - 它绝对意味着这是一个愚蠢的问题。这仅意味着本网站努力坚持可以用事实回答的问题,并避免争吵。有时人们可能有点太快而无法结束问题。有时,尽管存在一个真实的、可回答的问题,但像“风格”这样的关键词可能会导致结束。如果是我,我会问你的方法是否有害,而不是问它是否不正确或风格不好。
    【解决方案2】:

    如果我正在构建一些代码,这些代码将在某种交通工具上运行以成功降落在另一个星球上,那么我总是会为清晰而丰满。请记住,一行代码将被编写一次,但可能会被读取数百次。在凌晨 4 点调试会话期间,您的第一个 sn-p 将更容易理解。

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

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

    【讨论】:

    • 我不同意重构部分:第一个版本也很容易出现重构错误,因为你必须确保每个范围的上限恰好是下一个范围的下限。跨度>
    • 我认为answer by Andy Thomas 中提出的问题比有人重新排列 if-elseif-elseif 语句序列更现实。任何愚蠢到重新安排这种结构而没有意识到else 依赖于if 的东西都应该被解雇。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多