22.08.2013 Aufrufe

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

MEHR ANZEIGEN
WENIGER ANZEIGEN

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.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!