Frage

Ich lese Ruby auf und lernte über seine Mixins Muster, konnte aber nicht von vielen nützlichen mixin Funktionalität denkt (weil ich auf diese Weise am ehesten zu denken, nicht gewohnt bin). Also ich frage mich, was gute Beispiele für nützliche Mixin Funktionalität sein?

Danke

Edit: Ein wenig Hintergrund. Ich komme aus C ++ und andere Objekt Sprachen, aber meine Zweifel, hier ist, dass Ruby sagt, dass es Mixins nicht vererben, aber ich halte Mixins als Mehrfachvererbung zu sehen, so dass ich fürchte, ich versuche, sie zu kategorisieren zu früh in meiner Komfortzone und nicht wirklich verstehen was ein mixin ist.

War es hilfreich?

Lösung

Nun das übliche Beispiel, das ich denke, ist Persistenz

module Persistence
    def load sFileName
            puts "load code to read #{sFileName} contents into my_data"
    end
        def save sFileName
        puts "Uber code to persist #{@my_data} to #{sFileName}"
    end

end

class BrandNewClass
    include Persistence
    attr :my_data

        def data=(someData)
        @my_data = someData
    end
end

b = BrandNewClass.new
b.data = "My pwd"
b.save "MyFile.secret"
b.load "MyFile.secret"

Stellen Sie sich das Modul durch ein Ruby-ninja geschrieben ist, die den Zustand Ihrer Klasse in einer Datei bestehen bleibt.
Jetzt nehme ich eine ganz neue Klasse zu schreiben, kann ich die Funktionalität der Persistenz Wiederverwendung, indem sie in dem Mischen von include ModuleILike sagen. Sie können auch Module zur Laufzeit enthalten. Ich erhalte Last und kostenlos Methoden sparen, indem es einfach zu mischen. Diese Methoden wie die, die sind, die Sie sich für Ihre Klasse geschrieben. Code / Verhalten / Funktionalität Wiederverwendung ohne Vererbung!

Also, was Sie tun, ist mit Methoden der Methodentabelle für Ihre Klasse (nicht wörtlich korrekt, aber schließen).

Andere Tipps

Sie werden in der Regel hinzufügen, irgendeine Form von Standardfunktionalität zu einer Klasse verwendet, ohne alles neu definieren zu müssen. Sie können sich wahrscheinlich ein bisschen wie Schnittstellen in Java von ihnen denken, sondern nur eine Liste von Methoden definieren, die umgesetzt werden müssen, viele von ihnen werden eigentlich sein implementiert durch das Modul mit.

Es gibt einige Beispiele in der Standardbibliothek:

Singleton - Ein Modul, das in jeder Klasse gemischt werden kann, um es ein Singleton zu machen. Die Methode initialize wird privat, und eine Instanzmethode hinzugefügt, die dafür sorgt, dass es immer nur eine Instanz dieser Klasse in der Anwendung ist.

Vergleichbar - Wenn Sie das Modul in einer Klasse gehören, die Definition der <=> Methode, die die aktuelle Instanz mit einem anderen Objekt vergleicht und sagt, die größer ist, ist genug =, >, und zwischen? Methoden.

Enumerable - Mit dem in diesem Modul Mischen ist und eine jedes Methode, erhalten Sie Unterstützung für alle andere verwandte Methoden wie collect, injiziert, auswählen und ablehnen. Wenn es auch die Methode <=> bekommt, dann wird es auch Art unterstützen, min und max.

DataMapper ist auch ein interessantes Beispiel dafür, was mit einem einfachen Anweisung include, wobei eine Standardklasse, und um die Möglichkeit zu bestehen, es zu einem Datenspeicher erfolgen.

In Rubin, der Grund, dass Mixins ist nicht Mehrfachvererbung ist, dass mixin Methoden kombiniert, ist eine einmalige Sache. Dies wäre nicht so ein großes Problem sein, mit der Ausnahme, dass Ruby-Module und Klassen sind offen für Änderungen bei. Das bedeutet, dass, wenn Sie ein Modul zu Ihrer Klasse mixin, dann ein Verfahren zum Modul hinzufügen, die Methode wird nicht zu Ihrer Klasse zur Verfügung steht; wo, wenn Sie es in umgekehrter Reihenfolge getan haben, es würde.

Es ist wie eine Eistüte zu bestellen. Wenn Sie Schokostreusel und Toffee-Bits als Mixins, und gehen weg mit dem Kegel, welche Art von Eistüte Sie wird sich nicht ändern, wenn jemand fügt bunten Streuseln auf die Schokostreusel bin zurück auf der Eisdiele erhalten. Ihre Klasse, die Eistüte, wird nicht verändert, wenn das mixin Modul, das ist von besprüht ist. Die nächste Person zu bedienen, dass mixin Modul die Änderungen sehen werden.

Wenn Sie ein Modul in Ruby include, ruft sie Module#append_features an diesem Modul, das eine Kopie des Moduls Methoden zum Inklusions einmal hinzufügen.

Mehrfachvererbung, wie ich es verstehe, ist eher wie eine Delegation. Wenn Ihre Klasse nicht weiß, wie etwas zu tun, fragt er seine Eltern. In einer offenen Klasse Umgebung der Eltern eine Klasse modifiziert worden sein, nachdem die Klasse erstellt wurde.

Es ist wie eine RL Eltern-Kind-Beziehung. Ihre Mutter vielleicht haben gelernt, wie man jongliert, nachdem Sie geboren wurden, aber wenn jemand Sie fragt, zu jonglieren und du sie bitten, entweder zeigen Ihnen, wie (kopieren Sie es, wenn Sie es brauchen) oder es für Sie tun (reine Delegation), dann hat sie ‚ll an diesem Punkt der Lage sein, auch wenn Sie erstellt wurden, bevor ihre Fähigkeit war zu jonglieren.

Es ist möglich, dass Sie ein Rubin-Modul ändern könnten ‚umfassen‘ mehr wie Mehrfachvererbung zu handeln, indem Module#append_features Modifizieren eine Liste von includers zu halten, und ihnen dann zu aktualisieren, um den method_added Rückruf verwenden, aber dies wäre eine große Verschiebung von Standard sein Ruby und könnte wichtige Probleme verursachen, wenn sie mit anderem Code zu arbeiten. Sie könnten besser ein Module#inherit Methode erschaffen, die include genannt und behandelt Delegation als auch.

Wie bei einem realen Welt Beispiel ist Enumerable genial. Wenn Sie #each und umfassen Enumerable in Ihrer Klasse definieren, dann das gibt Ihnen eine ganze Reihe von Iteratoren zugreifen, ohne dass Sie jede und jeder codieren müssen.

Es wird weitgehend verwendet als eine Mehrfachvererbung in C ++ oder Implementierung Schnittstellen in Java / C # verwenden kann. Ich bin mir nicht sicher, wo Ihre Erfahrung liegt, aber wenn man diese Dinge getan haben, bevor, Mixins sind wie würden Sie sie in Ruby tun. Es ist eine systematisierte Weise Funktionalität in Klassen eingespritzt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top