Pregunta

Digamos que estoy escribiendo un módulo mixin que agrega funcionalidad a una clase de terceros. Obviamente, algunos de los métodos y variables de instancia que quiero hacer accesibles a la clase de terceros y sus clientes. Estos constituyen la interfaz pública del módulo mixin.

Pero quiero que se encapsulen ciertos otros métodos y variables de instancia. No quiero que sean accesibles para la clase en la que me estoy mezclando, y en particular no quiero que anulen accidentalmente, sombreen, entren en conflicto o interfieran con los métodos de la clase mixee o las variables de instancia, ya sea eso puede existir actualmente, o los que pueden crearse en el futuro si el tercero modifica la clase en la que me estoy mezclando.

¿Qué precauciones debo tomar, si corresponde, para asegurarme de que mi mezcla sea "higiénica"? de esta manera?

¿Fue útil?

Solución

Cree un objeto separado para encapsular su funcionalidad y variables de instancia, y haga que el mixin delegue los métodos accesibles públicamente a ese objeto. Ahora solo necesita asociar una variable de instancia única con su objeto. Incluso podría esquivar eso almacenando un {Mixee = > Delegado} Hash en el módulo y haciendo una búsqueda al comienzo de cada método mixto.

Otros consejos

Quizás podría crear un submódulo para contener todos los métodos de utilidad.

module Foo
  module Utils
    def self.answer
      42
    end
  end
  def helpme
    "the answer is #{Utils.answer}"
  end
end
include Foo
puts helpme
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top