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:
- 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
Person
und 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.
- 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
Person
und Brain
.
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
und 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).
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.