Wann verwenden wir Ruby-Modul vs Klassenzusammensetzung verwenden?

8

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?

    
codeObserver 02.04.2013, 01:46
quelle

4 Antworten

14

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:

%Vor%

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.

%Vor%

Sandi Metzs praktisches Objektorientiertes Design in Ruby ist ein ausgezeichnet Ressource für diese Themen.

    
Michael Stalker 18.12.2014, 14:39
quelle
1

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.

    
mudasobwa 02.04.2013 03:13
quelle
0

Module mixin ist mehr wie mehrfache Vererbung, also folgen Sie der üblichen Vererbung vs Zusammensetzungsregel - is-a oder has-a. Übrigens ist es include Helper , nicht require 'Helper' .

    
shock_one 02.04.2013 02:24
quelle
0

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.

    
Anh Nguyen 02.04.2013 02:33
quelle