Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 我应该使用什么来共享功能、模块或类?_Ruby_Oop - Fatal编程技术网

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