Was sind einige gute Beispiele für Mixins und oder Traits?
-
21-08-2019 - |
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.
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
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.