So fügen Sie Ruby-Klassen mit Dekoratoren Funktionalität hinzu

Dekoratoren ermöglichen es uns, Objekten zur Laufzeit Verhalten hinzuzufügen, ohne andere Objekte der Klasse zu beeinflussen. Dekoratoren können angewendet werden, wenn Sie einer Klasse dynamisch Verantwortung hinzufügen oder entfernen müssen. Das Dekoratormuster ist eine hilfreiche Alternative zum Erstellen von Unterklassen. Sie verleihen einer Klasse zusätzliche Funktionalität und sorgen gleichzeitig dafür, dass die öffentliche API konsistent bleibt. Schauen wir uns ein Beispiel an, um die Bedeutung von Ruby Decorators zu verstehen. Stellen Sie sich vor, wir haben eine Tattoo-Klasse mit einer Preismethode, die 300 zurückgibt.
Klasse Tattoo def Preis 300 Ende Ende
Jetzt werden wir als Feature eine zusätzliche Farbe hinzufügen und den Preis um 150 erhöhen Der einfachste Weg besteht darin, eine TattooWithColor-Unterklasse zu erstellen, die in der Preismethode 450 zurückgibt.
Klasse TattooWithColor < Tattoo def Preis 450 Ende Ende
Als nächstes müssen wir ein großes Tattoo darstellen, das den Preis unserer Tattoos um 200 erhöht. Wir können dies mithilfe einer BigTattoo-Unterklasse von Tattoo darstellen.
Klasse BigTattoo < Tattoo def Preis 500 Ende Ende
Wir könnten auch größere Tattoos anfertigen lassen, wodurch unser BigTattoo möglicherweise noch teurer wird. Wenn wir bedenken würden, dass diese Tätowierungstypen mit Farben verwendet werden könnten, müssten wir die Unterklassen BigTattooWithColor und BiggerTattooWithColor hinzufügen. Mit dieser Methode erhalten wir insgesamt 6 Klassen. Verdoppeln Sie sogar die Zahl, wenn Sie diese Kombinationen mit zusätzlichen Designs auf dem Tattoo darstellen möchten.

Dynamisches Erben mit Modulen

Um unseren Code zu vereinfachen, können wir Module verwenden, um unserer Tattoo-Klasse dynamisch Verhalten hinzuzufügen. Schreiben wir hierfür die Module ColourTattoo und BigTattoo.
Modul ColourTattoo def Preis Super + 150 Ende Ende
Modul BigTattoo def Preis super + 200 Ende Ende
Jetzt können wir unsere Tattoo-Objekte mithilfe der Methode Object#extend dynamisch erweitern. tattoo = Tattoo.new tattoo.extend(ColorTattoo) tattoo.extend(BigTattoo) Dies ist eine gute Verbesserung gegenüber unserer vererbungsbasierten Implementierung. Anstelle von Unterklassen haben wir nur eine Klasse und drei Module. Wenn wir der Gleichung zusätzliches Design hinzufügen müssten, bräuchten wir nur vier Module statt zwölf Klassen.

Anwenden des Dekorationsmusters

Diese modulbasierte Lösung hat unseren Code erheblich vereinfacht, wir können ihn jedoch mithilfe des Decorators noch verbessern. Wir gehen davon aus, dass ein BiggerTatto dadurch entsteht, dass die Kosten für ein Tattoo zweimal um 150 erhöht werden. Mit unserem modulbasierten Ansatz können wir dies nicht erreichen. Es wäre verlockend, tattoo.extend(BigTattoo) zweimal aufzurufen, um BiggerTattoo zu erhalten. Das zweite Erweitern des Moduls hat keine Auswirkung, wenn wir bereits Erweiterungsmodule verwendet haben. Wenn wir weiterhin dieselbe Implementierung verwenden würden, bräuchten wir ein BiggerTattoo-Modul, das als Kosten Super + 300 zurückgibt. Stattdessen können wir einen kombinierbaren Dekorator verwenden, um komplexe Objekte zu erstellen. Wir beginnen mit einem Dekorator namens BigTattoo, der ein Tattoo-Objekt umhüllt.
Klasse BigTatto def initialize(tattoo) @tattoo = Tattoo Ende
def preis @tattoo.price + 150 end end
Ein größeres Tattoo kann jetzt erstellt werden, indem dieser Wrapper zweimal auf einem Tattoo-Objekt verwendet wird. tattoo = Tattoo.new big_tattoo= BigTattoo.new(tattoo) big_tattoo = BigTattoo.new(big_tattoo) Auf ähnliche Weise können wir Farbtätowierungen mit einem TattooWithColor-Dekorator darstellen. Mit nur drei Klassen sind wir nun in der Lage, 6 Arten von Tätowierungen darzustellen. Mit umfassender Expertise in allen Facetten der Ruby On Rails-Entwicklung sind wir bei Railscarma, bieten Ihnen eine breite Palette von Dienstleistungen an, die Sie bei der Umsetzung einer umfassenden personalisierten Strategie unterstützen, um mit Ihren Interessenten und Kunden zur richtigen Zeit und über die richtigen Kanäle zu kommunizieren. Für mehr Details Kontaktiere uns.

Abonnieren Sie die neuesten Updates

zusammenhängende Posts

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

de_DEGerman