В общем, избегайте использования mixins для доступа к переменным-членам: это очень жесткая форма связывания, которая может сделать ненужным дальнейший рефакторинг.
Одна полезная стратегия для 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"
Что если вам нужно включить Миксин в этот класс?
class Foo
def initialize
@text = "Text that has nothing to do with the mixin"
end
end
Использование общих и общих имен данных в миксинах может привести к конфликтам, когда включающий класс использует одно и то же имя. В этом случае пусть миксин ищет данные с менее распространенным именем:
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"
Таким образом, средство доступа действует как своего рода «сопоставитель импеданса» или «транслятор» между данными микширования и данными включающего класса.