Wie kann ich einen hygienischen Ruby-mixin schreiben?
Frage
Sagen, dass ich einen mixin Modul bin zu schreiben, die Funktionalität zu einer Drittanbieter-Klasse erstellt. Offensichtlich einige der Methoden und Instanzvariablen I zugänglich für die Drittanbieter-Klasse und ihre Kunden machen wollen. Diese bilden die öffentliche Schnittstelle des mixin Modul.
Aber ich möchte einige andere Methoden und Instanzvariablen gekapselt werden. Ich will sie nicht zu der Klasse zugänglich sein, die ich in bin Mischen und insbesondere ich will sie nicht versehentlich außer Kraft zu setzen, Schatten, Konflikt oder auf andere Weise mit der mixee Klasse Methoden oder Instanzvariablen stören - entweder solche, das kann zur Zeit vorhanden ist, oder solche, die in der Zukunft geschaffen werden, wenn die Drittanbieter die Klasse ändern in ich zu mischen.
Welche Vorsichtsmaßnahmen müssen ich ergreifen müssen, um, falls vorhanden, um sicherzustellen, dass mein mixin „hygienisch“ in dieser Art und Weise ist?
Lösung
Erstellen Sie ein separates Objekt Ihre Funktionalität und Instanzvariablen zu kapseln, und hat die mixin Delegierten die öffentlich zugänglichen Methoden für dieses Objekt. Jetzt müssen Sie nur ein einziges Instanz-Variable mit Ihrem Objekt verknüpfen. Man könnte sogar ausweichen, dass durch ein {Mixee => Delegieren} Hash in dem Modul und macht einen Nachschlag zu Beginn eines jeden Mischmethode zu speichern.
Andere Tipps
Vielleicht könnten Sie ein Sub-Modul erstellen, die alle Utility-Methoden enthalten.
module Foo
module Utils
def self.answer
42
end
end
def helpme
"the answer is #{Utils.answer}"
end
end
include Foo
puts helpme