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.
Kapitel 4<br />
Systematische Entwicklung zuverlässiger<br />
Software<br />
In <strong>der</strong> bisherigen Auseinan<strong>der</strong>setzung mit dem Thema <strong>“Programmierung”</strong> haben wir uns vor allem auf die<br />
spezifischen Denkweisen <strong>der</strong> objektorientierten Programmierung und die zugehörigen Konstrukte <strong>der</strong> Programmiersprache<br />
Eiffel konzentriert. Sie sollten nun verstanden haben, welche Mittel Ihnen zur Strukturierung<br />
von Softwaresystemen zur Verfügung stehen – insbeson<strong>der</strong>e, wie man Daten und Dienstleistungen in<br />
Klassen zusammenfaßt, fertige Programmteile aktiviert, Wie<strong>der</strong>verwendbarkeit durch den Einsatz generischer<br />
Klassen steigert, ihre Eigenschaften in <strong>der</strong> Form von Verträgen (Zusicherungen) beschreibt, und die logischen<br />
Beziehungen zwischen Klassen durch Vererbung ausdrückt.<br />
Wir haben bisher aber nur wenig dazu gesagt, wie man diese Strukturierungskonzepte einsetzen kann, um<br />
gute Softwaresysteme systematisch zu entwerfen, und mit welchen Mitteln man vertraglich vereinbarte Dienstleistungen<br />
in einer Programmiersprache implementiert und dabei sicherstellt, daß diese Implementierung<br />
tatsächlich auch die versprochenen Eigenschaften besitzt.<br />
Diese Methoden <strong>der</strong> systematischen Entwicklung zuverlässiger Software sollen nun in diesem Kapitel besprochen<br />
werden. Wir werden zunächst kurz einige Methoden des objektorientierten Entwurfs – also Methoden<br />
<strong>der</strong> Strukturierung von Softwaresystem in Klassen, Features, Zusicherungen und Vererbungsbeziehungen –<br />
ansprechen und an unserem Leitbeispiel illustrieren. Anschließend werden wir unser Augenmerk auf die eher<br />
“konventionellen Programmierkonzepte” von Eiffel richten, die es uns erlauben, in Eiffel so zu rechnen wie in je<strong>der</strong><br />
an<strong>der</strong>en Programmiersprache auch. Dabei wird beson<strong>der</strong>s das Qualitätskriterium Zuverlässigkeit (partielle<br />
und totale Korrektheit und Robustheit) im Vor<strong>der</strong>grund stehen. Aus diesem Grunde werden wir zunächst über<br />
Verifikation (Korrektheitheitsbeweise) reden und die hierzu existierenden Formalismen vorstellen, bevor wir<br />
konkret auf Programmstrukturen wie Anweisungen, Fallunterscheidungen und Schleifen zu sprechen kommen,<br />
mit denen man den Anweisungsteil von Routinen verfeinern kann. Auf die Grundbausteine jeglicher Berechnung<br />
– die elementaren Ausdrücke <strong>der</strong> Sprache Eiffel – werden wir nur kurz eingehen, da sie konzeptionell<br />
von geringer Bedeutung sind: es muß nur geklärt werden, welche Ausdrücke und Funktionen in Eiffel vordefiniert<br />
sind und was ihre Syntax ist. Mit <strong>der</strong> Besprechung von Methoden <strong>der</strong> systematischen Implementierung<br />
korrekter Software werden wir dieses Kapitel (und das erste Semester) abschließen.<br />
4.1 Systematischer Entwurf von Softwaresystemen<br />
Bei <strong>der</strong> Besprechung <strong>der</strong> Strukturierungskonzepte im vorhergehenden Kapitel und insbeson<strong>der</strong>e durch die<br />
Diskussion <strong>der</strong> Modularisierungskriterien im Abschnitt 3.10 haben wir bereits einige Techniken angedeutet, wie<br />
man Konzepte objektorientierter Programmiersprachen einsetzen kann, um Softwaresysteme zu strukturieren<br />
bevor man sich an die eigentliche Implementierungsarbeit begibt. Wir wollen diese nun zusammenfassen und<br />
etwas ausführlicher erläutern.<br />
127