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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top