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
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
5.4 Erweiterungen 53<br />
5.4.2 Erweiterte Relationen<br />
Bisher wurden die Relationen associates, has und uses definiert, ohne Vererbung zu<br />
berücksichtigen. Faktisch ist es aber so, dass nicht nur Eigenschaften, son<strong>der</strong>n auch<br />
Beziehungen vererbt werden. Daher ist es sinnvoll, weitere Relationen einzuführen,<br />
die auch vererbte Beziehungen umfassen. Zunächst wird eine Relation extends* benötigt,<br />
welche die transitive Hülle von extends darstellt.<br />
extends*(x,y) ⇔ extends(x,y) ∨∃z∈C∪I: (extends*(x,z) ∧ extends(z,y))<br />
Nun können die erwähnten erweiterten Relationen definiert werden, die auch geerbte<br />
Beziehungen berücksichtigen. Die Definition wird hier am Beispiel von uses* gezeigt<br />
(associates*, depends_on* und has* sind analog definiert 3 ). Man beachte, dass es sich<br />
hier nicht um die transitive Hülle handelt, weil extends* verwendet wird.<br />
uses*(x,y) ⇔ uses(x,y) ∨∃z∈C∪I: (extends*(x,z) ∧ uses(z,y))<br />
Zum Schluss wird noch die erweiterte Version contains* eingeführt, welche die transitive<br />
Hülle von contains ist.<br />
contains*(x,y) ⇔ contains(x,y) ∨∃z∈C∪I: (contains*(x,z) ∧ contains(z,y))<br />
Wegen <strong>der</strong> hierarchischen Strukturierung gilt contains*(S,x) für alle Elemente x von<br />
P∪C∪I mit Ausnahme von S.<br />
5.4.3 Gewichte für die Relationen<br />
Die bisher definierten Relationen berücksichtigen nicht, wie viele Beziehungen einer<br />
Art zwischen zwei Modellelementen bestehen. Es könnte allerdings einen Unterschied<br />
machen, ob eine Klasse eine o<strong>der</strong> mehrere Beziehungen einer Art mit einer<br />
an<strong>der</strong>en Klasse hat. Deshalb wird für jede Relation ein Attribut namens weight eingeführt.<br />
Der Wert von weight ist für die Relationen contains, extends und realizes immer<br />
gleich 1. Bei <strong>der</strong> associates- und <strong>der</strong> uses-Relation ist es möglich, dass eine Beziehung<br />
mehrfach besteht. Dann ist <strong>der</strong> Wert von weight die Anzahl dieser Beziehungen. Der<br />
Wert von weight bei <strong>der</strong> depends_on-Relation ergibt sich als Summe <strong>der</strong> Werte von<br />
weight bei den berücksichtigten Relationen (für das Gewicht nicht vorhandener Relationen<br />
wird <strong>der</strong> Wert 0 angenommen).<br />
depends_on(x,y).weight = extends(x,y).weight + realizes(x,y).weight + associates(x,y).weight<br />
+ uses(x,y).weight<br />
Für die *-Relationen bleibt bei contains* <strong>der</strong> Wert von weight bei 1. Bei extends* entspricht<br />
<strong>der</strong> Wert von weight <strong>der</strong> Anzahl <strong>der</strong> Pfade, über die eine Klasse von einer<br />
an<strong>der</strong>en erbt.<br />
extends*(x,y).weight = extends(x,y).weight + Σz∈C∪I: extends(x,z) extends*(z,y).weight<br />
Bei den Relationen associates*, realizes*, uses* und depends_on* muss zur Berechnung<br />
des Gewichts die Vererbungshierarchie des ersten Modellelements nach oben hin<br />
durchsucht werden: Für jede Beziehung <strong>der</strong> gesuchten Art zwischen <strong>der</strong> Klasse selbst<br />
o<strong>der</strong> einer ihrer Oberklassen mit <strong>der</strong> an<strong>der</strong>en Klasse ist <strong>der</strong> Wert von weight dieser<br />
3. Bei associates* ist noch das Attribut aggregation zu beachten. Dieses wird mit <strong>der</strong> stärksten Assoziationsart<br />
<strong>der</strong> beteiligten Assoziationen belegt (wie bei associates, vgl. Abschnitt 5.3.4).