2010-04-29 54 views
1

您有一系列要执行的功能。案例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

我不认为有可能获得任何超过一堆意见作为答案。 – danben 2010-04-29 14:35:30

+0

我希望有合理的意见,以便我可以为自己做出决定。现在我不一致。 – 2010-04-29 14:40:20

回答

14

案例A:1.
推理:由于没有一个函数相互依赖,因此在main函数中按顺序调用它们会显示一系列逻辑事件。在每个函数结束时,他们称之为下一个代码的替代方案看起来像意大利面条代码,并且很难让有人阅读您的程序。案例B:以上都不是。

function main() { 
    return a() && b() && c(); 
} 

推理:看来你真的不关心的返回值,你只是想打出来,如果早期的功能之一返回一定的价值。您可以返回所有这些函数的“结果”结果,并且如果其中任何一个返回false,代码将提前结束。所以,如果a返回false,那么b不会被执行。将它们全部放在一行上很容易阅读,简洁地表明它们彼此依赖。

+1

+1优雅 – 2010-04-29 14:39:06

0

方案A:第一个选项

案例B:第二个选项

2

方案A:第一个选项

如果你使用第二个选项,你使它更难以再使用,因为你自动拉b和c。案例二:取决于 - 做一个,B和C自然返回布尔值,或其他值来检查?我仍然不会打电话给b和b打电话给c,因为那时你引入了一个不必要的依赖关系。如果返回值是有意义的,我倾向于选项2 - 减少嵌套是一件好事。

1

首先,最好的答案将取决于上下文中的代码是在多个方面 - 有没有人权利除'它取决于'的答案。

然而,考虑在面值,情况A:

选项1示出了算法的顶层视图。

选项2隐藏此项,隐藏对B & C的调用。发现C被称为可能是相当多的工作。另外,如果他们接着调用更多的方法,则很难单独测试A & B.如果A,B和C可以被嘲弄,主要总是可以被测试。

案例B: 在一个方法中,通常有1个出口点与多个出口点有关的参数。有时候多个退出点可以使代码变得更简单,这使得代码更易于维护,有时候不明显返回会产生什么影响,或者返回会发生,这使得它不易维护。

选项1明确显示算法,但多个嵌套if可以快速失控。 在这种情况下,我肯定会有选项2或一些聪明的布尔型(是的,corey)。

选项3看起来对我来说简直是愚蠢的。