¿Cómo escribo una mezcla de rubíes higiénica?
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?
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