Ich bin verwirrt über einige der Notationen von UML-Klassendiagrammen.
Ich bin mir ziemlich sicher, was Assoziation bedeutet. Jede Beziehung zwischen Instanzen von zwei Klassen, bei der eine Instanz einer Klasse über eine Instanz der zweiten Klasse Bescheid wissen muss, um ihre Arbeit auszuführen, ist eine Assoziationsbeziehung. Eine Assoziation bedeutet oft, dass Klasse A einen Verweis (Feld) auf eine Instanz der Klasse B hat.
Ich habe jedoch Probleme zu verstehen, was die Aggregations- und Kompositionspfeile bedeuten. Ein Teil meiner Verwirrung wurde dadurch verursacht, dass ich auf unterschiedliche Definitionen dieser Notationen gestoßen bin.
Zwei Definitionen der Aggregationsnotation :
Definition 1: Eine Aggregationsnotation zwischen zwei Klassen ist immer dann geeignet, wenn eine Instanz der Klasse A eine Sammlung von Instanzen der Klasse B enthält (z. B. eine Liste, ein Array oder was auch immer).
Definition 2: Eine Aggregationsverbindung zwischen zwei Klassen ist geeignet, wenn eine Instanz von Klasse A einen Verweis auf eine Instanz von Klasse B enthält und die B-Instanz vom Lebenszyklus der A-Instanz abhängig ist. Bedeutung: Wenn die Instanz von Klasse A gelöscht wird, wird auch die Instanz von Klasse B gelöscht. Die Instanz von Klasse B ist vollständig in der Instanz von Klasse A enthalten, im Gegensatz zu der Instanz von Klasse A, die lediglich einen Verweis auf die Instanz von besitzt Klasse B (die reguläre Vereinigung ist).
Ich bin mir nicht sicher, was die Kompositionsnotation bedeutet und wie sie sich von der Aggregationsnotation unterscheidet.
Bitte klären Sie die Definitionen und helfen Sie mir zu verstehen. Konkrete Beispiele wären willkommen.
quelle
Antworten:
Die drei Verknüpfungen Assoziation, Aggregation und Komposition bilden eine Art Skala dafür, wie eng zwei Klassen miteinander verbunden sind.
Auf der einen Seite der Skala befindet sich die Assoziation, bei der Objekte der beiden Klassen voneinander wissen können, sich jedoch nicht gegenseitig auf die Lebensdauer auswirken. Die Objekte können unabhängig voneinander existieren und welches Klasse-A-Objekt weiß, welche Klasse-B-Objekte im Laufe der Zeit variieren können.
Am anderen Ende der Skala befindet sich die Komposition. Komposition stellt eine Teil-Ganz-Beziehung dar, sodass Klasse B ein integraler Bestandteil von Klasse A ist. Diese Beziehung wird normalerweise verwendet, wenn Objekte der Klasse A nicht logisch existieren können, ohne ein Objekt der Klasse B zu haben.
Die Aggregationsbeziehung liegt irgendwo zwischen diesen beiden Zielen, aber niemand scheint genau zuzustimmen, weshalb es auch keine allgemeingültige Definition dessen gibt, was eine Aggregation bedeutet. In diesem Sinne sind beide Definitionen, die Sie gefunden haben, korrekt. Wenn Sie 10 Personen befragen, riskieren Sie, 11 verschiedene Definitionen zu erhalten.
quelle
Zusammensetzung ist, wenn eine
object A
enthältobject B
und dieobject A
auch für die Erstellung der verantwortlich istobject B
.Zusammensetzungsbeziehung
Wir haben eine Klasse A, die von Klasse B verwendet wird.
Es gibt mehrere Möglichkeiten, wie die Komposition aussehen kann.
Direkte Initialisierungszusammensetzung:
Zusammensetzung der Konstruktorinitialisierung
Lazy Initialisierung Komposition
Sie sehen, dies schafft eine enge Beziehung zwischen den Klassen
A
undB
.B
Ohne kann Klasse einfach nicht existierenA
. Dies ist eine riesige Verletzung von Dependency Injection Prinzip , das sagt:Kompositionen sind manchmal sinnvoll, beispielsweise wenn Sie
new DateTime
in PHP odernew std::vector<int>
C ++ arbeiten. Aber meistens ist es eine Warnung, dass Ihr Code-Design falsch ist.In einem Fall, in dem
class A
das ein spezielles Objekt ist, das zum Cachen verwendet wird, wird das Objektclass B
immer mit der Implementierung von zwischengespeichertclass A
, und Sie haben keine Kontrolle, um es dynamisch zu ändern, was schlecht ist.Auch wenn Sie die Lazy-Initialization-Komposition verwendet haben , was bedeutet, dass Sie eine funktionierende Methode hätten
object B
, die alsuseA()
Methode bezeichnet wird und deren Erstellungobject A
fehlschlagen würde, ist Ihreobject B
plötzlich unbrauchbar.Aggregation hingegen ist eine Art der Beziehung, die dem DI-Prinzip folgt .
object B
Bedürfnisse zu verwendenobject A
, übergeben Sie sollten dann bereits Instanz erstelltobject A
zuobject B
, und soll die Schaffung vonobject A
fail, würde nichts an erster Stelle weitergegeben werden.Kurz gesagt, Aggregation ist eine UML-Darstellung für das Prinzip der Abhängigkeitsinjektion , sei es die Konstruktorinjektion, die Setterinjektion oder die Injektion öffentlicher Eigenschaften.
Dies sind alles Aggregationen
Die engste Konstruktorinjektion (
object B
kann nicht ohne existierenobject A
).Looser (Sie können oder können nicht im
object A
Inneren verwendenobject B
, aber wenn Sie dies tun, sollten Sie es wahrscheinlich zuerst einstellen).Über Setter:
Über öffentliches Eigentum:
Es gibt keine gute Möglichkeit, die Verwendung von Aggregation über Composition zu rechtfertigen, wenn Sie lediglich konkrete Implementierungen von Klassen verwenden. Wenn Sie jedoch mit dem Einfügen von Interfaces beginnen oder abstrakte C ++ - Klassen verwenden, ist dies plötzlich die einzige Möglichkeit erfülle deinen Vertrag.
quelle
Zusätzlich ein Auszug aus dem aktuellen UML-Standard:
11.5.4 Assoziationen - Semantik - Notation
9.5.4 Klassifikation - Eigenschaften - Notation
quelle
Ich habe bereits eine Antwort auf Stackoverflow gepostet .
Grundsätzlich ist eine Aggregation stärker als eine einfache Assoziation, aber aggregierte Objekte können wie bei einer einfachen Assoziation ohne einander "weiterleben".
Eine Komposition ist sogar stärker als eine Aggregation, da die aggregierte Klasse nicht von anderen Klassen aggregiert werden kann. Sein "Leben" hängt vom Behälter ab.
quelle