22.08.2013 Aufrufe

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

MEHR ANZEIGEN
WENIGER ANZEIGEN

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.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!