【发布时间】:2015-06-18 14:26:45
【问题描述】:
Sandi Metz 在 GORUCO 的 SOLID OOPS 概念 中说,Ruby 中存在if..else 块可以被认为是对开闭原则的偏离。可以使用哪些方法来避免不紧急的if..else 条件?我尝试了以下代码:
class Fun
def park(s=String.new)
puts s
end
def park(i=Fixnum.new)
i=i+2
end
end
发现函数重载在 Ruby 中不起作用。还有哪些其他方法可以使代码服从 OCP?
我本来可以直接去的:
class Fun
def park(i)
i=i+2 if i.class==1.class
puts i if i.class=="asd".class
end
end
但这违反了OCP。
【问题讨论】:
-
我更正了它,因为与 OP 的问题无关,只是一个错字。也许一个有效的答案可能会指出无法应用 Sandi Metz 的演示文稿(我不确定),并且在不涉及设计意见的情况下,也许可以解释为什么许多动态语言会避免基于参数的方法重载。
-
我认为 OCP 背后的想法是
i应该产生自己的结果 - 而不是 park() 根据i的类型计算结果。 -
应用“用多态重构替换条件”。这真的没那么难。 Smalltalk 甚至没有条件(或循环,就此而言),但您可以在其中非常优雅地表达您想要的一切。面向对象的语言不需要条件,反正运行时多态动态消息分发功能更强大。
-
@JörgWMittag 你能解释一下吗
-
@Anony-mouse 您还有其他问题吗? stackoverflow.com/q/30922788/438992
标签: ruby oop refactoring solid-principles