题
您有一系列函数要执行。案例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();
}
当然,更好的是,意味着更容易维护和易于遵循。
解决方案
案例A:1。
推理:由于这些功能都不取决于彼此,因此在Main中按顺序调用它们,显示了事件的逻辑序列。您在每个功能末尾称呼下一个的替代方案,看起来像意大利面条代码,很难让阅读您的程序遵循。
案例B:以上都不是。
function main() {
return a() && b() && c();
}
推理:看来您并不真正在乎回报值,如果其中一个功能返回一定值,您只想尽早突破即可。您可以返回所有这些功能的“ ANDED”结果,如果其中任何一个返回错误,则代码将尽早爆发。因此,如果返回false,则不会执行。将所有这些都放在一行上很容易阅读,并简单地表明它们彼此依赖。
其他提示
案例A:第一个选项
如果您使用第二个选项,则使重复使用A更加困难,因为您会自动拉入B和C。
案例B:依赖 - a,b和c返回布尔值自然或其他值得检查的值?我仍然不会打电话b和b呼叫C,因为那时您会引入不必要的依赖性。如果返回值很有意义,我倾向于选项2-更少的嵌套是一件好事。
首先,最好的答案将取决于代码所在的上下文中的多个方面 - 没有人 对 回答“取决于”。
但是,以面值为单位,案例A:
选项1显示算法的顶级视图。
选项2隐藏了这一点,对B&C的电话隐藏了。发现C被称为C,这可能是很多工作。另外,如果他们调用进一步的方法,则很难孤立地测试A&B。如果可以模拟A,B和C,则可以始终测试MAIN。
案例B:对于方法中有1个出口点与多个出口点有参数。有时,多个出口点可以使代码变得更简单,这使其更加可维护,而其他时候则不明显回报产生了什么影响,或者会发生回报,从而使其可维护效果降低。
选项1明确显示该算法,但是如果可以快速失控,则多个嵌套。在这种情况下,我肯定有选项2或一些聪明的布尔式变体(是的,Corey)。
选项3看起来很钝我。
案例A:第一个选项
案例B:第二选项