不必要的“其他”语句

2022-09-02 00:41:34

如您所知,在 Eclipse 中,您可以打开“不必要的 'else' 语句”检查,该检查将触发 if-then-else 并提前返回。而且,根据我的经验,使用这种陈述时,有两种最可能的情况:

1)预检查:

if (!validate(arg1)) {
    return false;
}
doLotOfStuff();

2)检查后:

doLotOfStuff();
if (condition) { 
    return foo; 
} else {
    return bar; 
}

在第二种情况下,如果触发器处于打开状态,Eclipse 将建议您将代码更改为:

doLotOfStuff();
if (condition) { 
    return foo; 
} 
return bar; 

但是,我认为 return with else 语句更具可读性,因为它类似于业务逻辑的直接映射。因此,我很好奇这种“不必要的'else'语句”代码约定是否广泛存在,或者带有 else 语句的代码更可取?


答案 1

通常,我更喜欢代码的结构遵循底层“业务”逻辑的结构。在这种情况下,我的方法将取决于代表什么。例如,如果它是一个错误检查,通常不会被击中,但可能偶尔使用,那么第二种形式的不对称性与逻辑的不对称性相匹配。condition

doLotOfStuff();
if (condition) { 
    return foo; 
} 
return bar; 

但是,如果任何一种可能性都是合理的,并且只是在它们之间进行选择,我会允许代码的结构显示这种对称性。

doLotOfStuff();
if (condition) { 
    return foo; 
} else {
    return bar; 
}

代码是供程序员阅读的,而不是编译器。


答案 2

曾经有人认为(可能仍然被一些人认为)函数应该有一个入口点(简单,但当你考虑汇编语言时是相关的)和一个退出点。

从调试的角度来看,一个退出点是很好的(因为你可以在一行上放一个监视/中断,并且知道你会通过它),但可能导致一些可怕的嵌套,所以可读性往往会胜出。哪个产生的嵌套最少,代码行最少,最终结果最易读?最终,这往往比其他任何事情都重要得多。

对于它的价值,最后可以更好地表达为:

return condition ? foo : bar;

假设不是很长。condition

不要过分担心所谓的代码“纯度”。这是一种无关紧要的分心。使内容可读并通常保持一致。