02.11.2014 Aufrufe

13 Die Implementierungsphase 13 Die Implementierungsphase Zur ...

13 Die Implementierungsphase 13 Die Implementierungsphase Zur ...

13 Die Implementierungsphase 13 Die Implementierungsphase Zur ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

SWT - Implementierung<br />

1<br />

Inhalt<br />

<strong>13</strong> <strong>Die</strong> <strong>Implementierungsphase</strong><br />

<strong>13</strong>.1 Einführung und Überblick<br />

<strong>13</strong>.2 Prinzipien der Implementierung<br />

<strong>13</strong>.2.1 Prinzip der Verbalisierung<br />

<strong>13</strong>.2.2 Prinzip der problemadäquaten Datentypen<br />

<strong>13</strong>.2.3 Prinzip der Verfeinerung<br />

<strong>13</strong>.2.4 Prinzip der integrierten Dokumentation<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

<strong>13</strong>.5 Selbstkontrolliertes Programmieren<br />

SWT - Implementierung<br />

2<br />

<strong>13</strong> <strong>Die</strong> <strong>Implementierungsphase</strong><br />

<br />

<strong>Zur</strong> Historie<br />

Prof. Dr. Niklaus Wirth<br />

*15.2.1934 in Winterthur, Schweiz<br />

Professor an der ETH Zürich<br />

Erfinder der Programmiersprachen<br />

Pascal (1970), Modula-2 (1982)<br />

und Oberon (1989)<br />

Erfinder der Computersysteme Lilith (1980)<br />

und Ceres (1986) zusammen mit ihren<br />

Betriebssystemen<br />

Wegbereiter der strukturierten<br />

Programmierung und der schrittweisen<br />

Verfeinerung.


SWT - Implementierung<br />

3<br />

<strong>13</strong>.1 Einführung und Überblick<br />

<br />

<br />

Aufgabe des Programmierens:<br />

Aus vorgegebenen Spezifikationen für eine<br />

Systemkomponente die Systemkomponente zu<br />

implementieren, d.h. die geforderten<br />

Leistungen in Form eines oder mehrerer<br />

Programme zu realisieren<br />

<strong>Implementierungsphase</strong>:<br />

Durchführung der Programmiertätigkeiten<br />

Eingebettet zwischen<br />

• der Entwurfsphase und<br />

• der Abnahme- und Einführungsphase.<br />

SWT - Implementierung<br />

4<br />

<strong>13</strong>.1 Einführung und Überblick<br />

<br />

Voraussetzungen<br />

In der Entwurfsphase wurde eine Softwarearchitektur<br />

entworfen, die zu geeigneten<br />

Systemkomponenten geführt hat<br />

Abhängig von der Entwurfsmethode kann eine<br />

Systemkomponente folgendermaßen aussehen:<br />

• Strukturierter Entwurf:<br />

◦ funktionales Modul<br />

• Modularer Entwurf:<br />

◦ funktionales Modul<br />

◦ Datenobjekt-Modul<br />

◦ Datentyp-Modul<br />

• Objektorientierter Entwurf:<br />

◦ Klassen.


5<br />

SWT - Implementierung<br />

<strong>13</strong>.1 Einführung und Überblick<br />

<br />

Voraussetzungen<br />

Für jede Systemkomponente existiert eine<br />

Spezifikation<br />

<strong>Die</strong> Softwarearchitektur ist so ausgelegt, daß die<br />

Implementierungen umfangsmäßig pro Funktion,<br />

Zugriffsoperation bzw. Operation wenige Seiten<br />

nicht überschreiten.<br />

6<br />

Planungsphase<br />

SWT - Implementierung<br />

Legende:<br />

Phase<br />

<strong>13</strong>.1 Lastenheft Einführung und Überblick<br />

Phasenergebnis<br />

Weitergabe von<br />

Teilprodukten<br />

Definitionsphase<br />

Produkt-Definition<br />

Entwurfsphase<br />

Produkt-Entwurf<br />

Softwarearchitektur<br />

Spezifikation der Systemkomponenten<br />

Programme, Gesamtprodukt<br />

<strong>Implementierungsphase</strong><br />

Abnahme- und<br />

Einführungsphase<br />

Installiertes Produkt<br />

Implementierungsprozeß<br />

Quellprogramme inkl. Dokumentation<br />

Objektprogramme<br />

Testplanung und Testprotokoll<br />

bzw. Verifikationsdokumentation


SWT - Implementierung<br />

7<br />

<strong>13</strong>.1 Einführung und Überblick<br />

<br />

<br />

Aktivitäten<br />

Konzeption von Datenstrukturen und Algorithmen<br />

Strukturierung des Programms durch geeignete<br />

Verfeinerungsebenen<br />

Dokumentation der Problemlösung und der<br />

Implementierungsentscheidungen<br />

Umsetzung der Konzepte in die Konstrukte der<br />

verwendeten Programmiersprache<br />

Angaben zur Zeit- und Speicherkomplexität<br />

Test oder Verifikation des Programmes einschl.<br />

Testplanung und Testfallerstellung<br />

Auch »Programmieren im Kleinen« genannt.<br />

SWT - Implementierung<br />

8<br />

<strong>13</strong>.1 Einführung und Überblick<br />

<br />

<br />

Teilprodukte<br />

Quellprogramm einschl. integrierter Dokumentation<br />

Objektprogramm<br />

Testplanung und Testprotokoll bzw.<br />

Verifikationsdokumentation<br />

Alle Teilprodukte aller Systemkomponenten<br />

müssen integriert und einem Systemtest<br />

unterzogen werden.


SWT - Implementierung<br />

9<br />

<strong>13</strong>.1 Einführung und Überblick<br />

<br />

Basiskonzepte zur Implementierung der<br />

Systemkomponenten:<br />

Kontrollstrukturen<br />

• nur »lineare Kontrollstrukturen«<br />

• »Strukturiertes Programmieren i. e. S.«<br />

Entscheidungstabellen.<br />

SWT - Implementierung<br />

10<br />

<strong>13</strong>.2 Prinzipien der Implementierung<br />

<br />

Bei der Implementierung sollten folgende<br />

Prinzipien eingehalten werden:<br />

Prinzip der Verbalisierung<br />

Prinzip der problemadäquaten Datentypen<br />

Prinzip der Verfeinerung<br />

Prinzip der integrierten Dokumentation.


SWT - Implementierung<br />

11<br />

<strong>13</strong>.2.1 Prinzip der Verbalisierung<br />

<br />

<br />

Verbalisierung<br />

Gedanken und Vorstellungen in Worten<br />

ausdrücken und damit ins Bewußtsein bringen<br />

Gute Verbalisierung<br />

Aussagekräftige, mnemonische<br />

Namensgebung<br />

Geeignete Kommentare<br />

Selbstdokumentierende Programmiersprache.<br />

SWT - Implementierung<br />

12<br />

<strong>13</strong>.2.1 Prinzip der Verbalisierung<br />

<br />

Bezeichnerwahl<br />

Problemadäquate Charakterisierung<br />

Konstanten, Variablen, Prozeduren usw.<br />

Soll die Funktion dieser Größe bzw. ihre<br />

Aufgabe zum Ausdruck bringen<br />

Bezeichner, die problemfrei sind oder<br />

technische Aspekte z.B. der Repräsentation<br />

bezeichnen, sind zu vermeiden<br />

<strong>Die</strong> in der Mathematik übliche Verwendung<br />

einzelner Buchstaben ist ebenfalls ungeeignet.


<strong>13</strong><br />

SWT - Implementierung<br />

<strong>13</strong>.2.1 Prinzip der Verbalisierung<br />

Beispiel 1<br />

• Feld1, Feld2, Zaehler<br />

◦ problemfreie, technische Bezeichner<br />

• Besser:<br />

• Messreihe1, Messreihe2, Anzahlzeichen<br />

◦ problembezogene Bezeichner<br />

Beispiel 2<br />

• P = G2 + Z1 * D<br />

◦ Bezeichner ohne Aussagekraft, zu kurz<br />

• Besser:<br />

• Praemie = Grundpraemie2 + Zulage1 *<br />

<strong>Die</strong>nstjahre;.<br />

14<br />

SWT - Implementierung<br />

<strong>13</strong>.2.1 Prinzip der Verbalisierung<br />

Beispiel 3<br />

• Praemie = 50.0 + 10.0 * <strong>Die</strong>nstjahre<br />

◦ unverständliche Konstanten<br />

• Besser:<br />

• const float Grundpraemie2 = 50.0;<br />

• const float Zulage1 = 10.0;<br />

• Praemie = Grundpraemie2 + Zulage1 *<br />

<strong>Die</strong>nstjahre;<br />

Durch die Verwendung benannter Konstanten wird<br />

die Lesbarkeit eines Programmes deutlich<br />

verbessert<br />

• Zusätzlich wird das Programm dadurch auch<br />

änderungsfreundlicher.


SWT - Implementierung<br />

15<br />

<strong>13</strong>.2.1 Prinzip der Verbalisierung<br />

Kurze Bezeichner sind nicht aussagekräftig und<br />

außerdem wegen der geringen Redundanz<br />

anfälliger gegen Tippfehler und Verwechslungen<br />

Der erhöhte Schreibaufwand durch lange<br />

Bezeichner wird durch die Vorteile mehr als<br />

ausgeglichen.<br />

SWT - Implementierung<br />

16<br />

<strong>13</strong>.2.1 Prinzip der Verbalisierung<br />

<br />

Verbalisierung wird durch geeignete<br />

Kommentare unterstützt<br />

Als vorteilhaft hat sich erwiesen, den else-Teil<br />

einer Auswahl zu kommentieren<br />

• Als Kommentar wird angegeben, welche<br />

Bedingungen im else-Teil gelten<br />

• Beispiel<br />

if (A < 5)<br />

{ ...}<br />

else //A >= 5<br />

{ ...}.


SWT - Implementierung<br />

17<br />

<strong>13</strong>.2.1 Prinzip der Verbalisierung<br />

<br />

<br />

Kurzkommentare sollten vermieden<br />

werden<br />

<strong>Die</strong> in ihnen enthaltene Information ist meist<br />

besser in Namen unterzubringen<br />

Beispiel<br />

• I = I + 1; //I wird um Eins erhöht<br />

• Besser:<br />

Lagermenge = Lagermenge + 1;<br />

Besonders wichtige Kommentare<br />

In einen Kommentarkasten.<br />

SWT - Implementierung<br />

18<br />

<strong>13</strong>.2.1 Prinzip der Verbalisierung<br />

<br />

<br />

Grad der Kommentierung<br />

Abhängig davon, ob Programmiersprache<br />

selbstdokumentierend<br />

ADA gilt in dieser Beziehung als vorbildlich<br />

C++ ist ein schlechtes Beispiel<br />

Vorteile der Verbaliserung<br />

+ Leichte Einarbeitung in fremde Programme<br />

bzw. Wiedereinarbeitung in eigene Programme<br />

+ Erleichtert »code reviews«, Modifikationen und<br />

Wartung<br />

+ Verbesserte Lesbarkeit der Programme.


SWT - Implementierung<br />

19<br />

<strong>13</strong>.2.2 Prinzip der problemadäquate Datentypen<br />

<br />

Problemadäquate Datentypen<br />

Daten- und Kontrollstrukturen eines Problems<br />

sollen sich in der programmiersprachlichen<br />

Lösung möglichst unverfälscht widerspiegeln<br />

Programmiersprache sollte folgende<br />

Eigenschaften bezogen auf Datenstrukturen<br />

besitzen:<br />

• Umfangreiches Repertoire an Basistypen<br />

• Geeignete Typkonstruktoren<br />

• Benutzerdefinierbare Typen.<br />

SWT - Implementierung<br />

20<br />

<strong>13</strong>.2.2 Prinzip der problemadäquate Datentypen<br />

<br />

<br />

Aufgabe des Programmierers<br />

Angebot an Konzepten einer<br />

Programmiersprache optimal zur<br />

problemnahen Lösungsformulierung<br />

verwenden<br />

Regeln:<br />

Können die Daten durch Basistypen<br />

beschrieben werden, dann ist der geeignete<br />

Basistyp auszuwählen<br />

• Der Wertebereich sollte so festgelegt<br />

werden, daß er möglichst genau das<br />

Problem widerspiegelt – unter Umständen<br />

durch Einschränkungen des Basistyps.


21<br />

SWT - Implementierung<br />

<strong>13</strong>.2.2 Prinzip der problemadäquate Datentypen<br />

Beispiele<br />

• enum FamilienstandT {ledig,<br />

verheiratet, geschieden, verwitwet};<br />

• enum GeschlechtT {weiblich, maennlich};<br />

• enum AmpelT {rot, gruen, gelb};<br />

• enum SteuerschluesselT {ohne_Steuer,<br />

Vorsteuer, halbe_MwSt,volle_MwSt};<br />

• enum WeinpraedikateT {Kabinett,<br />

Spaetlese, Auslese, Beerenauslese,<br />

Trockenbeerenauslese};<br />

• enum BauteiltypT {R, L, C, U, I};<br />

• n! ist nur für nichtnegative ganze Zahlen definiert<br />

◦ Der Basistyp sollte entsprechend gewählt werden:<br />

unsigned long NFAK (unsigned long n);.<br />

22<br />

SWT - Implementierung<br />

<strong>13</strong>.2.2 Prinzip der problemadäquate Datentypen<br />

Typkonstruktor Feld verwenden, wenn:<br />

a Zusammenfassung gleicher Datentypen<br />

b Zugriff wird dynamisch berechnet (während der<br />

Laufzeit)<br />

c Hohe Komponentenanzahl möglich<br />

d Feldgrenzen statisch, dynamisch oder<br />

unspezifiziert<br />

e Mittlere Zugriffszeit auf eine Komponente,<br />

unabhängig vom Wert des Index<br />

f Als zugehörige Kontrollstruktur wird die zählende<br />

Wiederholung eingesetzt<br />

• Beispiel<br />

◦ In einem Textsystem wird eine Textseite<br />

folgendermaßen beschrieben:<br />

◦ typedef char TextzeileT[Zeilenlaenge];<br />

◦ typedef TextzeileT TextseiteT[Zeilenanzahl];


23<br />

SWT - Implementierung<br />

<strong>13</strong>.2.2 Prinzip der problemadäquate Datentypen<br />

Typkonstruktor Verbund verwenden, wenn:<br />

a Zusammenfassung logischer Daten mit<br />

unterschiedlichen Typen<br />

b Zugriff wird statisch berechnet (zur<br />

Übersetzungszeit)<br />

c Anzahl der Komponenten ist immer fest<br />

d Jede Komponente ist einzeln benannt, daher ist<br />

der Umfang begrenzt<br />

e Kurze Zugriffszeit auf Komponente erwünscht<br />

f Bei varianten Verbunden ist die Mehrfachauswahl<br />

die geeignete Kontrollstruktur.<br />

24<br />

SWT - Implementierung<br />

<strong>13</strong>.2.2 Prinzip der problemadäquate Datentypen<br />

Typkonstruktor Verbund: Beispiele<br />

• Der Datentyp eines Adreßverwaltungsprogramms<br />

sieht problemadäquat folgendermaßen aus:<br />

struct AdresseT<br />

const char * Strasse;<br />

int PLZ;<br />

const char * Wohnort;<br />

• Es sollen komplexe Zahlen verarbeitet werden;<br />

der geeignete Datentyp ist:<br />

struct ComplexT<br />

{<br />

float Re, Im;<br />

};.


SWT - Implementierung<br />

25<br />

<strong>13</strong>.2.2 Prinzip der problemadäquate Datentypen<br />

<br />

Vorteile problemadäquater Datentypen<br />

+ Gut verständliche, leicht lesbare,<br />

selbstdokumentierende und wartbare<br />

Programme<br />

+ Statische und dynamische Typprüfungen<br />

verbessern die Qualität des jeweiligen<br />

Programms<br />

+ <strong>Die</strong> Daten des Problems werden 1:1 in<br />

Datentypen des Programms abgebildet, d.h.<br />

Wertebereiche werden weder über- noch<br />

unterspezifiziert.<br />

SWT - Implementierung<br />

26<br />

<strong>13</strong>.2.2 Prinzip der problemadäquate Datentypen<br />

<br />

Voraussetzungen:<br />

Möglichst optimale Unterstützung durch<br />

geeignete Konzepte in der verwendeten<br />

Programmiersprache<br />

Anwendung des Prinzips der Verbalisierung,<br />

insbesondere bei der Namenswahl<br />

Bei fehlenden modernen Sprachkonzepten<br />

ausführliche Kommentierung<br />

Definition geeigneter Datenabstraktionen bzw.<br />

Klassen mit problemangepaßten Operationen.


SWT - Implementierung<br />

27<br />

<strong>13</strong>.2.3 Prinzip der Verfeinerung<br />

<br />

<br />

Verfeinerung<br />

<strong>Die</strong>nt dazu, ein Programm durch<br />

Abstraktionsebenen zu strukturieren<br />

Verfeinerungsstruktur kann auf 2 Arten im<br />

Quellprogramm sichtbar gemacht werden<br />

<strong>Die</strong> oberste Verfeinerungsebene – bestehend<br />

aus abstrakten Daten und abstrakten<br />

Anweisungen – ist kompakt beschrieben<br />

• <strong>Die</strong> Realisierung jeder Verfeinerung wird an<br />

anderer Stelle beschrieben<br />

Alle Verfeinerungsebenen sind substituiert<br />

• <strong>Die</strong> übergeordneten Verfeinerungen werden<br />

als Kommentare gekennzeichnet.<br />

SWT - Implementierung<br />

28<br />

<strong>13</strong>.2.3 Prinzip der Verfeinerung<br />

Ein Algorithmus soll aus zwei eingegebenen<br />

Daten die Anzahl der Zinstage berechnen:<br />

void berechneZinstage()<br />

{<br />

int Datum1, Datum2; // Eingabedaten, Form TTMM<br />

int Tage; // Ausgabedaten<br />

// Voraussetzung:Daten liegen innerhalb eines Jahres<br />

// Algorithmus -------------------------------------<br />

// Eingabe<br />

// Aufgliederung in Tag und Monat<br />

// Beruecksichtigung der Sonderfaelle<br />

// Berechnung der Tage<br />

// Ausgabe<br />

}.


SWT - Implementierung<br />

29<br />

<strong>13</strong>.2.3 Prinzip der Verfeinerung<br />

// refinements: 1. Verfeinerung:<br />

// Eingabe<br />

cout > Datum1;<br />

cout > Datum2; cout


SWT - Implementierung<br />

31<br />

<strong>13</strong>.2.3 Prinzip der Verfeinerung<br />

<br />

Da die meisten Programmiersprachen eine<br />

solche Darstellung nicht erlauben, müssen die<br />

Verfeinerungen substituiert werden:<br />

void berechneZinstage()<br />

{<br />

int Datum1, Datum2; // Eingabedaten, Form TTMM<br />

int Tage; // Ausgabedaten<br />

//Voraussetzung: <strong>Die</strong> Daten liegen innerhalb eines Jahres<br />

int Tag1, Tag2; // Hilfsgroessen<br />

int Monat1, Monat2; // Hilfsgroessen<br />

// Eingabe<br />

cout > Datum1;<br />

cout


SWT - Implementierung<br />

33<br />

<strong>13</strong>.2.3 Prinzip der Verfeinerung<br />

In dieser Notation werden in Kommentarform die<br />

Verfeinerungsschichten aufgeführt<br />

Durch Einrücken nach rechts kann man die Tiefe<br />

der Verfeinerung hervorheben<br />

Bei diesen Kommentaren handelt es sich um<br />

Verfeinerungen, die bei der Konzeption des<br />

Programms entstanden sind und nur in<br />

Kommentarform notiert werden.<br />

SWT - Implementierung<br />

34<br />

<strong>13</strong>.2.3 Prinzip der Verfeinerung<br />

Vorteile<br />

+ Der Entwicklungsprozeß ist im Quellprogramm<br />

dokumentiert<br />

+ Leichtere und schnellere Einarbeitung in ein<br />

Programm<br />

+ <strong>Die</strong> Details können zunächst übergangen<br />

werden<br />

+ <strong>Die</strong> Entwicklungsentscheidungen können besser<br />

nachvollzogen werden<br />

+ <strong>Die</strong> oberen Verfeinerungsschichten können in<br />

natürlicher Sprache formuliert werden<br />

+ Ein Programm wird zweidimensional strukturiert:<br />

sowohl durch Kontrollstrukturen als auch durch<br />

Verfeinerungsschichten.


SWT - Implementierung<br />

35<br />

<strong>13</strong>.2.4 Prinzip der integrierten Dokumentation<br />

<br />

<br />

Dokumentation<br />

Integraler Bestandteil jedes Programms<br />

Ziele der Dokumentation:<br />

Angabe von Verwaltungsinformationen<br />

Erleichterung der Einarbeitung<br />

Beschreibung der Entwicklungsentscheidungen<br />

• Warum wurde welche Alternative gewählt?.<br />

SWT - Implementierung<br />

36<br />

<strong>13</strong>.2.4 Prinzip der integrierten Dokumentation<br />

<br />

Richtlinie<br />

Folgende Verwaltungsinformationen sind am<br />

Anfang eines Programms aufzuführen<br />

(Vorspann des Programms):<br />

1 Name des Programms<br />

2 Name des bzw. der Programmautoren (Vorund<br />

Nachname)<br />

3 Versionsnummer, Status und Datum<br />

4 Aufgabe des Programms:<br />

Kurzgefaßte Beschreibung<br />

5 Zeit- und Speicherkomplexität in O-Notation.


SWT - Implementierung<br />

37<br />

<strong>13</strong>.2.4 Prinzip der integrierten Dokumentation<br />

<br />

<br />

Versionsnummer besteht aus 2 Teilen:<br />

Release-Nummer<br />

• I. allg. einstellig<br />

• Steht, getrennt durch einen Punkt, vor der<br />

Level-Nummer (maximal zweistellig)<br />

• Vor der Release-Nummer steht ein V<br />

Level-Nummer<br />

Beispiel: V1.2<br />

<strong>Die</strong> Version kennzeichnet zusammen mit<br />

dem Status den Bearbeitungszustand des<br />

Programms.<br />

SWT - Implementierung<br />

38<br />

<strong>13</strong>.2.4 Prinzip der integrierten Dokumentation<br />

<br />

Bearbeitungszustände (V-Modell)<br />

geplant<br />

• Ein neues Programm enthält die<br />

Versionsnummer 1.0 und den Status<br />

»geplant«<br />

in Bearbeitung<br />

• Das Programm befindet sich im privaten<br />

Entwicklungsbereich des Implementierers<br />

oder unter seiner Kontrolle in der<br />

Produktbibliothek.


39<br />

SWT - Implementierung<br />

<strong>13</strong>.2.4 Prinzip der integrierten Dokumentation<br />

vorgelegt<br />

• Das Programm ist aus Implementierersicht fertig<br />

und wird in die Konfigurationsverwaltung<br />

übernommen<br />

• Vom Status »vorgelegt« ab führen Modifikationen<br />

zu einer Fortschreibung der Versionsangabe<br />

akzeptiert<br />

• Das Programm wurde von der Qualitätssicherung<br />

überprüft und freigegeben<br />

• Es darf nur innerhalb einer neuen Version<br />

geändert werden.<br />

40<br />

SWT - Implementierung<br />

<strong>13</strong>.2.4 Prinzip der integrierten Dokumentation<br />

Beispiel: Programmvorspann<br />

<br />

// Programmname: XYZ<br />

//****************************************************<br />

// Autor 1: Vorname Nachname<br />

// Autor 2: Vorname Nachname<br />

//****************************************************<br />

// Version: V1.0 in Bearbeitung 4.4.96<br />

// vorgelegt 6.4.96<br />

// akzeptiert 7.4.96<br />

// V1.1 in Bearbeitung 15.4.96<br />

// vorgelegt 16.4.96<br />

//****************************************************<br />

// Aufgabe: Aufgabenbeschreibung<br />

// Zeitkomplexitaet: O(n log 2n)<br />

// Speicherkomplexitaet O(2n).


SWT - Implementierung<br />

41<br />

<strong>13</strong>.2.4 Prinzip der integrierten Dokumentation<br />

<br />

Dokumentation muß integraler Bestandteil der<br />

Software-Entwicklung sein:<br />

Bei einer Nachdokumentation am Ende der<br />

Codeerstellung sind wichtige Informationen, die<br />

während der Entwicklung angefallen sind, oft nicht<br />

mehr vorhanden<br />

Entwicklungsentscheidungen (z.B.: Warum wurde<br />

welche Alternative gewählt?) müssen dokumentiert<br />

werden, um bei Modifikationen und<br />

Neuentwicklungen bereits gemachte Erfahrungen<br />

auswerten zu können<br />

Der Aufwand für die Dokumentation wird reduziert,<br />

wenn zu dem Zeitpunkt, an dem die Information<br />

anfällt von demjenigen, der sie erzeugt oder<br />

verarbeitet, auch dokumentiert wird.<br />

SWT - Implementierung<br />

42<br />

<strong>13</strong>.2.4 Prinzip der integrierten Dokumentation<br />

<br />

<br />

Das Prinzips der integrierten Dokumentation...<br />

+ reduziert den Aufwand zur Dokumentenerstellung,<br />

+ stellt sicher, daß keine Informationen<br />

verlorengehen,<br />

+ garantiert die rechtzeitige Verfügbarkeit der<br />

Dokumentation,<br />

+ erfordert die entwicklungsbegleitende<br />

Dokumentation<br />

Eine gute Dokumentation bildet die<br />

Voraussetzung für<br />

leichte Einarbeitung in ein Produkt bei<br />

Personalwechsel oder durch neue Mitarbeiter<br />

gute Wartbarkeit des Produkts.


SWT - Implementierung<br />

43<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

<br />

Schrittweise Verfeinerung<br />

(stepwise refinement)<br />

Bietet einen methodischen Rahmen für die<br />

Anwendung der allgemeinen top-down-<br />

Methode auf das »Programmieren im Kleinen«<br />

Im Gegensatz zum Prinzip der Verfeinerung,<br />

das das zu erreichende Ziel beschreibt, gibt<br />

die schrittweise Verfeinerung einen<br />

methodischen Ansatz an, wie man dieses Ziel<br />

erreicht<br />

• Ausgehend von einer gegebenen und<br />

präzisen Problemstellung z.B. in Form einer<br />

Systemkomponenten-Spezifikation wird eine<br />

Problemlösung mit abstrakten Daten und<br />

abstrakten Anweisungen formuliert.<br />

SWT - Implementierung<br />

44<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

<br />

Beispiel:<br />

<strong>Zur</strong> Konzentration der Einkaufs-, Vertriebsund<br />

Marketingstrategie wird in einer<br />

Weinhandlung in vierteljährlichen Abständen<br />

eine Statistik benötigt, die die<br />

Umsatzverteilung der Weinanbaugebiete<br />

angibt<br />

<strong>Die</strong> Statistik soll den Umsatz in DM sowie die<br />

prozentuale Veränderung gegenüber der<br />

letzten Statistikperiode pro Anbaugebiet<br />

angeben.


SWT - Implementierung<br />

45<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

Datentypen und Prozeduren:<br />

// Typ fuer Artikelnummern<br />

typedef unsigned short ArtikelNrT;<br />

typedef float DMarkT; // Typ fuer Deutsche Mark<br />

enum GebietT {BADEN, RHEINPFALZ, WUERTTEMBERG,<br />

FRANKEN, RHEINHESSEN, HESSISCHEBERGSTR, RHEINGAU,<br />

NAHE, MITTELRHEIN, MOSELSAARRUWER, AHR, AUSLAND};<br />

const int ANZAHLGEBIETE = AUSLAND + 1<br />

// Liste mit Umsatz in DM fuer jedes Anbaugebiet<br />

typedef DMarkT UmsatzlisteT[ANZAHLGEBIETE];<br />

// Prozeduren<br />

void ErmittleWeinumsatz(int ArtikelNr, DMarkT<br />

&ViertelJahresUmsatz, GebietT &Anbaugebiet,<br />

bool &ArtikelNrBelegt);<br />

void UmsatzAltLesen(UmsatzlisteT &UListe);<br />

void UmsatzAltAktualisieren(UmsatzlisteT &UListe);.<br />

SWT - Implementierung<br />

46<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

1. Schritt: abstrakte Problemlösung<br />

Es werden problemspezifische Typen, Daten und<br />

Anweisungen eingeführt und in verbaler Form<br />

beschrieben<br />

<strong>Die</strong> Typen und Daten sollen problemrelevante<br />

Aspekte benennen<br />

<strong>Die</strong> Operationen sollen Teilaufgaben abgrenzen<br />

Beides soll losgelöst von programmiersprachlichen<br />

Formulierungen erfolgen.


SWT - Implementierung<br />

47<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

1. Schritt: abstrakte Problemlösung<br />

// Programmname: UmsatzProAnbaugebiet<br />

// Aufgabe: ....<br />

// Importierte Typen:<br />

// ArtikelNrT, DMarkT, GebietT, UmsatzListeT<br />

// Importierte Prozeduren:<br />

// ErmittleWeinumsatz, UmsatzAltLesen,<br />

UmsatzAltAktualisieren<br />

// Datenstrukturen ----------------------------------<br />

// TabelleUmsatzProGebiet<br />

// Algorithmus --------------------------------------<br />

// Vorbereitung (1)<br />

// Weinumsatz pro Anbaugebiet ermitteln (2)<br />

// Vergleich mit Umsatzstatistik der Vorperiode (3)<br />

// Umsatzstatistik Vorperiode durch neue ersetzen (4)<br />

// Druckaufbereitung und Ausgabe (5).<br />

SWT - Implementierung<br />

48<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

2. Schritt: Verfeinerung der abstrakten<br />

Problemlösung<br />

Typen, Daten und Anweisungen werden verfeinert<br />

• konkretisiert, präzisiert, detailliert, formalisiert<br />

Typen und Daten werden unmittelbar oder mittelbar<br />

durch Konstruktionskonzepte auf Standardtypen<br />

abgebildet<br />

Anweisungen werden auf primitivere Anweisungen<br />

oder Standardfunktionen, -prozeduren oder<br />

Datenabstraktionen zurückgeführt<br />

Reihenfolge der Verfeinerungen so wählen, daß<br />

zunächst die abstrakten Anweisungen bearbeitet<br />

werden, die auf Auswahl- oder<br />

Wiederholungsanweisungen abgebildet werden.


SWT - Implementierung<br />

49<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

// Verfeinerung der Datenstrukturen ------------------<br />

// Datentyp fuer Tabelle mit<br />

// - Umsatz in DM und<br />

// - prozentuale Veraenderung pro Anbaugebiet<br />

//<br />

struct UmsatzT<br />

{<br />

DMarkT UmsatzNeu;<br />

int ProzentAbweichung;<br />

};<br />

typedef struct UmsatzT UmsatzTabT[AnzahlGebiete];<br />

// Variablendefinition:<br />

UmsatzTabT TabelleUmsatzProGebiet;.<br />

SWT - Implementierung<br />

50<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

// Verfeinerung der abstrakten Anweisungen------------<br />

// Vorbereitung (1)<br />

// Weinumsatz pro Anbaugebiet ermitteln: (2)<br />

// for alle Weinartikel do (2a)<br />

// Weinumsatz pro Artikel lesen; (2b)<br />

// Umsatz in TabelleUmsatzProGebiet aufaddieren; (2c)<br />

// Vergleich mit Umsatzstatistik der Vorperiode: (3)<br />

// Alte Umsatzstatistik lesen (3a)<br />

// for alle Anbaugebiete do (3b)<br />

// Umsatzwerte vergleichen; (3c)<br />

// Prozentuale Abweichung ausrechnen und (3d)<br />

// in TabelleUmsatzProGebiet speichern;.


SWT - Implementierung<br />

51<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

// Umsatzstatistik Vorperiode durch neue ersetzen: (4)<br />

// Neue Werte in alte Liste eintragen (4a)<br />

// UmsatzAltAktualisieren(UmsatzListeAlt); (4b)<br />

// Druckaufbereitung und Ausgabe: (5)<br />

// Drucke Ueberschrift; (5a)<br />

// for alle Anbaugebiete do (5b)<br />

// Drucke(Anbaugebiet, Umsatz, Prozentabweichung).<br />

SWT - Implementierung<br />

52<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

3. Schritt: Weitere Verfeinerung<br />

<strong>Die</strong> sukzessive Zerlegung oder Verfeinerung<br />

endet, wenn alle Typen, Daten und Anweisungen<br />

in Termen der verwendeten Programmiersprache<br />

beschrieben sind<br />

Nach jeder Verfeinerung können die verfeinerten<br />

Teile in die Problemlösung der übergeordneten<br />

Verfeinerungsschicht substituiert werden<br />

• <strong>Die</strong> abstrakten Typen, Daten und Anweisungen<br />

werden dann zu Kommentaren.


SWT - Implementierung<br />

53<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

3. Schritt: Weitere Verfeinerung<br />

// benoetigte Variablen<br />

ArtikelNrT ArtikelNr;<br />

DMarkT Umsatz;<br />

GebietT Gebiet;<br />

UmsatzlisteT UmsatzListeAlt;<br />

UmsatzTabT TabelleUmsatzProGebiet;<br />

bool Ok;<br />

char *GText[]={ „Baden“, „Rheinpfalz“,<br />

„Württemberg“, „Franken“,<br />

„Rheinhessen“, „Hessischebergstr”,<br />

„Rheingau“, „Nahe“, „Mittelrhein“,<br />

„Moselsaarruwer“, „Ahr“, „Ausland“ };.<br />

SWT - Implementierung<br />

54<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

3. Schritt: Weitere Verfeinerung<br />

// Umsetzung der verbal beschriebenen Anweisungen<br />

// in die verwendete Zielsprache<br />

// Vorbereitung: (1)<br />

for (Gebiet = BADEN; Gebiet


SWT - Implementierung<br />

55<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

3. Schritt: Weitere Verfeinerung<br />

// Alte Umsatzstatistik lesen: (3a)<br />

UmsatzAltLesen(UmsatzListeAlt);<br />

// for alle Anbaugebiete do: (3b)<br />

for (Gebiet = BADEN; Gebiet


SWT - Implementierung<br />

57<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

<br />

Merkmale der schrittweisen Verfeinerung:<br />

Daten und Anweisungen sollen parallel verfeinert<br />

werden<br />

Es soll solange wie möglich eine Notation benutzt<br />

werden, die das Problem in natürlicher Form<br />

beschreibt<br />

Abstrakte Anweisungen, die durch Auswahl- oder<br />

Wiederholungsstrukturen realisiert werden, sollten<br />

zuerst verfeinert werden<br />

Entscheidungen über die Datenrepräsentation<br />

sollten solange wie möglich aufgeschoben werden<br />

Während der Verfeinerung werden Hilfsobjekte<br />

eingeführt.<br />

SWT - Implementierung<br />

58<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

Jede Verfeinerung impliziert<br />

Implementierungsentscheidungen, die explizit<br />

dargelegt werden sollen<br />

Im Gegensatz zum Softwareentwurf sind alle Daten<br />

zwischen den verschiedenen Teilanweisungen<br />

bekannt und global (kein Geheimnisprinzip)<br />

Ausgeprägte Verbalisierung ist erforderlich<br />

Der Implementierungsprozeß wird in kleine<br />

inkrementelle Abstraktionsschritte unterteilt.


SWT - Implementierung<br />

59<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

<br />

Vorteile<br />

+ Realisiert das Prinzip der Verfeinerung<br />

+ Fördert eine problemorientierte Betrachtungsweise<br />

+ Ist für ein breites Anwendungsspektrum einsetzbar<br />

+ Der Entscheidungsprozeß ist nachvollziehbar<br />

+ Durch die systematische, dokumentierte<br />

Problemstrukturierung werden Änderbarkeit und<br />

Wartbarkeit erleichtert<br />

+ top-down-orientiert<br />

+ Führt zu einer gestuften algorithmischen<br />

Abstraktion<br />

+ Unterstützt systematisches Vorgehen.<br />

SWT - Implementierung<br />

60<br />

<strong>13</strong>.3 Methode der schrittweisen Verfeinerung<br />

Nachteile:<br />

– Keine ausgeprägte Methode mit definierten,<br />

problemunabhängigen Schritten<br />

– Anwendung erfordert Erfahrung und Intuition,<br />

insbesondere um zur ersten abstrakten<br />

Problemlösung zu gelangen<br />

– Bei mehreren Verfeinerungsstufen verliert man<br />

leicht den Überblick<br />

– Automatische Substitutionsmechanismen für<br />

verfeinerte Typen und Datenstrukturen stellt noch<br />

keine Sprache zur Verfügung.


SWT - Implementierung<br />

61<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

<br />

Jeder Programmierer macht Fehler!<br />

Viele dieser Fehler sind auf Eigenheiten der<br />

menschlichen Wahrnehmung und des<br />

menschlichen Denkens zurückzuführen<br />

Außerdem spielt die Denkpsychologie eine<br />

Rolle<br />

Assoziationen und Einstellungen des<br />

Menschen beeinflussen sein Denken<br />

<strong>Die</strong> meisten Programmierfehler lassen sich auf<br />

bestimmte Denkstrukturen und -prinzipien<br />

zurückführen<br />

Durch die Beachtung einiger Regeln lassen<br />

sich diese Fehler daher vermeiden.<br />

SWT - Implementierung<br />

62<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

<br />

Hintergrundwissen<br />

Jeder Mensch benutzt bei seinen Handlungen<br />

bewußt oder unbewußt angeborenes oder<br />

erlerntes Hintergrundwissen<br />

<strong>Die</strong>ses Hintergrundwissen ist Teil des<br />

Wissens, das einer Bevölkerungsgruppe, z.B.<br />

den Programmierern, gemeinsam ist<br />

Programmierfehler lassen sich nun danach<br />

klassifizieren, ob das Hintergrundwissen für<br />

die Erledigung der Aufgabe angemessen ist<br />

oder nicht.


SWT - Implementierung<br />

63<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

<br />

Klassifizierung von Programmierfehlern<br />

Programmierfehler<br />

Irrtümer<br />

Schnitzer<br />

überindividuell<br />

(Denkfallen)<br />

individuell<br />

angeborenes<br />

Verhalten<br />

erlerntes Verhalten<br />

(Tradition)<br />

Begabung<br />

Ausbildung<br />

SWT - Implementierung<br />

64<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

<br />

<br />

»Schnitzer«<br />

sind Tippfehler, Versprecher usw.<br />

Sie werden vor allem durch eine schlechte<br />

Benutzungsoberfläche verursacht<br />

Irrtümer<br />

sind der Kategorie »Wissen« zuzuordnen<br />

<strong>Die</strong>sen Fehlern ist gemeinsam, daß der<br />

Programmierer den Fehler auch beim<br />

wiederholten Durchlesen seines Programms<br />

nicht sieht.


SWT - Implementierung<br />

65<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

<br />

Denkfallen<br />

Überindividuelle Irrtümer<br />

• Sie treten auf, wenn das Hintergrundwissen<br />

der Aufgabenstellung nicht angemessen ist<br />

Individuelle Irrtümer<br />

• Ergeben sich durch unzureichende<br />

Begabung oder Ausbildung<br />

Denkfallen ergeben sich aus bestimmten<br />

Denkstrukturen und -prinzipien<br />

<strong>Die</strong>se führen zu einem Verhaltens- und<br />

Denkmodell, das das Verhalten eines<br />

Programmierers beeinflußt.<br />

SWT - Implementierung<br />

66<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

<br />

Prinzipien des Verhaltens- und Denkmodells<br />

1 Übergeordnete Prinzipien<br />

• Scheinwerferprinzip<br />

• Sparsamkeits- bzw. Ökonomieprinzip<br />

2 <strong>Die</strong> »angeborenen Lehrmeister«<br />

• Strukturerwartung<br />

(Prägnanzprinzip, kategorisches Denken)<br />

• Kausalitätserwartung<br />

(lineares Ursache-Wirkungs-Denken)<br />

• Anlage zur Induktion (Überschätzung<br />

bestätigender Informationen)<br />

3 Bedingungen des Denkens<br />

• Assoziationen<br />

• Einstellungen.


SWT - Implementierung<br />

67<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

1 Übergeordnete Prinzipien<br />

Beschreiben, wie unser Wahrnehmungs- und<br />

Denkapparat mit begrenzten Ressourcen fertig wird<br />

Scheinwerferprinzip<br />

• Aus den Unmengen an Informationen, die der<br />

Mensch ständig aus seiner Umwelt erhält, wählt<br />

er aus und verarbeitet er bewußt stets nur relativ<br />

kleine Portionen<br />

• Leider sind es oft die wichtigen Dinge, die<br />

unbeachtet bleiben<br />

• Viele Programmierfehler zeigen dies:<br />

◦ Ausnahme- und Grenzfälle werden übersehen<br />

◦ <strong>Die</strong> Initialisierung von Variablen wird vergessen<br />

◦ Funktionen besitzen unübersehbare Nebenwirkungen.<br />

SWT - Implementierung<br />

68<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

Sparsamkeits- bzw. Ökonomieprinzip<br />

• Es kommt darauf an, ein Ziel mit möglichst<br />

geringem Aufwand zu erreichen<br />

• Der Trend zum sparsamen Einsatz der<br />

verfügbaren Mittel birgt allerdings auch Gefahren<br />

in sich<br />

• Denk- und Verhaltensmechanismen, die unter<br />

normalen Umständen vorteilhaft sind, können<br />

dem Programmierer zum Verhängnis werden<br />

• Typische Fehler gehen auf falsche Hypothesen<br />

über die Arbeitsweise des Computers zurück<br />

◦ Insbesondere mit der Maschinenarithmetik kommt der<br />

Programmierer oft aufgrund zu einfacher<br />

Modellvorstellungen in Schwierigkeiten.


SWT - Implementierung<br />

69<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

2 <strong>Die</strong> »angeborenen Lehrmeister«<br />

Stellen höheres Wissen dar, das den weiteren<br />

Wissenserwerb steuert<br />

• <strong>Die</strong>ses höhere Wissen spiegelt den »Normalfall«<br />

wider<br />

• Mit ungewöhnlichen Situationen wird es nicht so<br />

gut fertig<br />

Strukturerwartung<br />

• Erleichtert dem Menschen die Abstraktion<br />

• Daraus folgt das Prägnanzprinzip, das besagt,<br />

daß es sich lohnt, Ordnung aufzuspüren und<br />

auszunutzen<br />

• Bilden von Kategorien zum Schaffen von<br />

Ordnung.<br />

SWT - Implementierung<br />

70<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

Strukturerwartung<br />

• Prägnanzprinzip und kategorisches Denken<br />

führen in außergewöhnlichen Situationen<br />

gelegentlich zu Irrtümern, zu unpassenden<br />

Vorurteilen oder zu Fehlverhalten<br />

• Eine Reihe von Programmierfehlern läßt sich<br />

darauf zurückführen<br />

• Beispiel<br />

◦ Für reelle Zahlen gilt das assoziative Gesetz<br />

◦ Für die Maschinenarithmetik gilt dies aber nicht<br />

• Allgemein gilt:<br />

◦ Fehler, die darauf beruhen, daß der Ordnungsgehalt der<br />

Dinge überschätzt wird oder den Dingen zu viele<br />

Gesetze auferlegt werden, lassen sich auf das<br />

Prägnanzprinzip zurückführen.


SWT - Implementierung<br />

71<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

Kausalitätserwartung<br />

• Führt zu einem linearen Ursache-Wirkungs-<br />

Denken und zu der übermäßigen Vereinfachung<br />

komplexer Sachverhalte<br />

◦ Der Mensch neigt dazu, irgendwelche Erscheinungen<br />

vorzugsweise nur einer einzigen Ursache zuzuschreiben<br />

◦ Er macht oft die Erfahrung, daß die gleichen<br />

Erscheinungen dieselbe Ursache haben, so daß dieses<br />

Vorurteil zum festen Bestandteil des menschlichen<br />

Denkens gehört und nur mit Anstrengung überwunden<br />

werden kann<br />

• Das lineare Ursache-Wirkungs-Denken kann in<br />

komplexen Entscheidungssituationen<br />

»fürchterlich« versagen<br />

• Gerade die Umwelt eines Programmierers ist<br />

aber ein vernetztes System.<br />

SWT - Implementierung<br />

72<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

<strong>Die</strong> Anlage zur Induktion<br />

• Der Mensch neigt zu induktiven Hypothesen<br />

• <strong>Die</strong> Fähigkeit, im Besonderen das Allgemeine, im<br />

Vergangenen das Zukünftige erkennen zu<br />

können, verleitet zur Überschätzung<br />

bestätigender Informationen<br />

• Beispiel<br />

◦ Ein Test, der das erwartete Ergebnis liefert, wird in<br />

seiner Aussagekraft überschätzt<br />

• Im Gegensatz zur Deduktion ist die Induktion<br />

kein zwingendes Schließen<br />

• Gesetzmäßigkeiten werden vorschnell als<br />

gesichert angesehen<br />

• Dadurch werden Dinge klargemacht, die<br />

eigentlich verwickelt und undurchsichtig sind.


SWT - Implementierung<br />

73<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

<strong>Die</strong> Anlage zur Induktion<br />

• In der Programmierung stößt man oft auf die<br />

Denkfalle, daß bestätigende Informationen<br />

überschätzt werden<br />

• Der Programmierer gibt sich oft schon mit<br />

einer schwachen Lösung zufrieden<br />

• Nach einer besseren wird nicht gesucht<br />

• Das Programm wird für optimal gehalten, nur<br />

weil es offensichtlich funktioniert.<br />

SWT - Implementierung<br />

74<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

3 Bedingungen des Denkens<br />

<strong>Die</strong> Bedingungen des Denkens betreffen die<br />

parallele Darstellung der Denkinhalte und den<br />

sequentiellen Ablauf der bewußten Denk-vorgänge,<br />

d.h. die raum-zeitliche Organisation des Denkens<br />

Assoziationen<br />

• Neue Denkinhalte werden in ein Netz von<br />

miteinander assoziierten Informationen<br />

eingebettet<br />

• Bei der Aktivierung eines solchen Denkinhalts<br />

wird das assoziative Umfeld mit aktiviert<br />

• Geht es beim Programmieren um die Zuordnung<br />

von Bezeichnern und Bedeutungen, dann spielen<br />

Assoziationen eine Rolle.


SWT - Implementierung<br />

75<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

Assoziationen<br />

• Mnemotechnische Namen können irreführend<br />

sein<br />

• Es wird eher an den Namen als an die Bedeutung<br />

geglaubt<br />

• Eine sorglose Bezeichnerwahl kann zur<br />

Verwirrung führen<br />

Einstellungen<br />

• Fehler im Problemlösungsprozeß führen dazu,<br />

daß...<br />

◦ entweder gar keine Lösung gefunden wird, obwohl sie<br />

existiert<br />

◦ oder daß nur eine mangelhafte Lösung erkannt wird, die<br />

noch weit vom Optimum entfernt ist.<br />

SWT - Implementierung<br />

76<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

Einstellungen<br />

• Einstellungen führen zu einer vorgeprägten<br />

Ausrichtung des Denkens<br />

• Sie können zurückgehen auf...<br />

◦ die Erfahrungen aus früheren Problemlöseversuchen in<br />

ähnlichen Situationen<br />

◦ die Gewöhnung und Mechanisierung durch wiederholte<br />

Anwendung eines Denkschemas<br />

◦ die Gebundenheit von Methoden und Werkzeugen an<br />

bestimmte Verwendungszwecke<br />

◦ die Vermutung von Vorschriften, wo es keine gibt<br />

(Verbotsirrtum).


SWT - Implementierung<br />

77<br />

<strong>13</strong>.4 <strong>Zur</strong> Psychologie des Programmierens<br />

Einstellungen<br />

• Um Fehler durch Einstellungen zu verhindern,<br />

sollte das Aufzeigen von Lösungsalternativen<br />

und eine Begründung der Methodenwahl zum<br />

festen Bestandteil der Problembearbeitung<br />

gemacht werden<br />

• Einstellungen führen zu determinierenden<br />

Tendenzen beim Problemlösen:<br />

◦ <strong>Die</strong> Anziehungskraft, die von einem nahen (Teil-)Ziel<br />

ausgeht, verhindert das Auffinden eines<br />

problemlösenden Umwegs<br />

◦ <strong>Die</strong> vorhandenen Strukturen und Teillösungen lenken<br />

den weiteren Lösungsprozeß in bestimmte Bahnen.<br />

SWT - Implementierung<br />

78<br />

<strong>13</strong>.5 Selbstkontroliertes Programmieren<br />

Der erfahrene Programmierer lernt aus<br />

seinen Fehlern<br />

Er hält sich an Regeln und Vorschriften, die<br />

der Vermeidung dieser Fehler dienen<br />

In diesem Sinne ist das Programmieren eine<br />

Erfahrungswissenschaft<br />

Jeder Programmierer sollte für sich einen<br />

Katalog von Programmierregeln aufstellen und<br />

fortlaufend verbessern<br />

Es entsteht ein Regelkreis des<br />

selbstkontrollierten Programmierens.


SWT - Implementierung<br />

79<br />

<strong>13</strong>.5 Selbstkontroliertes Programmieren<br />

<br />

Der Regelkreis des selbstkontrollierten<br />

Programmierens<br />

Programmspezifikation<br />

Katalog von Programmierregeln<br />

Programmieren<br />

Fehleranalyse<br />

Programm<br />

Versagen<br />

korrekte Ergebnisse<br />

SWT - Implementierung<br />

80<br />

Typische Programmierfehler (1)<br />

<br />

Unnatürliche Zahlen<br />

Negative Zahlen werden oft falsch behandelt<br />

• In der täglichen Erfahrung tauchen negative<br />

Zahlen nicht auf, weil sie »unnatürlich« sind<br />

Ursache: Prägnanzprinzip<br />

Beispiel:<br />

• Oft werden für die Beendigung der Eingabe<br />

die Werte 0 oder negative Werte verwendet<br />

• <strong>Die</strong>se Verwendung »unnatürlicher Zahlen«<br />

als Endezeichen vermischt zwei Funktionen,<br />

nämlich das Beenden des<br />

Eingabevorganges und die Werteeingabe.


SWT - Implementierung<br />

81<br />

Typische Programmierfehler (2)<br />

<br />

Ausnahme- und Grenzfälle<br />

Vorzugsweise werden nur die Normalfälle<br />

behandelt<br />

Sonderfälle und Ausnahmen werden<br />

übersehen<br />

Es werden nur die Fälle erfaßt, die man für<br />

repräsentativ hält<br />

Ursachen: Kausalitätserwartung,<br />

Sparsamkeitsprinzip<br />

Beispiele:<br />

• »Um eins daneben« Fehler<br />

• Indexzählfehler.<br />

SWT - Implementierung<br />

82<br />

Typische Programmierfehler (3)<br />

<br />

Falsche Hypothesen<br />

Erfahrene Programmierer haben Faustregeln<br />

entwickelt, sich einfache Hypothesen und<br />

Modelle über die Arbeitsweise eines<br />

Computers zurechtgelegt<br />

Aber: <strong>Die</strong>ses Wissen veraltet, mit einer<br />

Änderung der Umwelt werden die Hypothesen<br />

falsch<br />

Ursache: Prägnanzprinzip<br />

Beispiele:<br />

• Multiplikationen dauern wesentlich länger<br />

als Additionen<br />

• Potenzieren ist aufwendiger als<br />

Multiplizieren.


SWT - Implementierung<br />

83<br />

Typische Programmierfehler (4)<br />

<br />

Tücken der Maschinenarithmetik<br />

Sonderfall der falschen Hypothesen<br />

Der Computer hält sich nicht an die Regeln der<br />

Algebra und Analysis<br />

Reelle Zahlen werden nur mit begrenzter<br />

Genauigkeit dargestellt<br />

Ursache: Prägnanzprinzip<br />

Beispiele:<br />

• Abfrage auf Gleichheit reeller Zahlen, statt<br />

abs(a – b ) < epsilon;<br />

• Aufsummierung unendlicher Reihen:<br />

Summanden werden so klein, daß ihre<br />

Beträge bei der Rundung verlorengehen.<br />

SWT - Implementierung<br />

84<br />

Typische Programmierfehler (5)<br />

<br />

<br />

Irreführende Namen<br />

Wahl eines Namens, der eine falsche Semantik<br />

vortäuscht<br />

Daraus ergibt sich eine fehlerhafte Anwendung<br />

Ursache: Assoziationstäuschung<br />

Unvollständige Bedingungen<br />

Das konsequente Aufstellen komplexer<br />

logischer Bedingungen fällt schwer<br />

Häufig ist die Software nicht so komplex, wie<br />

das zu lösende Problem<br />

Ursache: Kausalitätserwartung.


SWT - Implementierung<br />

85<br />

Typische Programmierfehler (6)<br />

<br />

Unverhoffte Variablenwerte<br />

<strong>Die</strong> Komplexität von Zusammenhängen wird<br />

nicht erfaßt<br />

Ursache: Scheinwerferprinzip,<br />

Kausalitätserwartung<br />

Beispiele:<br />

• Verwechslung global wirksamer Größen mit<br />

Hilfsgrößen<br />

• Falsche oder vergessene Initialisierung von<br />

Variablen.<br />

SWT - Implementierung<br />

86<br />

Typische Programmierfehler (7)<br />

<br />

Wichtige Nebensachen<br />

<strong>Die</strong> Unterteilung von Programmen in<br />

sicherheitskritische und sicherheitsunkritische<br />

Teile, in eigentliches Programm und<br />

Kontrollausdrucke führt oft zur<br />

Vernachlässigung der »Nebensachen«<br />

Dadurch entstehen Programme mit<br />

»abgestufter Qualität«, wobei Fehler in den<br />

»Nebensachen« oft übersehen werden<br />

Ursache: Prägnanzprinzip<br />

Beispiel:<br />

• Fehler bei der Plazierung von<br />

Kontrollausdrucken täuschen Fehler im<br />

Programm vor.


87<br />

SWT - Implementierung<br />

Typische Programmierfehler (8)<br />

<br />

Trügerische Redundanz<br />

Durch achtloses Kopieren werden Strukturen<br />

geschaffen, die den menschlichen<br />

Denkapparat überfordern<br />

Übertriebene Kommentierung von<br />

Programmen erhöht die Redundanz eines<br />

Programms<br />

Ursache: Anlage zur Induktion<br />

Beispiele:<br />

• Weiterentwicklumg eines Programms<br />

geschieht nicht an der aktuellen Version,<br />

sondern an einem Vorläufer<br />

• Bei Programmänderungen wird vergessen,<br />

den Kommentar ebenfalls zu ändern.<br />

88<br />

SWT - Implementierung<br />

Typische Programmierfehler (9)<br />

<br />

Gebundenheit<br />

Boolesche Ausdrücke treten oft in Verbindung<br />

mit Entscheidungen auf<br />

<strong>Die</strong>s führt in anderen Situationen zu<br />

komplizierten Ausdrücken<br />

Ursache: funktionale Gebundenheit<br />

boolescher Ausdrücke<br />

Beispiel:<br />

• if B then x:=true else x:= false<br />

anstelle von<br />

• x:=B (B=beliebiger boolescher Ausdruck).


SWT - Implementierung<br />

89<br />

<strong>13</strong>.5 Selbstkontroliertes Programmieren<br />

<br />

Das Lernen aus Fehlern ist besonders gut<br />

geeignet, um Denkfallen zu vermeiden<br />

Im Laufe des Anpassungsprozesses wird der<br />

»Scheinwerfer der Aufmerksamkeit« auf die<br />

kritischen Punkte gerichtet<br />

Jeder Programmierer sollte einen Regelkatalog<br />

in einer Datei bereithalten und an seine<br />

Bedürfnisse anpassen<br />

Das Lernen aus Fehlern wird außerdem<br />

dadurch gefördert, daß man die Fehler<br />

dokumentiert<br />

• Es sollte ein Fehlerbuch angelegt werden,<br />

das eine Sammlung typischer Fehler enthält.<br />

SWT - Implementierung<br />

90<br />

<strong>13</strong>.5 Selbstkontroliertes Programmieren<br />

<br />

Ein Fehler sollte in ein Fehlerbuch<br />

eingetragen werden, wenn...<br />

die Fehlersuche lange gedauert hat<br />

die durch den Fehler verursachten Kosten<br />

hoch waren oder<br />

der Fehler lange unentdeckt geblieben ist.


SWT - Implementierung<br />

91<br />

<strong>13</strong>.5 Selbstkontroliertes Programmieren<br />

<br />

Folgende Daten sollten im Fehlerbuch<br />

erfaßt werden:<br />

Laufende Fehlernummer<br />

Datum (wann entstanden, wann entdeckt)<br />

Programmname mit Versionsangabe<br />

Fehlerkurzbeschreibung (Titel)<br />

Ursache (Verhaltensmechanismus)<br />

Rückverfolgung<br />

• Gab es schon Fehler derselben Sorte?<br />

• Warum war eine früher vorgeschlagene<br />

Gegenmaßnahme nicht wirksam?<br />

Programmierregel, Gegenmaßnahme<br />

Ausführliche Fehlerbeschreibung.<br />

SWT - Implementierung<br />

92<br />

Regelkatalog zur Vermeidung von Fehlern (1)<br />

<br />

Grundsätze des Programmentwurfs<br />

Auf Lesbarkeit achten<br />

• Bedeutung der Prinzipien Verbalisierung,<br />

problemadäquate Datentypen, integrierte<br />

Dokumentation.<br />

Nach der Methode der schrittweisen<br />

Verfeinerung vorgehen<br />

Sparsamkeit bei Schnittstellen- und<br />

Variablendeklarationen<br />

• Globale Variablen vermeiden<br />

• kurze Parameterlisten<br />

• Gültigkeitsbereiche von Variablen möglichst<br />

stark beschränken.


SWT - Implementierung<br />

93<br />

Regelkatalog zur Vermeidung von Fehlern (2)<br />

<br />

Das Programm und seine Teile gliedern in:<br />

• Initialisierung, Eingabe, Verarbeitung,<br />

Ausgabe<br />

Verwendung linearer Kontrollstrukturen<br />

• Sequenz, Auswahl, Wiederholung, Aufruf<br />

Regeln gegen das Prägnanzprinzip<br />

Fehlerkontrolle durchführen<br />

• Sorgfalt besonders bei Diskretisierung<br />

kontinuierlicher Größen<br />

• Bei numerischen Programmen<br />

Maschinenarithmetik beachten.<br />

SWT - Implementierung<br />

94<br />

Regelkatalog zur Vermeidung von Fehlern (3)<br />

Nie reelle Zahlen auf Gleichheit oder<br />

Ungleichheit abfragen<br />

Keine temporäre Ausgabebefehle verwenden<br />

• Ausgabebefehle zur Unterstützung von<br />

Tests in Auswahlanweisungen plazieren und<br />

global ein- und ausschalten<br />

Faustregeln von Zeit zu Zeit überprüfen<br />

• Effizienzsteigernde Tricks können durch<br />

neue Hardware unnötig werden.


SWT - Implementierung<br />

95<br />

Regelkatalog zur Vermeidung von Fehlern (4)<br />

<br />

Regeln gegen das lineare Kausaldenken<br />

Redundanz reduzieren<br />

• Prozeduren verwenden, anstatt mehrfach<br />

verwendete Teile zu kopieren<br />

• Kommentare sparsam verwenden, besser<br />

gute Bezeichner und passende<br />

Datenstrukturen wählen<br />

Zusicherungen ins Programm einbauen<br />

• Als Kommentare ins Programm einfügen<br />

else-Teil einer Auswahl kommentieren<br />

• Als Kommentar angeben, welche<br />

Bedingungen für einen else-Teil gelten.<br />

SWT - Implementierung<br />

96<br />

Regelkatalog zur Vermeidung von Fehlern (5)<br />

<br />

<br />

Ist ein Fehler gefunden: weitersuchen<br />

• In der Umgebung von Fehlern sind meist weitere<br />

ETn und Entscheidungsbäume beim Aufstellen<br />

komplexer logischer Bedingungen verwenden<br />

Regeln gegen die Überschätzung<br />

bestätigender Informationen<br />

Alternativen suchen<br />

• Stets davon ausgehen, daß es noch bessere<br />

Lösungen gibt<br />

• Aktivierung von Heuristiken<br />

Regeln gegen irreführende Assoziationen<br />

Bezeichner wählen, die Variablen und Operationen<br />

möglichst exakt bezeichnen.


SWT - Implementierung<br />

97<br />

<strong>13</strong>.5 Selbstkontroliertes Programmieren<br />

<br />

Heuristiken<br />

Hat man ein Problem und keine Lösungsidee,<br />

dann kann die bewußte Aktivierung von<br />

Heuristiken helfen, Denkblockaden<br />

aufzubrechen und gewohnte Denkbahnen zu<br />

verlassen<br />

Heuristiken sind Lösungsfindeverfahren, die<br />

auf Hypothesen, Analogien oder Erfahrungen<br />

aufgebaut sind.<br />

SWT - Implementierung<br />

98<br />

Heuristiken für die Programmierung (1)<br />

<br />

<br />

<br />

<br />

Basisheuristik<br />

Kann ich in der Liste der Heuristiken eine<br />

finden, die mir weiterhilft?<br />

Analogie<br />

Habe ich ein ähnliches Problem schon einmal<br />

bearbeitet?<br />

Kenne ich ein verwandtes Problem?<br />

Verallgemeinerung<br />

Hilft mir der Übergang von einem Objekt zu<br />

einer Klasse von Objekten weiter?<br />

Spezialisierung<br />

Bringt es mich weiter, wenn ich zunächst einen<br />

leicht zugänglichen Spezialfall löse?


SWT - Implementierung<br />

99<br />

Heuristiken für die Programmierung (2)<br />

<br />

<br />

<br />

Variation<br />

Komme ich durch eine Veränderung der<br />

Problemstellung der Lösung näher?<br />

Kann ich die Problemstellung anders<br />

ausdrücken?<br />

Rückwärtssuche<br />

Ich betrachte das gewünschte Ergebnis<br />

• Welche Operationen können mich zu diesem<br />

Ergebnis führen?<br />

Teile und herrsche<br />

Läßt sich das Problem in leichter lösbare<br />

Teilprobleme zerlegen?<br />

SWT - Implementierung<br />

100<br />

Heuristiken für die Programmierung (3)<br />

<br />

Vollständige Enumeration<br />

Ich lasse einen Teil der Bedingungen weg<br />

• Kann ich mir Lösungen verschaffen, die<br />

wenigstens einen Teil der Zielbedingungen<br />

erfüllen?<br />

• Kann ich mir alle Lösungen verschaffen, die<br />

diese Bedingungen erfüllen?

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!