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

worte.projekt.de
von worte.projekt.de Mehr von diesem Publisher
30.10.2013 Aufrufe

142 10 Ein spezifisches Qualitätsmodell 10.2.2 Bemerkungen zu den Entwürfen Vererbung Bei den Entwürfen fällt auf, dass Vererbung kaum verwendet wird. Das deckt sich auch mit Beobachtungen von Cartwright (1998) aus studentischen Projekten. Wenn Vererbung verwendet wurde, beschränkt sie sich auf eine Stufe. Anhand positiver und negativer Beispiele wird die Nutzung der Vererbung in den Entwürfen illustriert. Gruppe 8 verwendet das Strategy-Muster (Gamma et al., 1995), um den Algorithmus zur Verbindungssuche je nach Optimierungsziel zu parametrisieren. Dazu dient die abstrakte Klasse Optimization mit ihren drei Unterklassen, welche die verschiedenen Optimierungsziele repräsentieren (vgl. Abbildung 10-2). Wichtigste Operation ist dabei getWeight, welche die Bewertung einer Verbindung gemäß dem Optimierungsziel liefert. Die Unterklassen implementieren die Operation aus der Oberklasse mit der korrekten Bewertungsmethode. Abbildung 10-2: Strategy-Muster bei Gruppe 8 Eine Alternative dazu ist die Verwendung des Template-Method-Musters (Gamma et al., 1995), wie sie Gruppe 4 vorgenommen hat. Die Bewertung wird der Verbindung selbst zugeordnet. Die abstrakte Klasse Connection besitzt eine Operation getDistance, welche die Bewertung liefert. Diese wird von den konkreten Unterklassen je nach Optimierungsziel implementiert (vgl. Abbildung 10-3). Die Operation processNode (implementiert in Connection) verwendet dann getDistance bei der Verbindungssuche. Gruppe 12 hingegen benutzt Vererbung eher problematisch. Von einer Klasse TwoDigitNumber, die eine zweistellige Zahl repräsentiert, werden zwei Unterklassen Hour und Minute abgeleitet, ohne dabei Erweiterungen oder Redefinitionen vorzunehmen (vgl. Abbildung 10-4, linke Seite). Das deutet darauf hin, dass die Klassen (abgesehen vielleicht von einem semantischen Unterschied durch den Namen) überflüssig sind. Hour und Minute sind eigentlich Instanzen (und keine Spezialisierungen) von TwoDigitNumber und sollten daher nicht als Klassen modelliert werden. Der Fragebogen zur Strukturiertheit (vgl. Abschnitt B.2) enthält eine entsprechende Frage, die das Problem aufdeckt.

10.2 Anwendung des Qualitätsmodells 143 Abbildung 10-3: Template-Method-Muster bei Gruppe 4 Abbildung 10-4: Fragwürdige Vererbung bei Gruppe 12 Ein weiteres Beispiel für fragwürdige Vererbung stammt von derselben Gruppe (vgl. Abbildung 10-4, rechte Seite). Von einer abstrakten Klasse GenericTrip, die für allgemeine Verbindungen steht, werden drei konkrete Unterklassen abgeleitet: TripBlock (ein Abschnitt einer Verbindung), Trip (eine vollständige Verbindung) und Trips (eine Menge von Verbindungen). Alle implementieren die Operationen der Oberklasse und fügen weitere Operationen hinzu. Außerdem gibt es Aggregationsbeziehungen: Trips aggregiert Trip, Trip wiederum TripBlock. Betrachtet man die Vererbungsbeziehungen, kann man nur bei Trip von einer Spezialisierung sprechen. Fasst man GenericTrip als Interface auf, kann man auch noch begründen, warum TripBlock dieses Interface implementiert, da auch Verbindungsabschnitte die Attribute einer Verbindung im Sinne von GenericTrip aufweisen. Problematisch wird es allerdings bei Trips, weil dort selbst das Interface nicht passt. Was ist denn z. B. die Startzeit einer Menge von Verbindungen? Ein Blick in die Implementierung verrät, dass immer der Wert für die erste Verbindung in der Verbindungsmenge zurückgegeben wird, doch das scheint eher willkürlich – genauso gut könnte das Minimum oder der Durchschnitt zurückgegeben werden. Eine Spezialisierungsbeziehung zwischen Trips und GenericTrip liegt jedenfalls nicht vor. Übrigens kann auch dieses Problem durch eine entsprechende Frage im Fragebogen zur Entkopplung (vgl. Abschnitt B.3) aufgedeckt werden. In der Implementierung zeigt sich, dass GenericTrip nie als Typ (z. B. einer Variablen oder eines Parameters) verwendet wird. Der durch die Vererbung ermöglichte Poly-

10.2 Anwendung des <strong>Qualität</strong>smodells 143<br />

Abbildung 10-3: Template-Method-Muster bei Gruppe 4<br />

Abbildung 10-4: Fragwürdige Vererbung bei Gruppe 12<br />

Ein weiteres Beispiel für fragwürdige Vererbung stammt von <strong>der</strong>selben Gruppe (vgl.<br />

Abbildung 10-4, rechte Seite). Von einer abstrakten Klasse GenericTrip, die für allgemeine<br />

Verbindungen steht, werden drei konkrete Unterklassen abgeleitet: TripBlock<br />

(ein Abschnitt einer Verbindung), Trip (eine vollständige Verbindung) und Trips (eine<br />

Menge von Verbindungen). Alle implementieren die Operationen <strong>der</strong> Oberklasse und<br />

fügen weitere Operationen hinzu. Außerdem gibt es Aggregationsbeziehungen: Trips<br />

aggregiert Trip, Trip wie<strong>der</strong>um TripBlock.<br />

Betrachtet man die Vererbungsbeziehungen, kann man nur bei Trip von einer Spezialisierung<br />

sprechen. Fasst man GenericTrip als Interface auf, kann man auch noch<br />

begründen, warum TripBlock dieses Interface implementiert, da auch Verbindungsabschnitte<br />

die Attribute einer Verbindung im Sinne von GenericTrip aufweisen. Problematisch<br />

wird es allerdings bei Trips, weil dort selbst das Interface nicht passt. Was ist<br />

denn z. B. die Startzeit einer Menge von Verbindungen? Ein Blick in die Implementierung<br />

verrät, dass immer <strong>der</strong> Wert für die erste Verbindung in <strong>der</strong> Verbindungsmenge<br />

zurückgegeben wird, doch das scheint eher willkürlich – genauso gut könnte das<br />

Minimum o<strong>der</strong> <strong>der</strong> Durchschnitt zurückgegeben werden. Eine Spezialisierungsbeziehung<br />

zwischen Trips und GenericTrip liegt jedenfalls nicht vor. Übrigens kann auch<br />

dieses Problem durch eine entsprechende Frage im Fragebogen zur Entkopplung (vgl.<br />

Abschnitt B.3) aufgedeckt werden.<br />

In <strong>der</strong> Implementierung zeigt sich, dass GenericTrip nie als Typ (z. B. einer Variablen<br />

o<strong>der</strong> eines Parameters) verwendet wird. Der durch die Vererbung ermöglichte Poly-

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!