Archiv für den Monat: Mai 2011

UML2: Generalisierungen (Teil 4)

Nach dem vorangegangenen Artikel über die Struktur des Metamodells geht es in diesem Text um konkreten Inhalt, nämlich die Generalisierung. Zunächst ein Zitat aus der UML Superstructure Specification:
„A generalization is a taxonomic relationship between a more general classifier and a more specific classifier. Each instance of the specific classifier is also an indirect instance of the general classifier. Thus, the specific classifier inherits the features of the more general classifier.“
Das obige Zitat beinhaltet eine Referenz auf „features“, damit sind „StructuralFeatures“ und „BehavioralFeatures“ gemeint, also (vereinfacht ausgedrückt) Properties und Operationen.

Wie wird die Generalisierung im Metamodell modelliert? Das obige Zitat drückt bereits aus, dass die Generalisierung eine Beziehung zwischen „Classifiers“ ist. Daher liegt die Vermutung nahe, dass die Generalisierung wie in folgendem Diagramm modelliert ist:
too simple generalization
Während die Beziehung im obigen Diagramm ausreicht, um die Generalisierung zu realisieren, ist das Metamodell von UML doch etwas komplexer. Das hat den Hintergrund, dass im Metamodell schon abstrakte Klassen für Beziehungen aller Art beinhaltet (und die Generalisierung ist eine Beziehung zwischen Classifiers), und das Konzept von Beziehungen auch für die Generalization benutzt wird. Trotzdem ist das obige Diagramm korrekt, denn die Informationen über die „Parents“, also die generellen Classifiers, werden über eine „derived“-Beziehung (erkennbar an dem Slash „/“ für abgeleitete Properties) so abgebildet. Das bedeutet, dass die Generalisierung über die Klasse „Generalization“ modelliert wird, aber die Informationen gleichzeitig über die „general“-Property verfügbar sind.
Im folgenden Bild ist der Ausschnitt aus dem UML Metamodell, der Generalisierungen definiert, abgebildet:
Generalization for Classifiers

An dieser Stelle noch ein Verweis auf den Teil 1 des Metamodells, wo schon die Modellierung der Superklassen angedeutet wurde. Dort hat eine Klasse die Property „superClass“, die von der Generalisierung abgeleitet ist.

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