【发布时间】:2016-02-16 10:43:41
【问题描述】:
我的代码在这两种情况下看起来和工作方式都一样:
class Bar
def baz
puts 3
end
end
class Foo < Bar
end
Foo.new.baz
#=> 3
或:
module Bar
def baz
puts 3
end
end
class Foo
include Bar
end
Foo.new.baz
#=> 3
在设计由多个模型共享的功能时,我应该更喜欢使用什么?
【问题讨论】:
-
问问自己
Foo是否真的是Baz。如果是这样,继承可能没问题。不过,一般来说,您应该支持composition over inheritance 并选择模块方法。 -
在设计由多个模型共享的功能时,优先使用类而不是模块。 并不意味着继承而不是模块。这意味着:如果您的模型具有复杂的逻辑,则最好将该逻辑单独放入一个类中。人为原因是,单独测试一个类,然后测试包含在多个类中的同一个模块更容易。
-
@Stefan Sandi 的精彩演讲,喜欢它!