我不想说“所有”
是那么极端我的印象是漂亮的设计除去了很多其他的东西 多态性取代了switch-case。今天我读了另一个主题,它使用继承来删除if-else。
根据我的理解,设计通常意味着让人们对程序中的概念感到熟悉,以便人们可以轻松地更改/扩展程序。但有时我觉得人们也很方便“if-else”。
是否有一些指导方针,以便有时我们应该更喜欢OO概念,而其他情况我们应该只使用'if-else'
答案 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。的?在函数调用之前意味着如果字典引用无效则不进行调用。
我刚读过安迪的回应。三个规则无处不在 - 而且有充分的理由。正如我上面所讨论的,太多的信息会引起混淆。我在博客中讨论了三条规则 - 特别是在谈论分解设计时。