如何在一个mixin方法中访问一个实例变量?我可以想到两种方式,但两者似乎都有问题.
>让mixin方法直接访问实例变量,就像任何类的方法一样,例如self.text.这样做的问题是它限制了可以使用mixin方法的位置,并强制执行混合的类具有以特定方式命名的特定实例方法.
>将实例变量作为参数传递给mixin方法,这将导致如下代码:
例
self.do_something(self.text)
要么
@thing.do_something(@thing.text)
对我来说看起来很讨厌,不符合面向对象的原则.
有什么办法吗?我有权利关心吗?
解决方法
一般来说,避免使用mixin访问成员变量:这是一种非常紧凑的耦合形式,可以使未来的重构变得不必要.
一个有用的策略是Mixin总是通过访问器访问变量.所以,而不是:
#!/usr/bin/ruby1.8 module Mixin def do_something p @text end end class Foo include Mixin def initialize @text = 'foo' end end Foo.new.do_something # => "foo"
mixin访问由包含类定义的“文本”访问器:
module Mixin def do_something p text end end class Foo attr_accessor :text include Mixin def initialize @text = 'foo' end end Foo.new.do_something # => "foo"
如果您需要在本课中包含Mixin,该怎么办?
class Foo def initialize @text = "Text that has nothing to do with the mixin" end end
在包含类使用相同的名称时,在混合中使用通用和通用数据名可能会导致冲突.在这种情况下,让mixin以较不常见的名称查找数据:
module Mixin def do_something p mixin_text end end
并让include类定义适当的访问器:
class Foo include Mixin def initialize @text = 'text that has nothing to do with the mixin' @something = 'text for the mixin' end def mixin_text @something end end Foo.new.do_something # => "text for the mixin"
以这种方式,访问器在混合数据和包含类的数据之间作为一种“阻抗匹配器”或“翻译器”.