Eine ähnliche Frage wurde schon früher gestellt, aber ich frage speziell nach der Verwendung von Komposition als Alternative zur Verwendung von Modul-Mixins.
%Vor%Wenn ich eine Klasse "verwenden", aber nicht erben muss, würde ich sie einfach komponieren und verwenden.
%Vor%Warum würde ich gerne ein Modul dafür erstellen:
%Vor% Der einzige Unterschied, den ich sehe, ist, dass nicht viele Helper
Objekte herumliegen, wenn ich Module verwende. Aber ich sehe nichts mit mehr herumliegenden Gegenständen als mit weniger großen Objekten.
Außerdem weiß ich nicht, ob ich es in der Zukunft unterklassieren muss. Wie also entscheide ich, ob die Benutzer meiner Bibliothek ein Modul-Mixin verwenden möchten oder die Komposition verwenden möchten?
Wenn die Beziehung zwischen Helper
und der MyStuff
-Klasse eine Eigentumsform ist, verwenden Sie Komposition . Dies wird als "has-a" -Beziehung bezeichnet. Angenommen, Sie haben Person
class und Car
class. Sie würden Komposition verwenden, weil eine Person ein Auto hat:
Wenn Helper
"wie" MyStuff
funktioniert, verwenden Sie eine Modul-Kombination . Helper
übernimmt in diesem Fall die Rolle von MyStuff
. Dies ist ein bisschen anders als eine "ist-a" -Beziehung , was bedeutet, dass Sie traditionelle Vererbung verwenden sollten. Angenommen, wir haben eine Person
-Klasse und ein Sleeper
-Modul. Eine Person übernimmt manchmal die Rolle eines Schläfers, aber auch andere Objekte - Instanzen von Dog
, Frog
oder vielleicht sogar Computer
. Jede dieser anderen Klassen repräsentiert etwas, das schlafen gehen kann.
Sandi Metzs praktisches Objektorientiertes Design in Ruby ist ein ausgezeichnet Ressource für diese Themen.
Das ist eine Frage von " Duck Typing ". Wenn Sie möchten, dass sich Ihre Klasse wie ein Helper
verhält, tun Sie include
. Unabhängig davon, ob Sie Helper
behavior einkapseln, ist die richtige Wahl require
.
Mischen Enumerable
in, geben Sie Ihrer Klasse die riesige Last von Methoden, indem Sie das einzige implementieren each
Methode. Wrapping Array
Sie können die Iteration von anderen ausblenden und sie nur zum Speichern Ihrer Daten verwenden. Und umgekehrt.
Es gibt ein paar Dinge, die ich teilen kann:
Falls Sie gewöhnliche Verhaltensweisen in verschiedenen Klassen und Modulen teilen müssen, sollten Sie es zu Modulen machen, damit Sie später einfach include
der Module verwenden können, wo immer Sie möchten. Es wird auch dem Test helfen, da es bereits DRY ist.
Im Falle der Verantwortung können Sie neue Module erstellen, um die Lesbarkeit der Codebasis zu verstehen und zu verbessern. Es würde helfen, die Größe Ihrer Hauptklassen zu reduzieren, die einfach zu befolgen und zu pflegen sein sollten.
Eine Sache, die Sie vielleicht bemerken, ist, dass include
Ihrem instance
Funktionalitäten hinzufügt, wo extend
auf Class
selbst wirkt.
Tags und Links ruby inheritance multiple-inheritance mixins composition