Как мне написать гигиенический рубиновый миксин?

StackOverflow https://stackoverflow.com/questions/1210565

  •  06-07-2019
  •  | 
  •  

Вопрос

Скажем, я пишу смешанный модуль, который добавляет функциональность в сторонний класс. Очевидно, что некоторые методы и переменные экземпляра я хочу сделать доступными для стороннего класса и его клиентов. Они составляют публичный интерфейс модуля 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top