一般に、ミックスインがメンバー変数にアクセスすることは避けてください。これは、将来のリファクタリングを不必要に困難にする可能性がある結合の非常に緊密な形式です。
有用な戦略の 1 つは、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"
ミックスインは、包含クラスによって定義される「テキスト」アクセサーにアクセスします。
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
そして、包含クラスに適切なアクセサーを定義させます。
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"
このように、アクセサーは、ミックスインのデータと含まれるクラスのデータの間で、一種の「インピーダンス マッチャー」または「トランスレーター」として機能します。