我有一个在两种情况下看起来和工作原理相同的代码:
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
在设计多个模型共享的功能时,我更喜欢使用什么?
答案 0 :(得分:2)
在她精彩的书中Practical Object-Oriented Design in Ruby Sandi Metz很好地描述了这些考虑因素。
简而言之,正如他对该问题的评论中提到的@w0lf,除非Foo
是 Bar
,否则您希望使用构图。
答案 1 :(得分:1)
如果您要使用Bar
而不存在Foo
(或任何其他类),则需要将Bar
定义为独立类,这意味着您需要通过Bar
继承Foo
。
如果您仅使用Bar
向Foo
(或任何其他类)添加功能或修改它们,则应将Bar
定义为模块。另请注意,只有在您第一次创建Bar
时才可以继承Foo
Foo
,这意味着事后补充 - 添加功能通常必须包含模块而不是而不是继承一个班级。
简而言之,如果Bar
具有主要存在,那么让Bar
成为一个类,并通过Foo
继承它。如果Foo
具有主要存在,则定义模块Bar
,并将其包含在Foo
中。
答案 2 :(得分:0)
我经常使用模块mixins来引入特殊功能。可能是从一些没有继承的模型的文本属性中清除或过滤禁止的单词。
如果你有真正的继承,那就使用它。