Считается ли плохой практикой ссылать методы доступа на расширенный объект из метода mixin? Упрощенный пример:
module WindInstrument
def play
mouthpiece.blow #requires a mouthpiece
end
end
class Saxophone
attr_reader :mouthpiece
def initialize
@mouthpiece = Mouthpiece.new
end
include WindInstrument
end
Saxophone.new.play
В этом случае я бы просто перенес требование о мундштуке непосредственно в модуль WindInstrument, но как насчет более сложного сценария, где действительно имеет смысл жить аксессором на расширенном объекте? Это просто проблема неуместного разделения интересов?
Миксины полезны для добавления инкапсулированного поведения, которое не требует знания состояния расширенного объекта. На самом деле, моя интуиция говорит мне, что миксин не должен знать о каком-либо состоянии. Если ему нужны знания о состоянии, я бы обычно использовал один из двух вариантов:
Поместите состояние в класс и добавьте его через композицию, а не через иерархию наследования. Моя проблема с этим заключается в том, что я знаю rubyists там есть создавая миксины, которые обращаются к состоянию, что делает более читабельным, но менее интуитивным (для меня) дизайном.
Передать мундштук в качестве параметра модулю. Даже я могу сказать, что это кажется мутным в дизайне и ощущается как мерзость в мировоззрении рубина.
Этот код беспокоит кого-то еще? Я знаю, что есть много умных людей, использующих рубин, поэтому я полагаю, что проблема моя. Что мне не хватает? Мне просто нужно расслабиться? Что бы вы сделали?