我发现自己很常使用这样的模式:
if (a > b) {
foo();
}
elseif (c > d) {
bar();
}
else {
baz();
}
这里的要点是第二个条件显然没有与第一个条件相关,除非你仔细遵循程序逻辑。这是一件非常糟糕的事吗?将上述内容改为
是否更可取if (a > b) {
foo();
}
else {
if (c > d) {
bar();
}
else {
baz();
}
}
出于可维护性原因?有没有一个我完全错过的更好的模式? “没有明显连接”的位似乎是我代码中更常见的错误来源之一。
答案 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
中变为非常烦人,非常脆弱,逻辑上难以理解。