优雅的设计是否意味着删除所有'if-else'?或者我们需要平衡

时间:2012-05-14 03:40:33

标签: design-patterns

我不想说“所有”

是那么极端

我的印象是漂亮的设计除去了很多其他的东西 多态性取代了switch-case。今天我读了另一个主题,它使用继承来删除if-else。

根据我的理解,设计通常意味着让人们对程序中的概念感到熟悉,以便人们可以轻松地更改/扩展程序。但有时我觉得人们也很方便“if-else”。

是否有一些指导方针,以便有时我们应该更喜欢OO概念,而其他情况我们应该只使用'if-else'

4 个答案:

答案 0 :(得分:1)

我认为我们需要区分重构复杂的if-else语句和用于类层次结构的if-else逻辑。

我们始终需要if-else块,您的代码仍然可以优雅。但是像所有代码一样,它必须保持可读性。

if-esle块在用于检查类层次结构时不优雅。例如:

if(object.instanceof derivedClassA) {
    object.doMethod();
}
else if(object.instanceof derivedClassB) {
    ....
}
else if(object.instanceof baseClass) {
}
...

这可以使用OOP技术处理 ,例如继承和多态。但是,与任何旨在改进代码的技术一样,OOP可能被滥用和过度使用。我总是尝试使用Strategy design pattern来避免过度使用继承,这会促使优先HAS-A关系超过IS-A

答案 1 :(得分:0)

在这种情况下可能适用的一个惯例是好的旧“三法则”:

http://en.wikipedia.org/wiki/Rule_of_three_(computer_programming

答案 2 :(得分:0)

对此有一些激烈的观点和观点:http://www.antiifcampaign.com/

重要的是要注意,有许多语言没有多态性,并且在许多情况下,即使语言支持,运算符多态性也不能在性能方面得到证明。例如,N体问题将是一个使用多态的地方,即使它可以工作。

我喜欢SO anti-if campaign

这个主题

答案 3 :(得分:0)

if ... else ...

查看顺序代码时,

是最具可读性的。当我们嵌套或链接它们时会出现问题,因为读者经常无法遵循逻辑。

如果星期五   早点回家 否则如果周三   喝咖啡 否则,如周六或周日   待在家里

嵌套if语句更令人困惑。

在这些情况下,switch类型语句更清晰,因为它看起来像一个表 - 这也是读者认为适合多种选择的风格

切换日   案例周三:喝咖啡   星期五:早点回家   星期六,周日:留在家里

当我们提前知道该选项时,有更好的方法来处理它。

def测试(v):   如果v =='a':     做一点事   elif v =='b':     做别的事

试验( 'a')的 试验( 'B')

效率低且不清楚。最好使用单独命名的方法,或者如果v来自外部源,则使用字典。

选择=   a:做点什么   b:做别的事情

选择[ '一']() 选择[ 'B']()

最后一个例子是sudo-code和coffeescript。的?在函数调用之前意味着如果字典引用无效则不进行调用。

我刚读过安迪的回应。三个规则无处不在 - 而且有充分的理由。正如我上面所讨论的,太多的信息会引起混淆。我在博客中讨论了三条规则 - 特别是在谈论分解设计时。