Aggregation versus Zusammensetzung [geschlossen]


89

Es fiel mir schwer, den Unterschied zwischen Zusammensetzung und Aggregation in UML zu verstehen. Kann mir bitte jemand einen guten Vergleich und Kontrast zwischen ihnen anbieten? Ich würde auch gerne lernen, den Unterschied zwischen ihnen im Code zu erkennen und / oder ein kurzes Software- / Codebeispiel zu sehen.

Bearbeiten: Ein Grund, warum ich frage, ist eine umgekehrte Dokumentationsaktivität, die wir bei der Arbeit durchführen. Wir haben den Code geschrieben, müssen aber zurückgehen und Klassendiagramme für den Code erstellen. Wir möchten nur die Assoziationen richtig erfassen.



Bitte überprüfen Sie ein Code-basiertes Beispiel unter: stackoverflow.com/questions/731802/…
Almir Campos

UML 2.5 hat den Unterschied verdeutlicht. Siehe den Kasten auf S. 22. 110. Also stimme ich dafür, dies wieder zu öffnen.
qwerty_so

Nein, UML 2.5 hat die Definition der Komposition nicht klargestellt, sondern ist darüber nicht eindeutig, da auch gesagt wird: "Ein Teilobjekt kann aus einem zusammengesetzten Objekt entfernt werden, bevor das zusammengesetzte Objekt gelöscht wird, und daher nicht als Teil von." das zusammengesetzte Objekt. " Siehe meine Antwort unten ( stackoverflow.com/questions/734891/… ), in der ich versucht habe, die Bedeutung der Komposition zu klären. Bitte stimmen Sie meiner Antwort zu, um zu zeigen, dass in SO die richtige Antwort am Ende gewinnt :-) [oder stimmen Sie alle falschen Antworten ab]
Gerd Wagner

Antworten:


90

Die Unterscheidung zwischen Aggregation und Zusammensetzung hängt vom Kontext ab.

Nehmen Sie das in einer anderen Antwort erwähnte Auto-Beispiel - ja, es ist wahr, dass ein Auto-Auspuff "alleine" stehen kann und daher möglicherweise nicht mit einem Auto zusammengesetzt ist - aber es hängt von der Anwendung ab. Wenn Sie eine Anwendung erstellen, die sich tatsächlich mit eigenständigen Autoabgasen befassen muss (eine Anwendung zur Verwaltung von Autohäusern?), Ist die Aggregation Ihre Wahl. Aber wenn dies ein einfaches Rennspiel ist und der Autoauspuff nur als Teil eines Autos dient - nun, die Komposition wäre ganz gut.

Schachbrett? Gleiches Problem. Eine Schachfigur existiert nur in bestimmten Anwendungen nicht ohne Schachbrett. In anderen (wie dem eines Spielzeugherstellers) kann eine Schachfigur sicherlich nicht zu einem Schachbrett zusammengesetzt werden.

Noch schlimmer wird es, wenn Sie versuchen, Komposition / Aggregation Ihrer bevorzugten Programmiersprache zuzuordnen. In einigen Sprachen kann der Unterschied leichter zu bemerken sein ("nach Referenz" vs. "nach Wert", wenn die Dinge einfach sind), in anderen möglicherweise überhaupt nicht.

Und noch ein letzter Ratschlag? Verschwenden Sie nicht zu viel Zeit mit diesem Thema. Das ist es nicht wert. Die Unterscheidung ist in der Praxis kaum sinnvoll (selbst wenn Sie eine völlig klare "Zusammensetzung" haben, möchten Sie diese möglicherweise aus technischen Gründen - beispielsweise durch Zwischenspeichern - als Aggregation implementieren).


1
Ich sagte Schachquadrat eher als Schachfigur, aber alle gültigen Punkte.
David M

2
Ich habe definitiv Probleme mit der Einstellung "Es lohnt sich nicht". Wenn Sie nicht darüber nachdenken, wem ein Objekt "gehört" und für dessen Lebensdauer verantwortlich ist, erhalten Sie sehr beschissenen Code in Bezug auf Objekt-CRUD, insbesondere Bereinigung, wobei Nullzeiger herumfliegen, da Objekthierarchien in einem schlechten Zustand verbleiben.
Chris Kessel

9
Ja, Sie sollten nicht zu viel Zeit mit diesem Thema verschwenden: UML ist eine OOA / OOD-Sprache; Aggregation / Zusammensetzung ist normalerweise eine Entscheidung, die am besten bis zur OOP verschoben wird. Wenn Sie versuchen, zu viele Details in Ihre UML-Modelle zu integrieren, besteht eine Risikoanalyse-Lähmung.
Schimpanse

13
+1 für "Verschwenden Sie nicht zu viel Zeit damit". Das musste ich hören!
Ronnie

8
"Verschwenden Sie nicht zu viel Zeit damit" Warum verstehen Interviewer das nicht?
Titogeo

95

Als Faustregel gilt: Geben Sie hier die Bildbeschreibung ein

class Person {
    private Heart heart;
    private List<Hand> hands;
}

class City {
    private List<Tree> trees;
    private List<Car> cars
}

In der Komposition (Person, Herz, Hand) werden "Unterobjekte" (Herz, Hand) zerstört, sobald die Person zerstört wird.

In Aggregation (Stadt, Baum, Auto) werden "Unterobjekte" (Baum, Auto) NICHT zerstört, wenn Stadt zerstört wird.

Unter dem Strich betont die Zusammensetzung die gegenseitige Existenz, und in Aggregation ist diese Eigenschaft NICHT erforderlich.


1
gegenseitige Existenz, gute B-)
jxramos

Schätzen Ihre Bemühungen. Eine sehr gute Erklärung und jeder Laie kann das verstehen.
Ravindran Kanniah

Einfachste und beste Erklärung, auf die ich gestoßen bin.
Akash Raghav

beste
Erklärung

UML 2.5 hat den Unterschied verdeutlicht. Siehe den Kasten auf S. 22. 110. Also Ihre Antwort ist jetzt einfach falsch,
qwerty_so

51

Zusammensetzung und Aggregation sind Arten von Assoziationen. Sie sind sehr eng miteinander verbunden und in Bezug auf die Programmierung scheint es keinen großen Unterschied zwischen den beiden zu geben. Ich werde versuchen, den Unterschied zwischen diesen beiden anhand von Java-Codebeispielen zu erklären

Aggregation : Das Objekt existiert außerhalb des anderen, wird außerhalb erstellt und daher als Argument (zum Beispiel) an den Konstruktor übergeben. Bsp.: Menschen - Auto. Das Auto wird in einem anderen Kontext erstellt und wird dann Eigentum einer Person.

// code example for Aggregation:
// reference existing HttpListener and RequestProcessor
public class WebServer {
  private HttpListener listener;
  private RequestProcessor processor;
  public WebServer(HttpListener listener, RequestProcessor processor) {
    this.listener = listener;
    this.processor = processor;
  }
}

Zusammensetzung : Das Objekt existiert nur oder macht nur innerhalb des anderen Sinn als Teil des anderen. Bsp.: Menschen - Herz. Du erschaffst kein Herz und gibst es dann an eine Person weiter. Stattdessen wird das Herz geschaffen, wenn der Mensch geschaffen wird.

// code example for composition:
// create own HttpListener and RequestProcessor
public class WebServer {
  private HttpListener listener;
  private RequestProcessor processor;
  public WebServer() {
    this.listener = new HttpListener(80);
    this.processor = new RequestProcessor(“/www/root”);
  }
}

Hier mit einem Beispiel Unterschied zwischen Aggregation und Zusammensetzung erklärt


5
Eine der besten Antworten bisher. Ordentlich :)
Rohit Singh

6
Das beste Java-Codebeispiel, um zu zeigen, wann ein Objekt mit (Komposition) oder ohne (Aggregation) anderer Objekte existieren kann.
Michał Dobi Dobrzański

Bitte, ich möchte wissen, ob wir final für die Komposition verwenden sollen oder nicht.
Outreagous ONE

36

Zusammensetzung bedeutet, dass die untergeordneten Objekte eine Lebensdauer mit dem übergeordneten Objekt teilen. Aggregation nicht. Zum Beispiel besteht ein Schachbrett aus Schachfeldern - die Schachfelder existieren ohne das Brett nicht wirklich. Ein Auto ist jedoch eine Ansammlung von Teilen - ein Autoauspuff ist immer noch ein Autoauspuff, wenn er zu diesem Zeitpunkt nicht Teil eines Autos ist.


18

Das Beispiel, das ich gelernt habe, waren Finger an der Hand. Ihre Hand besteht aus Fingern. Es besitzt sie. Wenn die Hand stirbt, sterben die Finger. Sie können keine Finger "aggregieren". Sie können nicht einfach zusätzliche Finger greifen und sie nach Belieben an Ihrer Hand befestigen und abnehmen.

Der Wert hier hängt aus gestalterischer Sicht häufig mit der Lebensdauer des Objekts zusammen, wie ein anderes Poster sagte. Angenommen, Sie haben einen Kunden und dieser hat ein Konto. Dieses Konto ist ein "zusammengesetztes" Objekt des Kunden (zumindest in den meisten Kontexten, die ich mir vorstellen kann). Wenn Sie den Kunden löschen, hat das Konto keinen eigenen Wert, sodass es ebenfalls gelöscht wird. Bei der Objekterstellung ist häufig das Gegenteil der Fall. Da ein Konto nur im Kontext eines Kunden eine Bedeutung hat, wird das Konto im Rahmen der Kundenerstellung erstellt (oder, wenn Sie dies träge tun, ist es Teil einer Kundentransaktion).

Beim Entwerfen ist es nützlich, darüber nachzudenken, welche Objekte andere Objekte besitzen (zusammensetzen) und welche nur andere Objekte referenzieren (aggregieren). Es kann dabei helfen, festzustellen, wo die Verantwortung für die Objekterstellung / -bereinigung / -aktualisierung liegt.

Was den Code betrifft, ist es oft schwer zu sagen. Fast alles im Code ist eine Objektreferenz, daher ist es möglicherweise nicht offensichtlich, ob das referenzierte Objekt zusammengesetzt (im Besitz) oder aggregiert ist.


15

Es ist erstaunlich , wie viel Verwirrung gibt es über den Unterschied zwischen der Teil-Ganzes - Assoziation Konzepten Aggregation und Komposition . Das Hauptproblem ist das weit verbreitete Missverständnis (selbst unter erfahrenen Softwareentwicklern und unter den Autoren von UML), dass das Konzept der Komposition eine Lebenszyklusabhängigkeit zwischen dem Ganzen und seinen Teilen impliziert, so dass die Teile ohne das Ganze nicht existieren können. Diese Ansicht ignoriert jedoch die Tatsache, dass es auch Fälle von Teil-Ganz-Assoziationen mit nicht teilbaren Teilen gibt, bei denen die Teile vom Ganzen getrennt werden und die Zerstörung des Ganzen überleben können.

In dem UML-Spezifikationsdokument implizierte die Definition des Begriffs "Zusammensetzung" immer nicht gemeinsam nutzbare Teile, es war jedoch nicht klar, was das definierende Merkmal von "Zusammensetzung" ist und was lediglich ein optionales Merkmal ist. Selbst in der neuen Version (Stand 2015), UML 2.5, bleibt es nach dem Versuch, die Definition des Begriffs "Komposition" zu verbessern, immer noch zweideutig und bietet keine Anleitung zur Modellierung von Teil-Ganz-Assoziationen mit Nicht-Assoziationen Teilbare Teile, bei denen die Teile vom Ganzen gelöst werden können und deren Zerstörung überleben, im Gegensatz zu dem Fall, bei dem die Teile nicht gelöst werden können und zusammen mit dem Ganzen zerstört werden. Man sagt

Wenn ein zusammengesetztes Objekt gelöscht wird, werden alle seine Teilinstanzen, die Objekte sind, damit gelöscht.

Gleichzeitig sagen sie aber auch

Ein Teilobjekt kann aus einem zusammengesetzten Objekt entfernt werden, bevor das zusammengesetzte Objekt gelöscht wird, und daher nicht als Teil des zusammengesetzten Objekts gelöscht werden.

Diese Verwirrung weist auf eine Unvollständigkeit der UML-Definition hin, die keine Lebenszyklusabhängigkeiten zwischen Komponenten und Verbundwerkstoffen berücksichtigt. Es ist daher wichtig zu verstehen, wie die UML-Definition verbessert werden kann, indem ein UML-Stereotyp für << untrennbare >> Kompositionen eingeführt wird, bei denen Komponenten nicht von ihrem Verbund getrennt werden können und daher bei jeder Zerstörung ihres Verbunds zerstört werden müssen.

1) Zusammensetzung

Wie Martin Fowler erklärt hat , besteht das Hauptproblem bei der Charakterisierung der Komposition darin, dass "ein Objekt nur Teil einer Kompositionsbeziehung sein kann". Dies wird auch in dem ausgezeichneten Blog-Beitrag UML Composition vs Aggregation vs Association von Geert Bellekens erklärt. Zusätzlich zu diesem definierenden Merkmal einer Zusammensetzung (um exklusive oder nicht teilbare Teile zu haben) kann eine Zusammensetzung auch eine Lebenszyklusabhängigkeit zwischen dem Verbundstoff und seinen Komponenten aufweisen. Tatsächlich gibt es zwei Arten solcher Abhängigkeiten:

  1. Wann immer eine Komponente immer an einen Verbund angehängt werden muss oder mit anderen Worten, wenn sie einen obligatorischen Verbund hat , ausgedrückt durch die "genau eine" Multiplizität auf der zusammengesetzten Seite der Zusammensetzungslinie, muss sie entweder wiederverwendet werden in einem anderen Verbundwerkstoff (oder wieder daran befestigt) oder zerstört, wenn sein aktueller Verbundwerkstoff zerstört wird. Dies wird durch die Zusammensetzung zwischen Personund veranschaulicht Heart, die in der folgenden Abbildung gezeigt ist. Ein Herz wird entweder zerstört oder einer anderen Person transplantiert, wenn sein Besitzer gestorben ist.
  2. Wenn eine Komponente nicht von ihrem Verbund getrennt werden kann oder mit anderen Worten, wenn sie untrennbar ist, muss die Komponente nur dann zerstört werden, wenn ihr Verbund zerstört wird. Ein Beispiel für eine solche Zusammensetzung mit untrennbaren Teilen ist die Zusammensetzung zwischen Personund Brain.

Geben Sie hier die Bildbeschreibung ein

Zusammenfassend lässt sich sagen, dass Lebenszyklusabhängigkeiten nur für bestimmte Fälle der Zusammensetzung gelten, im Allgemeinen jedoch nicht. Sie sind daher kein definierendes Merkmal.

In der UML-Spezifikation heißt es: "Ein Teil kann aus einer zusammengesetzten Instanz entfernt werden, bevor die zusammengesetzte Instanz gelöscht wird, und daher nicht als Teil der zusammengesetzten Instanz gelöscht werden." Im Beispiel einer Car- EngineZusammensetzung, wie in der folgenden Abbildung gezeigt, kann der Motor eindeutig vom Fahrzeug gelöst werden, bevor das Fahrzeug zerstört wird. In diesem Fall wird der Motor nicht zerstört und kann wiederverwendet werden. Dies wird durch die Null- oder Eins- Multiplizität auf der zusammengesetzten Seite der Zusammensetzungslinie impliziert .

Geben Sie hier die Bildbeschreibung ein

Die Vielzahl des Assoziationsende einer Komposition auf der Verbundseite beträgt entweder 1 oder 0,1, je nachdem, ob Komponenten einen obligatorischen Verbund haben (an einen Verbund angehängt werden müssen) oder nicht. Wenn Komponenten untrennbar miteinander verbunden sind , bedeutet dies, dass sie einen obligatorischen Verbund haben.

2) Aggregation

Eine Aggregation ist eine weitere spezielle Form der Assoziation mit der beabsichtigten Bedeutung einer Teil-Ganz-Beziehung, bei der die Teile eines Ganzen mit anderen Ganzen geteilt werden können. Zum Beispiel können wir eine Aggregation zwischen den Klassen modellieren DegreeProgramund Course, wie in der folgenden Abbildung gezeigt, da ein Kurs Teil eines Studiengangs ist und ein Kurs von zwei oder mehr Studiengängen geteilt werden kann (z. B. könnte ein Ingenieurabschluss ein C teilen Programmierkurs mit einem Abschluss in Informatik).

Geben Sie hier die Bildbeschreibung ein

Das Konzept einer Aggregation mit gemeinsam nutzbaren Teilen hat jedoch nicht viel zu bedeuten, sodass es keine Auswirkungen auf die Implementierung hat. Viele Entwickler ziehen es daher vor, den weißen Diamanten nicht in ihren Klassendiagrammen zu verwenden, sondern lediglich eine einfache Zuordnung zu modellieren stattdessen. In der UML-Spezifikation heißt es: "Die genaue Semantik der gemeinsamen Aggregation variiert je nach Anwendungsbereich und Modellierer."

Die Vielzahl des Assoziationsende einer Aggregation auf der gesamten Seite kann eine beliebige Anzahl (*) sein, da ein Teil zu einer beliebigen Anzahl von Ganzheiten gehören oder von diesen geteilt werden kann.


2
Die Komposition ist nicht eng mit dem Lebenszyklus verbunden, aber bei den meisten Problemen der realen Welt ist der Lebenszyklus ein Hauptmotiv dafür, ob Sie komponieren oder aggregieren möchten. Ich habe mich in meiner Antwort abgesichert und gesagt, dass der Lebenszyklus "oft" und nicht immer zusammenhängt. Es ist gut zu bemerken, dass der Lebenszyklus nicht erforderlich ist, aber die Angabe, dass die Ansicht ein "Hauptproblem" ist und falsch (in netter Fettschrift), erscheint mir nicht hilfreich und lenkt davon ab, auf die praktischen Überlegungen zur Verwendung hinzuweisen.
Chris Kessel

Ich bin absolut anderer Meinung. Überlegungen zum Lebenszyklus können kein "Hauptmotiv dafür sein, ob Sie komponieren oder aggregieren", da Sie sie in vielen Fällen von Assoziationen unabhängig davon haben, ob sie irgendeine Art von Teil-Ganz-Beziehung (Aggregation oder Komposition) darstellen. Immer wenn eine Assoziation ein Ende mit einer unteren Multiplizität größer als 0 hat, die einer obligatorischen Referenzeigenschaft entspricht, erhalten Sie eine Lebenszyklusabhängigkeit.
Gerd Wagner

9

In Bezug auf den Code deutet die Komposition normalerweise darauf hin, dass das enthaltende Objekt für die Erstellung von Instanzen der Komponente * verantwortlich ist und das enthaltende Objekt die einzigen langlebigen Verweise darauf enthält. Wenn also das übergeordnete Objekt de-referenziert und Müll gesammelt wird, wird dies auch das untergeordnete Objekt tun.

also dieser Code ...

Class Order
   private Collection<LineItem> items;
   ...
   void addOrderLine(Item sku, int quantity){
         items.add(new LineItem(sku, quantity));
   }
}

schlägt vor, dass LineItem eine Komponente von Order ist - LineItems existieren außerhalb ihrer enthaltenen Reihenfolge nicht. Die Artikelobjekte werden jedoch nicht in der Reihenfolge erstellt - sie werden nach Bedarf übergeben und bleiben bestehen, auch wenn der Shop keine Bestellungen hat. Sie sind also eher assoziiert als Komponenten.

* nb Der Container ist für die Instanziierung der Komponente verantwortlich, ruft aber möglicherweise nicht neu auf ... () selbst - da dies Java ist, müssen normalerweise zuerst ein oder zwei Fabriken zuerst durchlaufen werden!


0

Die konzeptionellen Abbildungen in anderen Antworten sind nützlich, aber ich möchte einen weiteren Punkt mitteilen, den ich als hilfreich empfunden habe.

Ich habe einige Meilen aus UML für die Codegenerierung, für den Quellcode oder DDL für die relationale Datenbank herausgeholt. Dort habe ich Komposition verwendet, um anzuzeigen, dass eine Tabelle in meinem Code einen nicht nullbaren Fremdschlüssel (in der Datenbank) und ein nicht nullbares "übergeordnetes" (und häufig "endgültiges") Objekt enthält. Ich verwende die Aggregation, wenn ich beabsichtige, dass ein Datensatz oder ein Objekt als "verwaist" existiert, nicht an ein übergeordnetes Objekt angehängt ist oder von einem anderen übergeordneten Objekt "übernommen" wird.

Mit anderen Worten, ich habe die Kompositionsnotation als Abkürzung verwendet, um einige zusätzliche Einschränkungen zu implizieren, die möglicherweise beim Schreiben von Code für das Modell erforderlich sind.


0

Das Beispiel, das mir gefällt: Zusammensetzung: Wasser ist ein Teil eines Teiches. (Teich ist eine Zusammensetzung aus Wasser.) Aggregation: Teich hat Enten und Fische (Teich aggregiert Enten und Fische)

Wie Sie sehen können, habe ich "Teil von" und "hat" fett gedruckt, da diese beiden Sätze normalerweise darauf hinweisen können, welche Art von Verbindung zwischen den Klassen besteht.

Wie von anderen betont, hängt es jedoch häufig von der Anwendung ab, ob es sich bei der Verbindung um eine Zusammensetzung oder eine Aggregation handelt.


Aber ein Teil von und hat Begriffe verwirrt irgendwann. Beispielsweise hat eine Personenklasse einen "Namen", wird also als Person angezeigt, die eine Aggregationsbeziehung zum Namen hat. In der Tat ist es eine Zusammensetzungsbeziehung. Warum? Wenn das Objekt Person zerstört wird, sollte dies auch der Name sein. Und der Begriff "Name ist ein Teil der Person" klingt nicht natürlich.
Asif Shahzad

0

Es ist so schwierig, einen Unterschied zwischen aggregierter Beziehung und zusammengesetzter Beziehung zu machen, aber ich werde einige Beispiele nehmen: Wir haben ein Haus und Räume, hier haben wir eine zusammengesetzte Beziehung, Raum ist ein Teil des Hauses und das Raumleben hat begonnen Wenn das Hausleben und der Wille zu Ende sind, wenn das Hausleben zu Ende ist, der Raum ein Teil des Hauses ist, sprechen wir über Kompositionen wie Land und Hauptstadt, Buch und Seiten. Nehmen wir als Beispiel für eine aggregierte Beziehung Team und Spieler, der Spieler kann ohne Team existieren, und das Team ist eine Gruppe von Spielern, und das Spielerleben kann vor dem Teamleben beginnen. Wenn wir über Programmierung sprechen, können wir Spieler erstellen und nachdem wir ein Team erstellen. aber für die Komposition nein, wir schaffen Räume innerhalb des Hauses. Zusammensetzung ----> zusammengesetzt | komponieren. Aggregation -------> Gruppe | Element


0

Lassen Sie uns die Bedingungen festlegen. Die Aggregation ist ein Metaterm im UML-Standard und bedeutet BEIDE Zusammensetzung und gemeinsame Aggregation, einfach als gemeinsam bezeichnet . Zu oft wird es fälschlicherweise als "Aggregation" bezeichnet. Es ist SCHLECHT, denn Komposition ist auch eine Aggregation. Soweit ich weiß, meinst du "geteilt".

Weiter vom UML-Standard:

zusammengesetzt - Gibt an, dass die Eigenschaft zusammengesetzt aggregiert wird, dh das zusammengesetzte Objekt ist für die Existenz und Speicherung der zusammengesetzten Objekte (Teile) verantwortlich.

Die Assoziation von Universität zu Kathedrale ist also eine Komposition, da Kathedra nicht außerhalb der Universität existiert (IMHO).

Die genaue Semantik der gemeinsamen Aggregation variiert je nach Anwendungsbereich und Modellierer.

Das heißt, alle anderen Assoziationen können als gemeinsame Aggregationen gezeichnet werden, wenn Sie nur einigen Prinzipien von Ihnen oder von jemand anderem folgen. Schauen Sie auch hier .


0

Betrachten Sie menschliche Körperteile wie Niere, Leber, Gehirn. Wenn wir hier versuchen, das Konzept der Zusammensetzung und Aggregation abzubilden, wäre dies wie folgt:

Vor dem Aufkommen der Transplantation von Körperteilen wie der von Nieren und Leber waren diese beiden Körperteile mit dem menschlichen Körper zusammengesetzt und können nicht isoliert mit dem menschlichen Körper existieren.

Aber nach dem Aufkommen der Transplantation von Körperteilen können sie in einen anderen menschlichen Körper transplantiert werden, so dass diese Teile mit dem menschlichen Körper aggregieren, da ihre Existenz isoliert vom menschlichen Körper jetzt möglich ist.

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.