我应该用什么来共享功能,模块或类?

时间:2016-02-16 10:43:41

标签: ruby oop

我有一个在两种情况下看起来和工作原理相同的代码:

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

在设计多个模型共享的功能时,我更喜欢使用什么?

3 个答案:

答案 0 :(得分:2)

在她精彩的书中Practical Object-Oriented Design in Ruby Sandi Metz很好地描述了这些考虑因素。

简而言之,正如他对该问题的评论中提到的@w0lf,除非Foo Bar,否则您希望使用构图。

答案 1 :(得分:1)

如果您要使用Bar而不存在Foo(或任何其他类),则需要将Bar定义为独立类,这意味着您需要通过Bar继承Foo

如果您仅使用BarFoo(或任何其他类)添加功能或修改它们,则应将Bar定义为模块。另请注意,只有在您第一次创建Bar时才可以继承Foo Foo,这意味着事后补充 - 添加功能通常必须包含模块而不是而不是继承一个班级。

简而言之,如果Bar具有主要存在,那么让Bar成为一个类,并通过Foo继承它。如果Foo具有主要存在,则定义模块Bar,并将其包含在Foo中。

答案 2 :(得分:0)

我经常使用模块mixins来引入特殊功能。可能是从一些没有继承的模型的文本属性中清除或过滤禁止的单词。

如果你有真正的继承,那就使用它。