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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top