【问题标题】:What should I use to share functionality, module or class?我应该使用什么来共享功能、模块或类?
【发布时间】: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

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

【问题讨论】:

标签: ruby oop


【解决方案1】:

在她出色的书中Practical Object-Oriented Design in RubySandi Metz 很好地描述了这些考虑因素。

简而言之,正如@w0lf 在他对该问题的评论中提到的那样,除非Foo 是一个 Bar 你想使用组合。

【讨论】:

    【解决方案2】:

    如果你要在不存在Foo(或任何其他类)的情况下使用Bar,那么你需要将Bar定义为一个独立的类,这意味着你需要通过继承Bar Foo.

    如果您打算使用Bar 仅将功能添加到Foo(或任何其他类)或修改它们,那么您应该将Bar 定义为一个模块。另请注意,只有当您第一次创建Foo 时,您才能通过Foo 继承Bar,这意味着事后添加功能通常必须作为包含模块而不是继承类来完成。

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

    【讨论】:

      【解决方案3】:

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

      如果你有真正的继承然后使用它。

      【讨论】:

        猜你喜欢
        • 2018-04-16
        • 1970-01-01
        • 2020-05-03
        • 2017-08-04
        • 2018-08-23
        • 1970-01-01
        • 1970-01-01
        • 2021-01-10
        • 1970-01-01
        相关资源
        最近更新 更多