设计Ruby API时的类与模块?

Sam*_*ang 7 ruby api inheritance design-patterns composition

当我阅读有关Ruby元编程的更多信息时,大多数时候我们发现至少有两种解决方案来解决问题.请看下面两个例子:

class Base
  def self.has_many(*args)
    # ...
  end
end

class Student < Base
  has_many :books
end
Run Code Online (Sandbox Code Playgroud)

另一种风格:

module Base
  def self.included(klass)
    klass.extend ClassMethods
  end

  module ClassMethods
    def has_many(*args)
      # ...
    end
  end
end

class Student
  include Base

  has_many :books
end
Run Code Online (Sandbox Code Playgroud)

但是当我们设计api时,我们必须决定使用哪一个,但我想问一下大多数人已经在他们的库中实现的想法和一些最佳实践.

edg*_*ner 5

如果您的API提供了将由客户端扩展的基本功能,那么您应该更喜欢继承.

如果您的API将使用自己的基本功能扩展各种客户端,那么您应该进行合成.