您需要执行一系列功能。案例A:他们不依赖于彼此。哪个更好?
function main() {
a();
b();
c();
}
或
function main() {
a();
}
function a() {
...
b();
}
function b() {
...
c();
}
案例B:他们的确取决于前一次成功完成。
function main() {
if (a())
if (b())
c();
}
或
function main() {
if (!a()) return false;
if (!b()) return false;
c();
}
或
function main() {
a();
}
function a() {
... // maybe return false
b();
}
function b() {
... // maybe return false
c();
}
当然,更好,意味着更易于维护和更容易理解。
答案 0 :(得分:14)
案例A:1 推理:由于没有任何函数相互依赖,因此在main中按顺序调用它们会显示一个逻辑顺序的事件。你可以选择在每个函数结尾处调用下一个函数的替代方法看起来像意大利面条代码,并且很难让读者阅读你的程序。
案例B:以上都不是。
function main() {
return a() && b() && c();
}
推理:看起来你并不真正关心返回值,如果其中一个函数返回某个值,你只想提前爆发。您可以返回所有这些函数的“anded”结果,如果其中任何一个返回false,代码将提前中断。因此,如果a返回false,则b将不会被执行。将所有这些放在一行上很容易阅读,并简明扼要地表明它们彼此依赖。
答案 1 :(得分:2)
案例A:第一个选项
如果您使用第二个选项,则重新使用a会更加困难,因为您自动拉入b和c。
案例b:依赖 - 做a,b和c自然地返回布尔值,还是要检查一些其他值?我仍然没有调用b和b调用c,因为那时你引入了一个不必要的依赖。如果返回值有意义,我倾向于选项2 - 更少的嵌套是一件好事。
答案 2 :(得分:1)
首先,最佳答案将取决于代码所处上下文的多个方面 - 除了“依赖”之外,没有一个正确的答案。
然而,从表面上看,案例A:
选项1显示算法的顶级视图。
选项2隐藏了这一点,呼叫B& C是隐藏的。发现C被称为可能是相当多的工作。此外,测试A& A更难如果B然后调用其他方法,则它们处于隔离状如果A,B和C可以被嘲笑,可以随时测试Main。
案例B: 在方法中有1个退出点与多个退出点的争论很常见。有时多个出口点可以使代码更简单,这使得它更易于维护,有时候不明显返回会产生什么影响,或者返回会发生,这使得它更难以维护。
选项1显式地显示了算法,但是多个嵌套if可以很快失控。 在这种情况下,我肯定有选项2或一些聪明的布尔变体(是的,核心)。
选项3看起来很简单。
答案 3 :(得分:0)
案例A:第一个选项
案例B:第二个选项