2009-07-31 11 views
5

Digamos que estoy escribiendo un módulo de mezcla que agrega funcionalidad a una clase de terceros. Obviamente, algunos de los métodos y variables de instancia que quiero hacer accesibles para la clase de terceros y sus clientes. Estos constituyen la interfaz pública del módulo mixin.¿Cómo escribo una mezcla de Ruby higiénica?

Pero quiero que se encapsulen ciertos otros métodos y variables de instancia. No quiero que sean accesibles para la clase con la que me estoy mezclando, y en particular, no quiero que anulen accidentalmente, sombreen, entren en conflicto o interfieran con los métodos o las variables de instancia de la clase mixee, ya sea que 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 es que las hay, para asegurarme de que mi mixin sea "higiénica" de esta manera?

Respuesta

2

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

1

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 
Cuestiones relacionadas