使用“if / elseif / else”与“if / else {if / else}”

时间:2011-04-01 20:03:56

标签: flow-control

我发现自己很常使用这样的模式:

if (a > b) {
    foo();
}
elseif (c > d) {
    bar();
}
else {
    baz();
}

这里的要点是第二个条件显然没有与第一个条件相关,除非你仔细遵循程序逻辑。这是一件非常糟糕的事吗?将上述内容改为

是否更可取
if (a > b) {
    foo();
}
else {
    if (c > d) {
        bar();
    }
    else {
        baz();
    }
 }

出于可维护性原因?有没有一个我完全错过的更好的模式? “没有明显连接”的位似乎是我代码中更常见的错误来源之一。

5 个答案:

答案 0 :(得分:4)

这并不重要。

我更喜欢Leaky Rowboat *模式:

if (a > b) 
{
    foo();
    return;
}

if (c > d) 
{
    bar();
    return;
}
baz();

当你回来的时候会更好:

if (a > b) 
    return foo();

if (c > d) 
    return bar();

return baz();

*提前保释,快速保释

答案 1 :(得分:3)

我认为第一个肯定更可取。我唯一一次使用第二种方法是将代码放在内部if / else中不是的外部其他内容中。

当我看到其他的时候,我立即寻找if。所以我会说这显然是有联系的。

答案 2 :(得分:1)

我认为这是代码味道。你在这里做什么,或者你为什么这么做,这不是很明显。事实上,你认为它们没有明显的连接,而且它们是错误的常见来源,这告诉你不要这样做。

重写此代码,以便您明确了解这些条件的原因。理想情况下,您可以阅读代码并表达您的意图和/或规格。

taller_than_wide = a > b;
more_expensive_than_normal = c > d;

if (taller_than_wide) {
      foo();
}
elseif (more_expensive_than_normal) {
      bar();
}
else {
      baz();
}

答案 3 :(得分:0)

我避免使用第二种方法,因为它导致大量条件的缩进。

答案 4 :(得分:0)

我肯定会使用第一个,因为它比第二个更具可读性。

第二个选项将强制读者牢记哪些条件必须为真,才能到达嵌套的if,它在每个时刻读取,并在第三个或第四个嵌套if中变为非常烦人,非常脆弱,逻辑上难以理解。