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.
Nachkommenklassen obliegt, konkrete Anweisungsteile bereitzustellen. Eiffel verwendet hierfür das Schlüsselwort<br />
deferred und sieht auch die gesamte Klasse als deferred, also aufgeschoben an. Selbstverständlich sind<br />
aufgeschobene Klassen als solche nicht “ausführbar”.<br />
Definition 3.8.9 (Aufgeschobene Klassen)<br />
Eine Routine heißt aufgeschoben (deferred), wenn ihr Rumpf anstelle des Anweisungsteils das Schlüsselwort<br />
deferred enthält.<br />
Eine Klasse heißt aufgeschoben, wenn sie eine aufgeschobene Routine enthält o<strong>der</strong> eine aufgeschobene<br />
Routine geerbt und nicht ausführbar redefiniert hat. Sie muß in ihrer Deklaration als deferred class<br />
gekennzeichnet werden.<br />
Aufgeschobene Klassen sind das Eiffel-Gegenstück zu <strong>der</strong> axiomatischen Spezifikation abstrakter Datentypen,<br />
da sie wie diese nur die Dienstleistungen einer Klasse und <strong>der</strong>en Eigenschaften beschreiben, nicht aber die<br />
Implementierung. Damit können sie benutzt werden, um abstrakte Schnittstellen innerhalb von ausführbaren<br />
Programmen zur Verfügung zu stellen. Das bedeutet, daß bereits während <strong>der</strong> Entwicklungsphase eine Kundenklasse<br />
<strong>der</strong> aufgeschobenen Klasse übersetzt und teilweise getestet werden kann, ohne daß eine konkrete<br />
Realisierung <strong>der</strong> Lieferantenklasse bereits vorliegt. Vererbung erlaubt es dann, beliebige konkrete Realisierungen<br />
und Verfeinerungen <strong>der</strong> aufgeschobenen Klasse anzugeben.<br />
Diese Technik unterstützt einen Entwurf großer Softwaresysteme auf einer hohen Abstraktionsebene. Es ist<br />
möglich, innerhalb ein und <strong>der</strong>selben Sprache zunächst eine Systemarchitektur zu entwerfen, jedes Modul<br />
abstrakt zu beschreiben und Implementierungsdetails in späteren Verfeinerungen auszuführen 29 . Da auch<br />
unimplementierte Routinen präzise durch Vor- und Nachbedingungen charakterisiert werden können, verschwindet<br />
ein Großteil <strong>der</strong> konzeptionellen Lücke zwischen Entwurf und Implementierung.<br />
Ein weiterer Vorteil aufgeschobener Klassen ist die Möglichkeit einer gleitenden Realisierung von Softwaresystemen<br />
(“partielle Implementierung”). In aufgeschobenen Klassen können auch ausführbare Routinen<br />
vorkommen, die dann für alle Erben zur Verfügung stehen. Auf diese Weise erhält man eine Klassifikation <strong>der</strong><br />
Implementierungen von <strong>der</strong> abstrakten Form in die verschiedenen Formen ihrer konkreten Realisierung.<br />
Darüber hinaus bieten deferred classes einen Ersatz für Prozedurparameter in Routinen, die in Eiffel – im<br />
Gegensatz zu den meisten höheren Programmiersprachen – nicht erlaubt sind. Solche Parameter aber sind<br />
zum Beispiel sinnvoll, wenn man in einer mathematischen Programmpaket Integration und ähnliche Verfahren<br />
anbieten will, natürlich ohne dabei bereits die Funktion festzulegen, <strong>der</strong>en Integral berechnet werden soll. In<br />
Eiffel läßt sich das so simulieren, daß man eine deferred Routine anstelle des Prozedurparameters definiert, die<br />
dann in den Erben dieser Klasse durch die jeweilig gewünschte aktuelle Routine ersetzt wird.<br />
Eines <strong>der</strong> wichtigsten Anwendungsgebiete aber ist die polymorphe Anwendung von gleichartigen (und gleichnamigen)<br />
Routinen aus verschiedenen Anwendungsbereichen. So kann man zum Beispiel für graphische Objekte<br />
wie Punkte, Vektoren, Segmente, Rechtecke, Polygone usw. jeweils unabhängig Routinen zum verschieben,<br />
drehen, spiegeln usw. deklarieren und implementieren. Jede dieser Routinen muß in je<strong>der</strong> Klasse völlig<br />
unabhängig realisiert werden, führt aber – intuitiv betrachtet – jeweils dasselbe aus. Was liegt also näher, als<br />
diese als Routinen einer Klasse GRAPHISCHE OBJEKTE anzusehen, die einen einheitlichen Namen haben und in<br />
den jeweiligen Spezialisierungen ihre beson<strong>der</strong>e Ausprägung finden? Diese gemeinsame Oberklasse muß eine<br />
aufgeschobene Klasse sein, denn es gibt keine feste Anweisungsfolge, die sagt, wie man graphische Objekte<br />
generell verschiebt. Man kann nur in den Vor- und Nachbedingungen festlegen, was die Effekte sein sollen.<br />
Aufgeschobene Klassen bilden also den Vereinigungstyp aller Erbenklassen. Dies erlaubt es den Kunden einer<br />
deferred Klasse wie GRAPHISCHE OBJEKTE, abstrakte Programme zu schreiben, die für jeden konkreten Spezialfall<br />
– also Punkte, Vektoren, Segmente, Rechtecke, Polygone usw. – funktionieren, da die Erbenklassen<br />
eine Implementierung bereitstellen.<br />
29 Normalerweise muß man hierfür mindestens zwei formale Sprachen verwenden – eine Spezifikations- und eine Implementierungssprache.<br />
Dies bringt jedoch eine Reihe von Problemen mit sich, wenn man von <strong>der</strong> einen auf die an<strong>der</strong>e Sprache übergehen<br />
will und dabei sicherstellen möchte, daß die Lösung in <strong>der</strong> Implementierungssprache <strong>der</strong> abstrakten Beschreibung in <strong>der</strong> Spezifikationssprache<br />
entspricht.