2

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

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

这里的要点是第二个条件与第一个条件没有明显联系,除非您仔细遵循程序逻辑。这是一件非常糟糕的事情吗?是否最好将上述表述为

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

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

4

5 回答 5

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

*提早保释,快速保释

于 2011-04-01T20:18:17.780 回答
3

我认为第一个绝对是可取的。我唯一会使用第二个的时间是将代码放在外部的 else 中,而不是在内部的 if/else 中。

当我看到一个 else if 时,我立即寻找 if。所以我会说它显然是有联系的。

于 2011-04-01T20:06:03.620 回答
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();
}
于 2011-07-12T04:55:49.920 回答
0

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

于 2011-04-01T20:16:13.693 回答
0

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

第二个选项将迫使读者记住哪些条件必须为真才能到达if它在每个时刻读取的嵌套,而在第三或第四个嵌套中,if这变得非常烦人并且非常脆弱并且在逻辑上难以遵循。

于 2011-04-01T20:27:27.507 回答