UML2: Kompositionen und Assoziationen (Teil 5, Praxis)

Im UML-Metamodell werden Beziehungen zwischen Klassen als Assoziationen oder als Kompositionen modelliert. Verglichen mit dem Sprachumfang von UML fehlt im Metamodell die Aggregation. Jeder, der schon in einem Team Klassendiagramme diskutiert hat, hat wohl die Erfahrung gemacht, das der Typ einer Beziehung (der AggregationKind) stellenweise schwer festzulegen ist. Es gilt die folgende Semantik für AggregationKind:

  • „none“: Eine Beziehung zwischen „gleichberechtigten“ Partnern
  • „shared“: Eine Teil-Ganzes Beziehung (Aggregation)
  • „composite“: Eine Teil-Ganzes Beziehung, die enthaltende Klasse ist für Existenz und Speicherung der Teile verantwortlich (Komposition)

Naturgemäß ist eine Aggregation schwer von einer Komposition zu unterteilen, eine Komposition ist eine stärkere Bindung (durch die Existenzabhängigkeit). In der Praxis fangen aber genau hier die Diskussionen an. Die Frage, ob ein Teil einer Komposition nur vom Ganzen erzeugt werden darf, oder auch von außen übergeben werden darf, führt oft zu erbitterten Grabenkämpfen. Die ewige Frage „Komposition oder Aggregation“ löst Craig Larman rigoros und pragmatisch: Für ihn ist eine Aggregation ein Placebo ohne festgelegte Semantik, und soll daher nicht benutzt werden. Eine Lösung, die auch für das UML-Metamodell verwendet wurde (denn das UML-Metamodell besteht ausschließlich aus Assoziationen und Kompositionen). In der UML-Superstructure Specification wird das sehr gut durch folgendes Zitat ausgedrückt:
Precise semantics of shared aggregation varies by application area and modeler.

In UML bestehen Relationships nicht nur aus einer Instanz von „Association“, sondern es existieren Enden, die vom Typ „Property“ sind (siehe das Diagramm unten). Diese Enden können entweder einem Classifier gehören, oder sie gehören als „ownedEnd“ der Association. Das Metamodell erlaubt Beziehungen mit beliebig vielen Enden (genauer: mit 2..* Enden), in der Praxis haben die meisten Beziehungen zwei Enden. Eine Property kann eine „opposite“-Property referenzieren, dies ist über die derived-Beziehung „/opposite“ realisiert.

Im UML-Metamodell gibt es noch eine Spezialisierung von „Relationship“, die „DirectedRelationship“. Diese dient als Basisklasse für gerichtete Beziehungen, z.B. einem PackageImport.

Relationships in the Metamodel

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.