Domanda

Supponi di scrivere 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 clienti. Questi costituiscono l'interfaccia pubblica del modulo mixin.

Ma desidero incapsulare alcuni altri metodi e variabili di istanza. Non voglio che siano accessibili alla classe in cui mi sto mescolando, e in particolare non voglio che abbiano accidentalmente l'override, l'ombra, il conflitto o interferiscano in altro modo con i metodi o le variabili di istanza della classe mixee - sia quelli che potrebbero attualmente esistere o quelli che potrebbero essere creati in futuro se la terza parte modifica la classe in cui mi sto mescolando.

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

È stato utile?

Soluzione

Crea un oggetto separato per incapsulare la tua funzionalità e le variabili di istanza e fai in modo che il mixin deleghi i metodi accessibili pubblicamente a quell'oggetto. Ora devi solo associare una variabile di singola istanza al tuo oggetto. Potresti anche schivarlo memorizzando un {Mixee = > Delegato} Hash nel modulo e ricerca all'inizio di ogni metodo misto.

Altri suggerimenti

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top