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.
Diese Vorgehensweise würde jedoch zu einer Unmenge überflüssigen Programmtextes führen, da in den meisten<br />
Fällen die Vorbedingungen <strong>der</strong> aufgerufenen Routine durch die vorhergehenden Anweisungen sichergestellt<br />
wurden. Meist ist dies offensichtlich (z.B. wenn kurz vor dem Aufruf von item(i) die Zuweisung i:=lower<br />
steht). In den Fällen, wo dieser Zusammenhang nicht so offensichtlich ist, sollte man eine Aussage über diese<br />
Eigenschaft in den Programmtext mit aufnehmen, die klarstellt, daß man sich bei <strong>der</strong> Implementierung über die<br />
Situation durchaus im klaren war und daß jede Än<strong>der</strong>ung des Programmtextes auf diese Programmeigenschaft<br />
Rücksicht zu nehmen hat.<br />
Eiffel bietet die Möglichkeit an, auch diese Aussagen als überprüfbare Zusicherungen innerhalb einer check-<br />
Anweisung zu formulieren. Eine solche Anweisung beginnt mit dem Schlüsselwort check und enthält dann<br />
eine Reihe von Zusicherungen, die mit end abgeschlossen werden.<br />
check<br />
Zusicherung1;<br />
Zusicherung2;<br />
.<br />
Zusicherungn<br />
end<br />
Als Zusicherungen sind die Ausdrücke <strong>der</strong> Zusicherungssprache von Eiffel (Sektion 3.7) erlaubt. Sie werden<br />
bei Ausführung <strong>der</strong> check-Anweisung überprüft, sofern die entsprechenden Parameter im System Definition<br />
File gesetzt sind. In diesem Falle bricht das Programm ab, falls eine <strong>der</strong> Zusicherungen verletzt ist. Da die<br />
Ausdruckskraft <strong>der</strong> Zusicherungen jedoch begrenzt ist und die Überprüfung von Zusicherungen Laufzeit kostet,<br />
geht die Rolle <strong>der</strong> Check-Anweisungen nur selten über die eines sinnvoll plazierten Kommentars hinaus.<br />
Man sollte sich daher darüber im klaren sein, daß eine Überprüfung von Zusicherungen kein Ersatz für einen<br />
Korrektheitsbeweis sein kann, son<strong>der</strong>n bestenfalls – in Verbindung mit dem Ausnahmemechanismus, den wir<br />
im folgenden Abschnitt besprechen – eine zusätzliche Absicherung gegenüber unkontrollierbarem Verhalten<br />
des Gesamtsystems, falls darin – was lei<strong>der</strong> sehr wahrscheinlich ist – auch unverifizierte Klassen zum Einsatz<br />
kommen, die eventuell gewisse Abmachungen wie die Vorbedingungen eines Routinenaufrufs nicht einhalten. 30<br />
4.3.7 Umgang mit Fehlern: Disziplinierte Ausnahmen<br />
In einer idealen Programmierwelt wären alle Programme als korrekt nachgewiesen und gegenüber jeglicher<br />
Form von Fehlbedienung abgesichert. Lei<strong>der</strong> aber sind wir von beiden Zielen noch weit entfernt. Zum einen<br />
gibt es zu wenig Werkzeuge, welche eine Verifikation von Programmen unterstützen, und zum an<strong>der</strong>en ist es<br />
ausgesprochen aufwendig, Programme robust zu gestalten.<br />
Wird zum Beispiel vom Benutzer eines Programms eine numerische Eingabe erwartet, so muß man damit<br />
rechnen, daß sich <strong>der</strong> Benutzer bei <strong>der</strong> Eingabe vertippt und innerhalb <strong>der</strong> eingegebenen Ziffernfolge ein<br />
Buchstabe auftritt. Die verwendete Eingaberoutine (readreal, siehe Abschnitt 4.3.9) kann daher ihren Kontrakt<br />
nicht erfüllen und keine Zahl an die aufrufende Stelle zurückgeben. Sie bricht also ihre Tätigkeit in einer<br />
Art “organisierter Panik” ab und hinterläßt ein Fehlersignal (das feature error hat einen Wert ungleich Null).<br />
Sicherlich wäre es nicht sinnvoll, beim Auftreten eines solchen Fehlers gleich das gesamte Programm abzubrechen.<br />
Bei einer erneuten Auffor<strong>der</strong>ung würde <strong>der</strong> Benutzer seine Eingabe sicherlich mit größerer Konzentration<br />
wie<strong>der</strong>holen. Man könnte also jede Eingaberoutine in eine Schleife einbetten, die solange wie<strong>der</strong>holt wird, bis<br />
kein Fehlersignal mehr auftritt. Diese Vorgehensweise hätte jedoch den Nachteil, daß das Programm unnötig<br />
durch Schleifen aufgebläht wird und <strong>der</strong> Ausnahmefall das eigentliche Programm dominiert.<br />
Ebenso muß man damit rechnen, daß bei <strong>der</strong> Überprüfung von Zusicherungen festgestellt wird, daß eine<br />
<strong>der</strong> vorgesehenen Bedingungen – zum Beispiel die Vorbedingung einer Routine – nicht eingehalten wird. Die<br />
aufgerufene Routine kann diesen Fehler nicht beheben. Es wäre aber auch nicht sinnvoll, über einen einmal<br />
30 Eine ausführliche Diskussion über einen sinnvollen Einsatz des Überprüfungsmechanismus bei möglichst geringen Laufzeit-<br />
verlusten findet man in [Meyer, 1988, Kapitel 7.10.1/2]