Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
3.8.11 Kaufen o<strong>der</strong> Erben?<br />
Wenn Sie bei einer Klassendeklaration features einer an<strong>der</strong>en Klasse K benötigen, dann werden Sie vor <strong>der</strong><br />
Frage stehen, welche Beziehungsart gewählt werden soll: soll K vererben o<strong>der</strong> Lieferant sein?<br />
Die meisten Programmierer, die noch nicht mit <strong>der</strong> objektorientierten Denkweise vertraut sind, werden im<br />
allgemeinen die Vererbung vorziehen, da man hier auf die qualifizierten Aufrufe verzichten kann. Dies bedeutet<br />
aber einen Mißbrauch <strong>der</strong> Vererbung, da hierdurch die durch die das Klassenkonzept geför<strong>der</strong>te Strukturierung<br />
von Softwaresystemen in unabhängige Komponenten wie<strong>der</strong> verlorengeht. Wer Vererbung nur <strong>der</strong> leichteren<br />
Schreibweise wegen bevorzugt, läuft Gefahr, in Eiffel nach wie vor einen Pascal-Stil zu verwenden.<br />
Sinnvoller ist es, sich Gedanken darüber zu machen, welche konzeptionelle Beziehung zwischen den Objekten<br />
<strong>der</strong> realen Welt besteht, die durch die Klassen beschrieben werden. Vererbung drückt aus, daß die Objekte<br />
<strong>der</strong> Erbenklasse auch Objekte <strong>der</strong> Elternklasse sind, also Attribute <strong>der</strong> Elternklasse besitzen. Die Kunden-<br />
Lieferant Beziehung besagt, daß ein Kundenobjekt das Lieferantenobjekt als Bestandteil hat (und daß möglicherweise<br />
mehrere Kundenobjekte dasselbe Lieferantenobjekt haben).<br />
So kann zum Beispiel die Klasse BUCH niemals sinnvoll ein Erbe <strong>der</strong> Klasse PERSON sein, da Bücher nun einmal<br />
keine Personen sind. Bei Studenten, Entleihern und Arbeitnehmern sieht das ganz an<strong>der</strong>s aus.<br />
Natürlich gibt es Gründe, von dieser Vorgehensweise abzuweichen. Bei <strong>der</strong> Implementierung <strong>der</strong> Klasse<br />
FIXED LIST (Abbildung 3.38 auf Seite 111) haben wir die Klasse ARRAY geerbt, obwohl Fel<strong>der</strong> eindeutig<br />
keine Listen sind. Hier stand die Effizienz und Einfachheit <strong>der</strong> Schreibweise im Vor<strong>der</strong>grund. Auch mag die<br />
Flexibilität <strong>der</strong> Redefinition ein Kriterium für Vererbung anstelle des Kaufens sein.<br />
Die größere Flexibilität <strong>der</strong> Vererbung erkauft man sich jedoch durch eine stärkere Bindung an die Elternklasse.<br />
Kunden und Lieferanten kommunizieren über sauber definierte Schnittstellen und Verträge. Der Kunde<br />
wird von Än<strong>der</strong>ungen <strong>der</strong> Implementierungen bei den Dienstleistungen nicht beeinflußt. Zwischen Eltern und<br />
Nachkommen gibt es keine <strong>der</strong>artigen Sicherheiten. Eine globale Entscheidung für o<strong>der</strong> wi<strong>der</strong> die Vererbung<br />
gibt es also nicht. Sie sollte im Einzelfall durch eine Bewertung dieser Kriterien getroffen werden.<br />
3.9 Arbeiten mit Eiffel<br />
In den bisherigen Unterkapiteln haben wir alle wesentlichen Konzepte für die Strukturierung von Daten angesprochen<br />
und an vielen Beispielen illustriert. Damit haben wir alle Komponenten beisammen, die wir für einen<br />
systematischen Entwurf <strong>der</strong> Architektur von Softwaresystemen benötigen. Sie sind in nun <strong>der</strong> Lage, Klassen<br />
zu entwerfen, die Beziehungen <strong>der</strong> Klassen untereinan<strong>der</strong> durch von Vererbung und Benutzung festzulegen<br />
und die notwendigen Leistungen einer Klasse in <strong>der</strong> Form von Kontrakten genau zu spezifizieren.<br />
Auf Programmierkonstrukte für eine systematische Implementierung <strong>der</strong> einzelnen Leistungen einer Klasse<br />
(also Schleifen, Prozeduren, Ausdrücke) werden wir erst im nächsten Kapitel eingehen. Sie sind aber bereits<br />
prinzipiell in <strong>der</strong> Lage, die Dienstleistungen bereits existieren<strong>der</strong> Klassen in ihren eigenen zu benutzen und<br />
sich somit das große Spektrum vordefinierter Softwarestücke aus <strong>der</strong> Eiffel-Bibliothek zunutze zu machen.<br />
Bisher haben wir aber erst wenig dazu gesagt, wie man aus dieser losen Ansammlung von Klassen ein ausführbares<br />
Eiffel-Softwarepaket erzeugt. Der Grund hierfür ist, daß es einer <strong>der</strong> Grundgedanken <strong>der</strong> objektorientierten<br />
Programmierung ist, die konkrete Implementierung und die Bestimmung eines “Hauptprogramms”<br />
so lange wie möglich zu verschieben und den eigentlichen Entwurf – die Strukturierung von Daten und Dienstleistungen<br />
– in den Vor<strong>der</strong>grund zu stellen. An<strong>der</strong>s als in <strong>der</strong> “konventionellen” Programmierung wird<br />
ein also Softwaresystem nicht um eine zentrale Hauptfunktion herum entworfen, son<strong>der</strong>n als Ansammlung<br />
unabhängig agieren<strong>der</strong> Einzelbetriebe, die in einer Bibliothek (library) gesammelt werden. Auf diese Art wird<br />
die Entwicklung wie<strong>der</strong>verwendbarer Softwarebausteine betont, die als Implementierungen von Klassen gebaut<br />
werden.