Как мне написать гигиенический рубиновый миксин?
Вопрос
Скажем, я пишу смешанный модуль, который добавляет функциональность в сторонний класс. Очевидно, что некоторые методы и переменные экземпляра я хочу сделать доступными для стороннего класса и его клиентов. Они составляют публичный интерфейс модуля mixin.
Но я хочу, чтобы некоторые другие методы и переменные экземпляра были инкапсулированы. Я не хочу, чтобы они были доступны для класса, с которым я смешиваюсь, и, в частности, я не хочу, чтобы они случайно переопределяли, затеняли, конфликтовали или иным образом вмешивались в методы класса mixee или переменные экземпляра - либо те, которые могут существовать в настоящее время или те, которые могут быть созданы в будущем, если сторонняя организация изменяет класс, в который я добавляю.
Какие меры предосторожности я должен предпринять, если таковые имеются, чтобы убедиться, что мой миксин "гигиенический"? таким образом?
Решение
Создайте отдельный объект для инкапсуляции вашей функциональности и переменных экземпляра, и пусть 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