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

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

我需要采取什么预防措施,以确保我的mixin是“卫生的”。这样吗?

有帮助吗?

解决方案

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

其他提示

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

module Foo
  module Utils
    def self.answer
      42
    end
  end
  def helpme
    "the answer is #{Utils.answer}"
  end
end
include Foo
puts helpme
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top