Como faço para escrever um mixin Rubi higiênico?
Pergunta
Say Estou escrevendo um módulo mixin que adiciona funcionalidade a uma classe de terceiros. Obviamente, alguns dos métodos e variáveis ??de instância que eu quero tornar acessível para a classe de terceiros e seus clientes. Estes constituem a interface pública do módulo mixin.
Mas eu quero certa outros métodos e variáveis ??de instância a ser encapsulado. Eu não quero que eles sejam acessíveis para a classe Eu estou misturando em, e, em particular, eu não quero que eles para substituir acidentalmente, sombra, conflito, ou de outra forma interferir com os métodos da classe mixee ou variáveis ??de instância - ou aqueles que atualmente podem existir, ou aqueles que podem ser criados no futuro, se as modifica de terceiros a classe Eu estou misturando a.
Quais as precauções que eu preciso para tomar, se houver, para ter certeza que meu mixin é "higiênico" desta forma?
Solução
Criar um objeto separado para encapsular as variáveis ??de funcionalidade e de instância, e ter o mixin delegar os métodos de acesso público a esse objeto. Agora você só precisa associar um único variável de instância com o seu objeto. Você até poderia esquivar que armazenando a {Mixee => Delegado} Hash no módulo e fazendo uma pesquisa no início de cada misto no método.
Outras dicas
Talvez você poderia criar um sub-módulo para conter todos os métodos utilitários.
module Foo
module Utils
def self.answer
42
end
end
def helpme
"the answer is #{Utils.answer}"
end
end
include Foo
puts helpme