UML2: Struktur des Metamodells (Teil 3)

Im vorigen Artikel (UML2 Teil 2) wird ein Teil des UML-Metamodells, ausgehend von „Class“, beschrieben. Diese Vererbungshierarchie ist eigentlich recht intuitiv, wenn die verschiedenen abstrakten Klassen des Metamodells bekannt sind. Hier eine unvollständige Übersicht über verschiedene Klassen:
– Element
– NamedElement
– Namespace
– PackageableElement
– Package
– TypedElement
– Type
– RedefinableElement
– Classifier
– Class
– DataType
– PrimitiveType
– Enumeration
Das intuitive Herangehen an die Struktur des Metamodells besteht nun darin, eine Klasse herauszunehmen und mit den übrigen Klassen folgende Frage zu beantworten: „Ist die [herausgenommene Klasse] eine [übrige Klasse]“?
So zum Beispiel für den „PrimitiveType“ (in UML gibt es die primitiven Typen „Boolean“, „Integer“, „UnlimitedNatural“ und „String“): Ein „PrimitiveType“ ist allein dem Namen nach ein „Type“. Ob er jetzt direkt mit Type verbunden ist, oder indirekt, kann man jetzt noch nicht beantworten. Ein „PrimitiveType“ ist auch ein „DataType“ (da z.B. „Integer“ ein „DataType“ ist). Exkurs über „DataType“: Ein „DataType“ ähnelt einer „Class“, besitzt aber keine inherente Identität (alle Instanzen mit demselben Wert sind gleich).
Ist ein „PrimitiveType“ ein „Classifier“? Ein Classifier beschreibt eine Menge von Objekten, ein PrimitiveType repräsentiert ebenfalls eine Menge von Objekten, also ist ein PrimitiveType auch ein Classifier. Ist Classifier eine direkte Generalisierung von PrimitiveType? Das kann durch Untersuchung der bisher identifizierten SuperKlassen von PrimitiveType herausgefunden werden, also durch Beanwortung der Frage „Repräsentiert DataType eine Menge von Objekten“? Ja, ein DataType ist ebenfalls ein Classifier, also ist ein Classifier keine direkte Generalisierung von PrimitiveType, sondern von DataType.
Eine „Class“ beschreibt ebenfalls eine Menge von Objekten, also ist auch sie ein „Classifier“. Welche Generalisierungen von „Classifier“ gibt es? Ein „Classifier“ kann als „Type“ von Operationen oder Properties benutzt werden, daher ist ein „Type“ eine Generalisierung von „Classifier“. Ein „Namespace“ beinhaltet „NamedElements“, ein „Classifier“ kann „Properties“ beinhalten, also ist „Namespace“ eine Generalisierung von „Classifier“.
Ein „Classifier“ kann in einem Package liegen, also muss „Classifier“ ein „PackageableElement“ sein. Da ein „Type“ ebenfalls in einem Package liegen kann, und genereller als ein „Classifier“ ist, ist „PackageableElement“ eine direkte Generalisierung von „Type“.
Die positive Beantworung der Frage „Ist ein ‚Classifier‘ ein ‚PackageableElement‘?“ liefert einen Kandidaten für eine Generalisierung, durch Überprüfung der bereits identifizierten weiteren Kandidaten werden alle Metaklassen in eine relative Beziehung zueinander gesetzt. Den bildlichen „Nagel in der Wand“, an dem das Konstrukt aufgehängt wird, liefert dann das BasisElement von UML, die Metaklasse „Element“.
Abschließend eine Übersicht über die Generalisierungsbeziehungen im UML-Metamodell:

Struktur des UML Metamodells

Schreibe einen Kommentar

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