UML-Klassendiagrammnotationen: Unterschiede zwischen Assoziation, Aggregation und Komposition


39

Ich bin verwirrt über einige der Notationen von UML-Klassendiagrammen.

Bildbeschreibung hier eingeben

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.


Definition 2 klingt eher nach der Definition für Komposition als nach Aggregation. Definition 1 klingt ganz richtig.
JBX

Antworten:


32

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.


1
Danke für deine Antwort. So verstehe ich Dinge, bitte sagen Sie, ob dies eine vernünftige Definition ist. 1- Assoziation ist immer dann, wenn ein A-Objekt über ein B-Objekt Bescheid wissen muss, um seine Funktionalität auszuführen. 2- Sowohl Aggregation als auch Composition definieren eine 'Ownership'-Beziehung - eine Instanz der Klasse A besitzt konzeptionell eine Instanz der Klasse B. Die Lebensdauer der B-Instanz ist jedoch unabhängig von der Lebensdauer der A-Instanz. Zum Beispiel eine Abteilung mit Mitarbeitern. Die Abteilung besitzt eine Mitarbeiterinstanz, aber sie lebt ohne die Abteilung weiter. Zusammensetzung ist wie Aggregation, aber
Aviv Cohn

1
Die Lebensdauer der B-Instanz hängt von der Lebensdauer der A-Instanz ab. Eine stärkere "Eigentums" -Beziehung. Zum Beispiel: Ein Auto und ein Rad. Das Auto enthält das Rad vollständig. Die Wheel-Instanz wird nicht weiterleben, ohne dass die Car-Instanz sie enthält. Ist das eine vernünftige Unterscheidung?
Aviv Cohn

@Prog: Ja, das ist eine vernünftige Definition. Denken Sie daran, dass andere diese Definition möglicherweise nicht teilen und dass Sie ihnen möglicherweise die Verwendung der Aggregation erläutern müssen.
Bart van Ingen Schenau

Was ist Ihrer Meinung nach die gebräuchlichste Definition für die Aggregationsnotation? Welche Definition verwende ich? Die 'hat eine Sammlung von' Definition? Etwas anderes?
Aviv Cohn

Der Verweis auf den OMG-Standard unten ist aufschlussreich. Assoziation und Zusammensetzung sind ziemlich einfach. Aggregation ist die wackelige. In der Praxis finde ich, dass der 'Teil' des Tests gut funktioniert ('Besitz' ist eine suboptimale Art, darüber nachzudenken). Eine Person kann Teil eines Clubs sein, so dass ein Club Personen zusammenfasst (ihm gehören sie nicht). Wenn der Verein zerstört wird, bleiben die Menschen bestehen.
Huliax

10

Zusammensetzung ist, wenn eine object Aenthält object Bund die object Aauch für die Erstellung der verantwortlich ist object B.

Zusammensetzungsbeziehung

Wir haben eine Klasse A, die von Klasse B verwendet wird.

final class A
{
}

Es gibt mehrere Möglichkeiten, wie die Komposition aussehen kann.

Direkte Initialisierungszusammensetzung:

final class B
{
    private $a = new A();
}

Zusammensetzung der Konstruktorinitialisierung

final class B
{
    private $a;

    public function __construct()
    {
        $this->a = new A();
    }
}

Lazy Initialisierung Komposition

final class B
{
    private $a = null;

    public function useA()
    {
        if ($this->a === null) {
            $this->a = new A();
        }

        /* Use $this->a */
    }
}

Sie sehen, dies schafft eine enge Beziehung zwischen den Klassen Aund B. BOhne kann Klasse einfach nicht existieren A. Dies ist eine riesige Verletzung von Dependency Injection Prinzip , das sagt:

Eine Abhängigkeit ist ein Objekt, das verwendet werden kann (ein Dienst). Eine Injection ist die Weitergabe einer Abhängigkeit an ein abhängiges Objekt (einen Client), das diese verwenden würde. Der Service wird zum Status des Kunden gemacht. Die grundlegende Anforderung des Musters besteht darin, den Service an den Client weiterzugeben, anstatt es einem Client zu ermöglichen, den Service zu erstellen oder zu finden.

Kompositionen sind manchmal sinnvoll, beispielsweise wenn Sie new DateTimein PHP oder new std::vector<int>C ++ arbeiten. Aber meistens ist es eine Warnung, dass Ihr Code-Design falsch ist.

In einem Fall, in dem class Adas ein spezielles Objekt ist, das zum Cachen verwendet wird, wird das Objekt class Bimmer mit der Implementierung von zwischengespeichert class 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 als useA()Methode bezeichnet wird und deren Erstellung object Afehlschlagen würde, ist Ihre object Bplötzlich unbrauchbar.


Aggregation hingegen ist eine Art der Beziehung, die dem DI-Prinzip folgt . object BBedürfnisse zu verwenden object A, übergeben Sie sollten dann bereits Instanz erstellt object Azu object B, und soll die Schaffung von object Afail, 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 Bkann nicht ohne existieren object A).

final class B
{
    private $a;

    public function __construct(A $a)
    {
        $this->a = $a;
    }
}

Looser (Sie können oder können nicht im object AInneren verwenden object B, aber wenn Sie dies tun, sollten Sie es wahrscheinlich zuerst einstellen).

Über Setter:

final class B
{
    private $a;

    public function setA(A $a)
    {
        $this->a = $a;
    }
}

Über öffentliches Eigentum:

final class B
{
    public $a;
}

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.


1
Codebeispiele zu sehen, hilft wirklich! Erklärungen in Englisch ohne Code wirken alle so vage und subjektiv.
Niko Bellic

1

Zusätzlich ein Auszug aus dem aktuellen UML-Standard:

11.5.4 Assoziationen - Semantik - Notation

[...] Eine binäre Assoziation kann ein Ende mit aggregation = AggregationKind :: shared oder aggregation = AggregationKind :: composite haben. Wenn ein Ende aggregation = AggregationKind :: shared hat, wird ein hohler Diamant als Endverzierung am Ende der Assoziationslinie gegenüber dem mit aggregation = AggregationKind :: shared gekennzeichneten Ende hinzugefügt. Der Diamant muss deutlich kleiner sein als die Diamantnotation für Assoziationen. Eine Assoziation mit Aggregation = AggregationKind :: composite hat ebenfalls eine Raute am entsprechenden Ende, unterscheidet sich jedoch darin, dass die Raute ausgefüllt ist . […]

9.5.4 Klassifikation - Eigenschaften - Notation

[…] Manchmal wird eine Eigenschaft verwendet, um Umstände zu modellieren, in denen eine Instanz zum Gruppieren mehrerer Instanzen verwendet wird. Dies nennt man Aggregation. Um solche Umstände darzustellen, verfügt eine Eigenschaft über eine Aggregationseigenschaft vom Typ AggregationKind. Die Instanz, die die gesamte Gruppe darstellt, wird vom Eigentümer der Eigenschaft klassifiziert, und die Instanzen, die die gruppierten Einzelpersonen darstellen, werden nach der Art der Eigenschaft klassifiziert. AggregationKind ist eine Enumeration mit den folgenden Literalwerten:

  • none : Gibt an, dass die Eigenschaft keine Aggregationssemantik aufweist.
  • Freigegeben : Gibt an, dass die Eigenschaft über eine gemeinsame Aggregationssemantik verfügt. Die genaue Semantik der gemeinsamen Aggregation variiert je nach Anwendungsbereich und Modellierer.
  • Zusammengesetzt : Gibt an, dass die Eigenschaft zusammengesetzt aggregiert ist, dh das zusammengesetzte Objekt ist für die Existenz und Speicherung der zusammengesetzten Objekte verantwortlich (siehe Definition von Teilen in 11.2.3). Zusammengesetzte Aggregation ist eine starke Form der Aggregation, bei der ein Teilobjekt höchstens in einem zusammengesetzten Objekt gleichzeitig enthalten sein muss. Wenn ein zusammengesetztes Objekt gelöscht wird, werden alle Teilinstanzen, bei denen es sich um Objekte handelt, damit gelöscht.

[…]


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.