Ruby 我应该使用什么来共享功能、模块或类?
我有一个代码,它在两种情况下的外观和工作原理相同,或者:Ruby 我应该使用什么来共享功能、模块或类?,ruby,oop,Ruby,Oop,我有一个代码,它在两种情况下的外观和工作原理相同,或者: class Bar def baz puts 3 end end class Foo < Bar end Foo.new.baz #=> 3 在设计由多个模型共享的功能时,我更喜欢使用什么?在她精彩的著作《Sandi Metz》中,她很好地描述了这些注意事项 简言之,正如他在对问题的评论中所提到的,除非Foo是一个条,否则您需要使用合成。我经常使用模块混合来引入特殊功能。可能是从一些没有继承的模型的文本属
class Bar
def baz
puts 3
end
end
class Foo < Bar
end
Foo.new.baz
#=> 3
在设计由多个模型共享的功能时,我更喜欢使用什么?在她精彩的著作《Sandi Metz》中,她很好地描述了这些注意事项
简言之,正如他在对问题的评论中所提到的,除非
Foo
是一个条
,否则您需要使用合成。我经常使用模块混合来引入特殊功能。可能是从一些没有继承的模型的文本属性中清除或过滤禁止的单词
如果你有真正的继承,那么就使用它。如果你打算在不存在
Foo
(或任何其他类)的情况下使用Bar
,那么你需要将Bar
定义为一个独立的类,这意味着你需要通过Foo
继承Bar
如果您打算使用
Bar
仅向Foo
(或任何其他类)添加功能或修改功能,则应将Bar
定义为一个模块。还请注意,只有在第一次创建Foo
时,才可以通过Foo
继承Bar
,这意味着事后添加功能通常必须包括一个模块,而不是继承一个类
简而言之,如果
Bar
主要存在,那么让Bar
成为一个类,并通过Foo
继承它。如果Foo
主要存在,那么定义一个模块Bar
,并将其包含在Foo
中,问问自己Foo
是否真的是Baz
。如果是这样的话,继承就可以了。一般来说,您应该支持并选择模块方法。@w0lf这是有意义的,我只是想了解,在设计由多个模型共享的功能时,我们更喜欢类而不是模块。并不意味着继承而不是模块。这意味着:如果您的模型具有复杂的逻辑,则最好将该逻辑单独放入一个类中。主要原因是,单独测试一个类,然后测试包含在多个类中的同一个模块更容易桑迪Metz@Stefan桑迪的精彩演讲,我喜欢!
module Bar
def baz
puts 3
end
end
class Foo
include Bar
end
Foo.new.baz
#=> 3