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.
Antworten:
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).
quelle
Als Faustregel gilt:
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.
quelle
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.
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.
Hier mit einem Beispiel Unterschied zwischen Aggregation und Zusammensetzung erklärt
quelle
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.
quelle
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.
quelle
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
Gleichzeitig sagen sie aber auch
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:
Person
und veranschaulichtHeart
, die in der folgenden Abbildung gezeigt ist. Ein Herz wird entweder zerstört oder einer anderen Person transplantiert, wenn sein Besitzer gestorben ist.Person
undBrain
.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
-Engine
Zusammensetzung, 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 .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
DegreeProgram
undCourse
, 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).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.
quelle
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 ...
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!
quelle
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.
quelle
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.
quelle
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
quelle
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:
Die Assoziation von Universität zu Kathedrale ist also eine Komposition, da Kathedra nicht außerhalb der Universität existiert (IMHO).
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 .
quelle
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.
quelle