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.

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]

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!