我如何编写卫生的Ruby mixin?

时间:2009-07-31 03:35:06

标签: ruby mixins hygiene

假设我正在编写一个为第三方类添加功能的mixin模块。显然,我希望第三方类及其客户端可以访问一些方法和实例变量。这些构成了mixin模块的公共接口。

但我想要封装某些其他方法和实例变量。我不希望它们可以被我混入的类访问,特别是我不希望它们意外地覆盖,阴影,冲突或以其他方式干扰mixee类的方法或实例变量 - 或者那些如果第三方修改了我正在混合的类,那么当前可能存在,或者将来可能创建的那些。

我需要采取哪些预防措施,以确保我的mixin以这种方式“卫生”?

2 个答案:

答案 0 :(得分:2)

创建一个单独的对象来封装您的功能和实例变量,并让mixin将公共可访问的方法委托给该对象。现在,您只需要将单个实例变量与对象相关联。您甚至可以通过存储{Mixee =>委托}在模块中散列并在每个混合方法的开头进行查找。

答案 1 :(得分:1)

也许您可以创建一个子模块来包含所有实用程序方法。

module Foo
  module Utils
    def self.answer
      42
    end
  end
  def helpme
    "the answer is #{Utils.answer}"
  end
end
include Foo
puts helpme