2009-07-31 15 views
5

Dire che sto scrivendo un modulo mixin che aggiunge funzionalità a una classe di terze parti. Ovviamente alcuni dei metodi e delle variabili di istanza che voglio rendere accessibili alla classe di terze parti e ai suoi client. Questi costituiscono l'interfaccia pubblica del modulo mixin.Come si scrive un mix Rubino igienico?

Ma voglio che altri metodi e variabili di istanza vengano incapsulati. Non voglio che siano accessibili alla classe in cui mi sto mescolando, e in particolare non voglio che si sovrappongano accidentalmente, ombre, conflitti o interferiscano in altro modo con i metodi della classe mixee o le variabili di istanza - o quelli che al momento potrebbe esistere o che potrebbe essere creato in futuro se la terza parte modifica la classe in cui mi sto mescolando.

Quali precauzioni devo prendere, se ce ne sono, per assicurarsi che il mio mixin sia "igienico" in questo modo?

risposta

2

Creare un oggetto separato per incapsulare le funzionalità e le variabili di istanza e fare in modo che il mixin deleghi i metodi accessibili pubblicamente a tale oggetto. Ora devi solo associare una singola variabile di istanza al tuo oggetto. Potresti anche schivarlo memorizzando un hash {Mixee => Delegate} nel modulo e facendo una ricerca all'inizio di ogni metodo misto.

1

Forse potresti creare un sottomodulo per contenere tutti i metodi di utilità.

module Foo 
    module Utils 
    def self.answer 
     42 
    end 
    end 
    def helpme 
    "the answer is #{Utils.answer}" 
    end 
end 
include Foo 
puts helpme 
Problemi correlati