Bewertung der Qualität objektorientierter Entwürfe - Worte-Projekt
Bewertung der Qualität objektorientierter Entwürfe - Worte-Projekt
Bewertung der Qualität objektorientierter Entwürfe - Worte-Projekt
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
54 5 Ein Referenzmodell für den objektorientierten Entwurf<br />
Relation zur Gesamtsumme hinzuzuzählen. Hier wird die Formalisierung am Beispiel<br />
von uses* gezeigt.<br />
uses*(x,y).weight = uses(x,y).weight + Σ z∈C∪I: extends*(x,z) uses(z,y).weight<br />
Bei realizes* sollte das Gewicht immer maximal 1 sein, da faktisch eine Klasse ein<br />
Interface nicht mehrfach realisieren kann. Es kann höchstens eine bereits vorhandene<br />
Realisierung durch Redefinition <strong>der</strong> geerbten Realisierung geän<strong>der</strong>t werden. Ein<br />
Gewicht größer 1 dürfte immer auf einen Entwurfsfehler hinweisen.<br />
5.4.4 Überlegungen zu Templates<br />
Die Möglichkeit zur Bildung von parametrisierten Modellelementen ist in UML nicht<br />
auf Klassen beschränkt. Beispielsweise lassen sich Entwurfsmuster als parametrisierte<br />
Kollaborationen modellieren. Die hier betrachtete Erweiterung von ODEM<br />
beschränkt sich aber auf Template-Klassen, da diese den üblichen Gebrauch von Templates<br />
darstellen (z. B. in C++ o<strong>der</strong> Eiffel). Es werden auch nur vollständige Instantiierungen<br />
von Templates betrachtet; außerdem wird die Möglichkeit zur Default-Belegung<br />
von Parametern außer Acht gelassen.<br />
Im UML-Metamodell werden Templates durch eine Assoziation <strong>der</strong> Klasse ModelElement<br />
mit sich selbst modelliert (vgl. Abbildung 5-1). Ein ModelElement kann eine<br />
Menge von Template-Parametern haben (Rolle templateParameter). Hat ein ModelElement<br />
mindestens einen solchen Parameter, ist es ein Template, sonst nicht. Die Template-Parameter<br />
sind formale Parameter und dürfen keine innere Struktur (Attribute,<br />
Operationen, etc.) besitzen. Nur ihr Name und ihr Typ sind relevant. Die formalen<br />
Parameter können Klassen sein, aber auch Datentypen und Operationen sind möglich.<br />
Es können zusätzliche Einschränkungen für den Typ <strong>der</strong> Parameterbelegung<br />
gemacht werden (z. B. <strong>der</strong> Parameter muss ein Interface implementieren o<strong>der</strong> eine<br />
ganze Zahl sein). Außerdem können Beziehungen zwischen den Parametern untereinan<strong>der</strong><br />
und mit dem Template selbst formuliert werden (z. B. Aggregation, Vererbung<br />
etc.). Diese Beziehungen müssen dann auch bei den korrespondierenden Elementen<br />
<strong>der</strong> Parameterbelegungen vorhanden sein. Das Template selbst kann zu<br />
an<strong>der</strong>en Modellelementen nur ausgehende Beziehungen haben; diese werden auf die<br />
Instanzen übertragen.<br />
Eine Instantiierung eines Templates wird durch die Dependency-Unterklasse Binding<br />
modelliert. Diese verbindet über die von Dependency geerbten Assoziationen das<br />
Template (Rolle supplier) mit seiner Instanz (Rolle client). Die Parameterbelegung wird<br />
durch eine zusätzliche, geordnete Aggregation modelliert; die Rolle arguments enthält<br />
dabei die aktuellen Parameter.<br />
Template-Klassen selbst sind keine echten Klassen, aber ihre Instanzen sind es. Daher<br />
gehören Template-Instanzen zu C, Template-Klassen aber nicht. Für die Templates<br />
wird daher eine neue Menge T eingeführt. Formale Parameter von Templates müssen<br />
aussortiert werden, dürfen also keinesfalls zu C hinzugenommen werden.<br />
Auf <strong>der</strong> Basis von Binding kann nun eine weitere Relation binds eingeführt werden:<br />
binds: C × T<br />
Eine Klasse ist Instanz eines Templates. binds(c,t) gilt genau dann, wenn es eine<br />
Instanz von Binding gibt, bei <strong>der</strong> die Rollen client mit c und supplier mit t belegt sind.