Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
class LIST[X]<br />
creation new<br />
feature<br />
empty: BOOLEAN is -- Ist die Liste leer ?<br />
do...end;<br />
new is -- Erzeuge leere Liste<br />
do...<br />
ensure<br />
empty<br />
end; -- new<br />
cons(r:X) is -- Hänge r vor die Liste<br />
do...<br />
ensure<br />
not empty; head = r<br />
-- tail würde jetzt old liefern<br />
end; -- cons<br />
head: X is -- Erstes Element<br />
require<br />
not empty<br />
do...end; -- head<br />
tail is -- Entferne erstes Element<br />
do...<br />
ensure<br />
old empty implies empty<br />
end -- tail<br />
end -- class LIST[X]<br />
Abbildung 3.26: Klassendefinition mit unvollständigen Zusicherungen<br />
verletzen, keine gültige Darstellung von Fel<strong>der</strong>n sein können. Aus diesem Grunde nennt man <strong>der</strong>artige Zusicherungen<br />
auch Darstellungsinvarianten. Darstellungsinvarianten beziehen sich also nicht auf einen abstrakten<br />
Datentyp, son<strong>der</strong>n auf die Objekte, welche bei einer einmal gewählten Implementierungsstruktur die Elemente<br />
dieses Datentyps darstellen können.<br />
3.7.4 Grenzen <strong>der</strong> Anwendbarkeit von Zusicherungen<br />
Zusicherungen in Eiffel decken nicht alles ab, was man mit Mitteln <strong>der</strong> Logik als Spezifikation von Klassen<br />
formulieren könnte. Nicht alle Axiome eines abstrakten Datentyps lassen sich auch als Zusicherung ausdrücken.<br />
So kann man zum Beispiel bei <strong>der</strong> Spezifikation endlicher Listen (Abbildung 3.4 auf Seite 65) das Axiom<br />
tail(cons(x,L)) = L<br />
nicht direkt in eine Nachbedingung <strong>der</strong> Routinen tail o<strong>der</strong> cons umsetzen. Dies liegt daran, daß tail<br />
o<strong>der</strong> cons Prozeduren sind, welche ein Objekt verän<strong>der</strong>n, sobald sie aufgerufen werden. Damit sind sie für<br />
Zusicherungen unbrauchbar.<br />
Prinzipiell wäre es natürlich möglich, die Zusicherungssprache von Eiffel dahingehend zu erweitern, daß sie genauso<br />
mächtig ist wie die Mathematik <strong>der</strong> abstrakten Datentypen. Dafür müßte man sie allerdings um Mengen,<br />
Folgen, Funktionen, Relationen, Prädikate und Quantoren erweitern. Solche Sprachen gibt es bereits 18 , aber<br />
sie sind zur Zeit noch schwer zu implementieren und ineffizient zu testen, und vor allem auch für Nicht-Logiker<br />
schwer zu erlernen – und damit würde sie niemand benutzen.<br />
Eiffel bietet daher einen pragmatischen Kompromiß an. Zusicherungen werden eingeschränkt auf boolesche<br />
Ausdrücke mit wenigen Erweiterungen. Dies erlaubt, die wichtigsten Eigenschaften von Klassen genau zu<br />
18 Als Beispiel einer solchen Sprache sei die (intuitionistische) Typentheorie genannt.