06.02.2013 Aufrufe

Effizientes Programmieren - Methoden und Werkzeuge ...

Effizientes Programmieren - Methoden und Werkzeuge ...

Effizientes Programmieren - Methoden und Werkzeuge ...

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.

<strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong><br />

<strong>Werkzeuge</strong><br />

Dipl.-Inf. Martin Barbisch, Dipl.-Inf. Ursula Vollmer<br />

WS 2006/2007<br />

1 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Teil 1 - <strong>Methoden</strong> <strong>und</strong> Techniken<br />

1 Vorgehensmodelle<br />

2 Konsistenz / Style Guides<br />

3 DRY-Prinzip / Wiederverwendung<br />

4 Orthogonalität<br />

5 Automatisierung<br />

6 Refaktorisieren<br />

7 Software-Ergonomie<br />

3 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Organisatorisches<br />

Kontakt:<br />

Martin Barbisch (Raum 3.5):<br />

martin.barbisch@ims.uni-stuttgart.de<br />

Ursula Vollmer (Raum 3.3):<br />

ursula.vollmer@ims.uni-stuttgart.de<br />

Sprechst<strong>und</strong>e(n):<br />

Martin Barbisch: nach Vereinbarung<br />

Ursula Vollmer: Mi, 10 - 11 Uhr<br />

Scheinbedingungen:<br />

Bearbeitung <strong>und</strong> Abgabe der Übungsaufgaben<br />

Bestehen des Abschlusstests (benoteter Schein)<br />

http://www.ims.uni-stuttgart.de/lehre/teaching/2006-WS/<strong>Effizientes</strong>-<strong>Programmieren</strong><br />

2 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Motivation (Thematik)<br />

<strong>Programmieren</strong> sehr komplex<br />

hoher Frustfaktor<br />

Verlässlichkeit (vor allem bei großen<br />

Projekten)<br />

4 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Motivation (Zielgruppe)<br />

Erleichterung von größeren <strong>und</strong> kleineren<br />

Programmiertätigkeiten<br />

bereits während der Studienzeit (Aufgaben aus Seminaren,<br />

Studien-, Diplomarbeit, ...)<br />

Industrie<br />

Forschungsprojekte<br />

5 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Überblick (Teil 2 - <strong>Werkzeuge</strong>)<br />

Programmiersprachen:<br />

Welche Programmiersprache für welche Aufgabenstellung?<br />

Editoren<br />

Versionskontrolle<br />

Fehlersuche<br />

Quellcode erzeugen / anpassen<br />

Dokumentationserstellung<br />

Tests<br />

7 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Überblick (Teil 1 - <strong>Methoden</strong> / Techniken)<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip<br />

Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Exkurs: Software-Ergonomie<br />

6 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

8 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Motivation Vorgehensmodelle<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Code and Fix: Codierung oder Korrektur im Wechsel mit<br />

Ad-hoc-Tests (unwirtschaftlich, aber weit verbreitet)<br />

Einarbeitung neuer Mitarbeiter<br />

externe Zertifizierung eines Unternehmens<br />

9 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Phasenmodelle<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zuordnung von Aktivitäten zu Phasen<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Phasen werden sequenziell hintereinander durchgeführt<br />

Übergang zur nächsten Phase setzt Abschluss der vorigen<br />

Phase voraus<br />

Ergebnisse einer Phase werden<br />

in der nächsten Phase weiterverarbeitet<br />

Meilenstein, um Projektfortschritt zu überprüfen<br />

(Projektmanagement)<br />

11 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Gruppierung von Vorgehensmodellen<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Phasen- / Wasserfallmodelle:<br />

Object Modeling Technique (OMT)<br />

Prototypische <strong>und</strong> iterativ-inkrementelle Vorgehensmodelle:<br />

Spiralmodell<br />

Unified Process<br />

Extreme Programming<br />

Iterativ-inkrementelle Vorgehensmodelle:<br />

Booch<br />

Objectory<br />

Fusion<br />

Catalysis<br />

KobrA<br />

10 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Meilenstein (Definition)<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Meilensteine sind Teilziele,<br />

die nicht durch geplante Zeitpunkte,<br />

sondern durch inhaltliche Kriterien definiert sind.<br />

12 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Exkurs - Kernprozesse<br />

1 Planung<br />

2 Analyse<br />

3 Entwurf<br />

4 Programmierung<br />

5 Validierung & Verifikation<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

13 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Kernprozesse - Analyse<br />

Anforderungsanalyse<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Datenanalyse: Aufbereitung / Auswertung gesammelter Daten<br />

Prozessanalyse / Prozessmodell<br />

Systemanalyse: Black-Box-Modell (Ist- / Soll-Zustand) als<br />

Data Flow Diagram (Datenflussd.):<br />

Verarbeitung <strong>und</strong> Speicherung der Datenströme<br />

State Transition Diagram (Zustandsübergangsd.):<br />

zeitliches Verhalten<br />

Entity Relationship Diagram (Gegenstands-Beziehungs-D.):<br />

Datenverknüpfungen<br />

15 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Kernprozesse - Planung<br />

Lastenheft (Anforderungsdefinition)<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Pflichtenheft (mit technischen Ansätzen verfeinertes<br />

Lastenheft)<br />

Aufwandsschätzung<br />

Vorgehensmodell<br />

14 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Kernprozesse - Entwurf<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Softwarearchitektur:<br />

strukturierte oder hierarchische Anordnung der Komponenten<br />

Beschreibung der Beziehungen zwischen den Komponenten<br />

Strukturiertes Design:<br />

Strukturdiagramme<br />

Schnittstellenbeschreibung<br />

Aufrufhierarchien der Module<br />

Unified Modeling Language (UML)<br />

16 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Entwurfsmuster - Motivation<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Lösungen für wiederkehrende Design-Probleme gesucht.<br />

Organisation/Struktur von (objektorientiertem) Quellcode<br />

verbessern.<br />

Erfahrungs- anstelle von Code-Wiederverwendung.<br />

Die veränderlichen Aspekte einer Anwendung von dem<br />

trennen was konstant bleibt.<br />

“Das einzig konstante in der Softwareentwicklung ist die<br />

Veränderung.”<br />

17 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Entwurfsmuster - Die Erfinder<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Design Patterns (1995), Gamma, Helm, Johnson, Vlissides<br />

(The Gang of Four oder GoF)<br />

Idee Muster anzuwenden stammt von Professor Christopher<br />

Alexander, einem Architekten<br />

19 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Entwurfsmuster - Was sind Entwurfsmuster?<br />

Definition<br />

Ein (Entwurfs-)Muster ist eine Lösung für ein Problem in einem<br />

bestimmten Kontext.<br />

Der Kontext ist die Situation, in der das Muster angewandt<br />

wird. (z.B. Sammlung von Objekten)<br />

Das Problem ist das Ziel, das erreicht werden soll, sowie<br />

Bedingungen. (z.B. alle Objekte durchgehen)<br />

Die Lösung ist ein allgemeines Design. (z.B. Kapsle die<br />

Iteration in einer separaten Klasse)<br />

18 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Entwurfsmuster - Kategorien von Mustern 1<br />

Erzeugungsmuster<br />

Erzeugen Objekte.<br />

Fabrikmethode<br />

Singleton<br />

Strukturmuster<br />

Erzeugen aus Objekten/Klassen umfangreichere Strukturen.<br />

Adapter<br />

Fassade<br />

Verhaltensmuster<br />

Lassen Objekte interagieren.<br />

Beobachter<br />

Strategie<br />

20 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Entwurfsmuster - Kategorien von Mustern 2<br />

Muster gibt es auch für viele andere Bereiche.<br />

Weitere Arten:<br />

Anwendungs-Muster (Client-Server, Schichtenmodelle)<br />

Benutzungsschnittstellen-Muster<br />

aus dem “echten” Leben:<br />

Geschäftsprozess-Muster<br />

Organisations-Muster<br />

21 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Entwurfsmuster - Musterkataloge<br />

Gibt den einzelnen Mustern Namen,<br />

<strong>und</strong> ordnet sie Kategorien zu<br />

Beschreibt Muster <strong>und</strong> ihre<br />

Beziehungen untereinander<br />

Löst welches Problem?<br />

Ein Diagramm beschreibt die<br />

Beziehungen der beteiligten Klassen.<br />

Die Konsequenzen der Anwendung<br />

werden erläutert. (Vor-/Nachteile)<br />

Beispielcode<br />

In welchen Programmen wurde das<br />

Muster schon angewandt?<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Name, Klassifizierung<br />

Zweck<br />

Motivation<br />

Anwendbarkeit<br />

Struktur<br />

Teilnehmer<br />

Interaktionen<br />

Konsequenzen<br />

Implementierung<br />

Beispielcode<br />

Bekannte Verwendungen<br />

Verwandte Muster<br />

23 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Entwurfsmuster - Gemeinsames Vokabular<br />

Besser:<br />

“Ich habe eine Broadcast-Klasse geschrieben. Sie merkt sich,<br />

welche Objekte ihr zuhören, <strong>und</strong> sagt ihnen Bescheid, wenn es<br />

neue Daten gibt. Ein Objekt kann sich jederzeit an- <strong>und</strong><br />

wieder abmelden. Die Broadcast-Klasse muss nichts über die<br />

Zuhörer wissen, diese müssen nur ein bestimmtes Interface<br />

implementieren.”<br />

“Ich benutze das Beobachter-Muster.”<br />

Erleichtert die Kommunikation, wie Fachbegriffe.<br />

22 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Entwurfsmuster - Beispiel: Singleton<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Stellt sicher, dass es von einer Klasse nur eine Instanz gibt, <strong>und</strong><br />

stellt einen globalen Zugriffspunkt darauf bereit.<br />

24 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Entwurfsmuster - Schlußbemerkungen<br />

generelle Lösungen für wiederkehrende Probleme<br />

Erfahrungswiederverwendung<br />

nur einsetzen wo sinnvoll<br />

KISS, einfache Lösungen bevorzugen<br />

kein Entwurfsmuster verwenden, nur weil es irgendwann mal<br />

sinnvoll sein könnte (einfach anfangen, bei Bedarf<br />

Refaktorisieren)<br />

Anti-Muster: sehen wie gute Lösungen aus, sind es aber nicht<br />

25 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Kernprozesse - Validierung & Verifikation<br />

Modultests (Low-Level-Test):<br />

Test einzelner Module<br />

Integrationstests (Low-Level-Test):<br />

Test des Zusammenspiels mehrerer Komponenten<br />

Systemtests (High-Level-Test):<br />

Test des Gesamtsystems gegen die Spezifikation /<br />

Anforderungen<br />

Akzeptanztests (High-Level-Test):<br />

Test durch den K<strong>und</strong>en<br />

27 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Entwurfsmuster - Weiterführende Literatur<br />

Design Patterns, das Original<br />

Head First Design Patterns, witzig, leicht verständlich<br />

The Portland Patterns Repository<br />

http://c2.com/cgi/wiki?WelcomeVisitors<br />

Hillside Group<br />

http://hillside.net<br />

26 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Exkurs - Unterstützungsprozesse<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Qualitätsmanagement:<br />

z.B.: Software-Ergonomie<br />

Konfigurationsmanagement:<br />

Versionsverwaltung<br />

Release Management<br />

Application Management (Anwenderbetreuung <strong>und</strong><br />

Weiterentwicklung)<br />

28 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Exkurs - Unterstützungsprozesse<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Dokumentation:<br />

Software-Dokumentationswerkzeug<br />

Systemdokumentation (Weiterentwicklung <strong>und</strong><br />

Fehlerbehebung)<br />

Betriebsdokumentation (Betreiber / Service)<br />

Bedienungsanleitung (Anwender)<br />

Verfahrensdokumentation (Beschreibung rechtlich relevanter<br />

Softwareprozesse)<br />

29 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Phasenmodelle - Vorteile<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Integration einfach, da:<br />

Anforderung möglichst vollständig ermittelt<br />

Anforderung dokumentiert<br />

Entwurf auf Basis der Anforderungen entwickelt<br />

kein umfangreiches Versions- <strong>und</strong> Konfigurationsmanagement<br />

erforderlich<br />

31 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Phasenmodelle - Anwendung<br />

Anforderungen müssen<br />

sein.<br />

beschreibbar<br />

möglichst stabil<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

30 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Phasenmodelle - Nachteile<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Aufwandsabschätzung:<br />

sehr schwierig (Termin)<br />

auch Weglassen von Teilfunktionen bewirkt nicht viel<br />

schwieriger Integrationstest<br />

32 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Wasserfallmodelle<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

33 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Wasserfallmodelle<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

35 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Wasserfallmodelle<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

34 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Wasserfallmodelle<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

36 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Wasserfallmodelle<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

37 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Wasserfallmodelle - Anwendung<br />

Anforderungen müssen<br />

sein.<br />

beschreibbar<br />

möglichst stabil<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

39 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Wasserfallmodelle<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

kontrollierte Iterationen:<br />

erneute Ausführung bereits abgeschlossener<br />

Entwicklungsaktivitäten unter bestimmten Umständen<br />

(Behebung eines Fehlers, ...)<br />

38 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Wasserfallmodelle - Vorteile<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Integration einfach, da:<br />

Anforderung möglichst vollständig ermittelt<br />

Anforderung dokumentiert<br />

Entwurf auf Basis der Anforderungen entwickelt<br />

kein umfangreiches Versions- <strong>und</strong> Konfigurationsmanagement<br />

erforderlich<br />

40 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Wasserfallmodelle - Nachteile<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Aufwandsabschätzung:<br />

sehr schwierig (Termin)<br />

auch Weglassen von Teilfunktionen bewirkt nicht viel<br />

schwieriger Integrationstest<br />

41 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Prototypische Vorgehensmodelle - Anwendung<br />

Anforderungen unklar<br />

Teile von Anforderungen unklar<br />

43 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Prototypische Vorgehensmodelle<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Erstellung von Prototypen zu bestimmten Zeitpunkten<br />

während der Entwicklung:<br />

Analyse<br />

Entwurf<br />

Implementierung<br />

...<br />

42 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Prototypische Vorgehensmodelle - Vorteile<br />

Integration einfach, da:<br />

Anforderung möglichst vollständig ermittelt<br />

Anforderung dokumentiert<br />

Entwurf auf Basis der Anforderungen entwickelt<br />

Erfüllung geforderter nicht-funktionaler Anforderungen<br />

(Entwurfsprototypen)<br />

kein umfangreiches Versions- <strong>und</strong> Konfigurationsmanagement<br />

erforderlich<br />

Reduktion des Risikos einer Fehlentwicklung ( Überprüfung<br />

kritischer Bereiche mit dem K<strong>und</strong>en)<br />

Identifikation von Systemteilen, die unter Zeitdruck<br />

weggelassen werden können (Prototypen)<br />

44 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Prototypische Vorgehensmodelle - Nachteile<br />

Aufwandsabschätzung:<br />

sehr schwierig (Termin)<br />

auch Weglassen von Teilfunktionen bewirkt nicht viel<br />

schwieriger Integrationstest<br />

Gefahren:<br />

Erhebung der Anforderungen nicht korrekt<br />

→ Verlangsamung des Entwicklungsprozesses<br />

Dokumentation der Anforderungen nicht ordentlich<br />

→ Verlangsamung des Entwicklungsprozesses<br />

Verkennung eines ausführbaren Prototyps von K<strong>und</strong>en /<br />

Benutzern als Endsystem<br />

45 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Iterativ-inkrementelle Verbesserungsmodelle<br />

Erstellung der Ergebnisse einer Teilmenge aller Anforderungen<br />

in sequenzieller Ordnung<br />

Aktivitäten entsprechen im Wesentlichen den Phasen der<br />

Vorgehensmodelle der Phasen- oder Wasserfallmodelle<br />

Inkrement: alle Ergebnisse für die Teilmenge der<br />

Anforderungen<br />

Teilmenge der Anforderungen wird erweitert <strong>und</strong> ein weiteres<br />

Inkrement erstellt<br />

evolutionäre Modelle: Erweiterung um Risikoanalyse zur<br />

Auswahl der Anforderungen des nächsten Inkrements<br />

rekursive Modelle: Durchlauf der Entwicklungsaktivitäten für<br />

jedes (Teil-)System<br />

47 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Iterativ-inkrementelle Verbesserungsmodelle<br />

iterativ: schrittweise<br />

inkrementell: zunehmend<br />

evolutionär: sich entwickelnd<br />

rekursiv: selbstbezüglich<br />

46 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Iterativ-inkrementelle Verbesserungsmodelle - Anwendung<br />

Teile der Anforderungen unklar<br />

Teile der Anforderungen instabil<br />

Aufteilung der Anforderungen in Teilmengen mit wenig<br />

Abhängigkeiten untereinander muss möglich sein<br />

48 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Iterativ-inkrementelle Verbesserungsmodelle - Vorteile<br />

Auslieferungstermin kann eingehalten werden, ggf.:<br />

Auslieferung bereits fertig gestellter Inkremente<br />

Weglassen noch nicht realisierter Anforderungen unter<br />

Zeitdruck<br />

→ Anforderungen mit K<strong>und</strong>en gemeinsam priorisieren<br />

einfacher Integrationstest<br />

49 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Spiralmodell<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Barry W. Boehm (1978)<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Prototypisches <strong>und</strong> iterativ-inkrementelles Vorgehensmodell<br />

Software-Entwicklung als Durchlaufen einer Spirale<br />

51 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Iterativ-inkrementelle Verbesserungsmodelle - Nachteile<br />

umfangreiches Versions- u. Konfigurationsmanagement<br />

Integration der verschiedenen Inkremente kann schwierig sein<br />

50 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Spiralmodell<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

52 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Spiralmodell<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

pro Zyklus werden vier Quadranten durchlaufen:<br />

1 Identifikation von Zielen<br />

Festlegen von Alternativen<br />

Bestimmung von Einschränkungen<br />

2 Bewerten von Alternativen<br />

Aufdecken von Risikoquellen<br />

Definition von Maßnahmen zur Beherrschung der Risiken<br />

3 Entwicklung <strong>und</strong> Abnahme des Software-Systems auf der<br />

jeweiligen Stufe<br />

4 Planung der nächsten Stufe des Software-Systems<br />

Zyklus endet mit Überprüfung des Entwicklungsergebnisses<br />

Abnahme ist Voraussetzung für nächsten Zyklus<br />

53 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Object Modeling Technique (OMT)<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

basiert auf drei verschiedenen Diagramm-Typen:<br />

1 Objektmodell:<br />

statische Objektstruktur des SW-Systems<br />

2 dynamisches Modell:<br />

zeitliche, verhaltensbezogene Aspekte einzelner Objekte<br />

3 funktionales Modell:<br />

Datenverarbeitungs- / Funktionsaspekte<br />

<strong>Werkzeuge</strong>: z.B. Software-ThroughPictures, Visio2000<br />

55 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Object Modeling Technique (OMT)<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

James Rumbaugh <strong>und</strong> Kollegen (Anfang der 1990er)<br />

Phasen- / Wasserfallmodell<br />

54 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Booch<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Grady Booch (1991)<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Iterativ-inkrementelles Vorgehensmodell (Mikroprozess) <strong>und</strong><br />

Wasserfallmodell (Makroprozess)<br />

Mikroprozess: tägliche Entwicklungstätigkeit<br />

Makroprozess: Kontrolle über Entwicklungsprozess<br />

56 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Booch<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

57 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Booch<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

<strong>Werkzeuge</strong>:<br />

Modellierung der Analyse- <strong>und</strong> Entwurfsdiagramme: z.B.<br />

VisualThought, RationalRose<br />

<strong>Werkzeuge</strong> für schnelles Umschalten zwischen Editieren,<br />

Compilieren, Ausführen <strong>und</strong> Debuggen<br />

Reverse-Engineering, damit Dokumentation mit aktueller<br />

Implementierung übereinstimmt: z.B. StP / UML<br />

Klassenbrowser<br />

inkrementeller Compiler<br />

59 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Booch<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

objektorientierte Analyse<br />

Vielzahl verschiedener Diagramme <strong>und</strong> Dokumente zur<br />

Beschreibung des Systems:<br />

Szenarien<br />

Data-Dictionary<br />

Objektdiagramme<br />

Klassendiagramme<br />

Zustandsdiagramme<br />

Interaktionsdiagramme<br />

Moduldiagramme<br />

Prozessdiagramme<br />

58 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Booch<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

<strong>Werkzeuge</strong>:<br />

Debugger mit Kenntnis der Semantik von Klassen <strong>und</strong><br />

Objekten, Belastungstester, Speicheranalyse-Werkzeug<br />

Konfigurations- <strong>und</strong> Versionskontrolle<br />

Wiederverwendung durch Browser mit Navigationsmöglichkeit<br />

in Klassenbibliotheken<br />

GUI-Builder<br />

60 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Objectory<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Ivar Jacobson (1992)<br />

Iterativ-inkrementelles Vorgehensmodell<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Use-Case-Modell beschreibt gesamte Funktionalität des<br />

Systems durch Interaktion von Aussenwelt <strong>und</strong> System<br />

Phasen:<br />

Analyse<br />

Konstruktion<br />

Testen<br />

61 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Fusion<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Derek Coleman <strong>und</strong> Kollegen (Mitte der 1990er)<br />

Rekursives Vorgehensmodell<br />

63 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Objectory<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Entwicklung der ersten Version basierend auf geg.<br />

Anforderungsdokument<br />

Änderungen an den Anforderungen in der Wartungsphase<br />

führen zu neuen Versionen des Systems<br />

Definition von Inkrementen auf dem vorgegebenen<br />

Anforderungsdokument möglich<br />

<strong>Werkzeuge</strong>: z.B. VisualThought, Rational Rose, Rational<br />

Suite TestStudio<br />

62 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Fusion<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

verschiedene Diagramme zur Beschreibung des SW-Systems:<br />

hohe Abstraktionsebene:<br />

Beschreibung der Problemdomäne <strong>und</strong> des gewünschten<br />

Verhaltens durch Objekt- <strong>und</strong> Schnittstellenmodelle<br />

mittlere Abstraktionsebene:<br />

Wiedergabe der Signatur aller Klassen <strong>und</strong> deren statische<br />

Beziehungen durch Klassenbeschreibungen <strong>und</strong><br />

Vererbungsgraphen<br />

niedrige Abstraktionsebene:<br />

Beschreibung der Zusammenarbeit zwischen Klasseninstanzen<br />

<strong>und</strong> spezifischer Situationen zur Laufzeit durch Interaktions<strong>und</strong><br />

Sichtbarkeitsgraphen<br />

<strong>Werkzeuge</strong>: z.B. Rational Rose zur Unterstützung von UML<br />

<strong>und</strong> Testdokumenten<br />

64 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Catalysis<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Desmond D’Souza <strong>und</strong> Alan Wills (1998)<br />

Iterativ-inkrementelles Vorgehensmodell<br />

65 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Rational Unified Process (RUP)<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Ivar Jacobson, James Rumbaugh <strong>und</strong> Grady Booch (1998)<br />

Prototypisches <strong>und</strong> iterativ-inkrementelles Vorgehensmodell<br />

Definition eines generischen Prozess-Rahmens<br />

Spezialisierung für<br />

1 unterschiedliche Anwendungsgebiete<br />

2 verschiedene Organisationen<br />

3 unterschiedliche Kompetenzebenen<br />

4 verschiedene Projektgrößen<br />

möglich<br />

<strong>Werkzeuge</strong>: z.B. VisualThought, Rational Rose, Rational<br />

Suite TestStudio, Rational Werkzeug Suite (kompl. Prozess)<br />

67 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Catalysis<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

komponenten-basiert<br />

UML-basiert<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Typenmodell zur Beschreibung extern sichtbarer Artefakte<br />

Verfeinerung als<br />

Entwicklungsschritt<br />

Verfolgbarkeitsrelation<br />

rekursive Entwicklungsprozesse zur Beherrschung von<br />

Komplexität<br />

<strong>Werkzeuge</strong>: z.B. Platinum Advantage<br />

66 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

KobrA<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Fraunhofer-Team (2001)<br />

Iterativ-inkrementelles Vorgehensmodell<br />

System als Hierarchie von Komponenten<br />

<strong>Werkzeuge</strong>: z.B. Rational Rose<br />

68 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Extreme Programming (XP)<br />

Kent Beck (Ende der 1990er)<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Prototypisches <strong>und</strong> iterativ-inkrementelles Vorgehensmodell<br />

Einsatz bei Projekten mit<br />

extrem kurzer Entwicklungszeit<br />

instabilen Anforderungen<br />

agile Softwareentwicklung<br />

rasche Erstellung eines ausführbaren Systems mit einem<br />

Minimum an flankierenden Maßnahmen, wie z.B. Modellierung<br />

69 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Extreme Programming (XP)<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Planungsphase (Verständnis / Dokumentation der<br />

Anforderungen):<br />

Story Cards:<br />

vom K<strong>und</strong>en erstellt<br />

Beschreibung der gewünschten Eigenschaften<br />

wenige Tage Arbeit<br />

Task Cards:<br />

vom Entwickler-Team erstellt<br />

Diskussion zwischen Entwickler <strong>und</strong> K<strong>und</strong>e<br />

pro Schritt, der zur Implementierung der Story benötigt wird<br />

Abschätzungen für Story Cards <strong>und</strong> Task Cards:<br />

Dauer<br />

Risiko<br />

71 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Extreme Programming (XP)<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Teamgedanke:<br />

Guidelines<br />

gemeinsame Verantwortung für alle Entwicklungsartefakte<br />

Pair Programming:<br />

wechselnde Paarzusammenstellungen<br />

→ Wissensverbreitung<br />

Driver: Konzentration auf Aufgabendetails<br />

Navigator: Konzentration auf Gesamtprojekt <strong>und</strong> Guidelines<br />

Rollenwechsel<br />

frühe Einbeziehung des K<strong>und</strong>en<br />

K<strong>und</strong>e ist Teil des Teams<br />

autorisiert Projekt-Ziele <strong>und</strong> Eigenschaften festzulegen<br />

Akzeptanztest<br />

ständige Kommunikation (Entwickler <strong>und</strong> K<strong>und</strong>e)<br />

70 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Extreme Programming (XP)<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

iterative Phase (Realisierung des Systems):<br />

Auswahl der Story Cards durch K<strong>und</strong>e<br />

Implementierung:<br />

so einfach wie möglich<br />

keine zusätzlichen Eigenschaften einbauen / vorsehen<br />

Refaktorisieren<br />

Automatisierung<br />

ständige Rücksprache mit anderen Entwickler-Teams <strong>und</strong><br />

K<strong>und</strong>e<br />

Verzögerungen, ... sofort mit K<strong>und</strong>e besprechen<br />

Test<br />

72 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Extreme Programming (XP)<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Vorteile:<br />

kurze Entwicklungszyklen<br />

präzise Vorhersagemöglichkeiten<br />

simple <strong>und</strong> effiziente Implementierungen<br />

Nachteile:<br />

ideale Teamgröße: 12-14 Personen<br />

→ für Großprojekte nicht geeignet<br />

disziplinierte Arbeitsweise notwendig<br />

73 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Exkurs - Unified Modeling Language (UML)<br />

Diagrammtypen:<br />

Anwendungsfalldiagramm<br />

Klassendiagramm<br />

Verhaltensdiagramm:<br />

Aktivitätsdiagramm<br />

Kollaborationsdiagramm<br />

Sequenzdiagramm<br />

Zustandsdiagramm<br />

Implementierungsdiagramm:<br />

Komponentendiagramm<br />

Verteilungsdiagramm<br />

75 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Exkurs - Unified Modeling Language (UML)<br />

Unified Modeling Language (UML) ist eine Sprache <strong>und</strong> Notation<br />

zur<br />

Spezifikation<br />

Konstruktion<br />

Visualisierung<br />

Dokumentation<br />

von Modellen für Softwaresysteme.<br />

Die Unified Modeling Language ist keine Methode.<br />

74 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Exkurs - Unified Modeling Language (UML)<br />

Anwendungsfalldiagramm (use case diagram):<br />

Beziehungen zwischen Akteuren<br />

<strong>und</strong> Anwendungsfällen<br />

Akteur:<br />

Einheit außerhalb des Systems<br />

Interaktion mit System<br />

z.B. Benutzer, Betriebssystem, ...<br />

Anwendungsfall (use case):<br />

Aktivitäten eines Systems<br />

Sicht der Akteure<br />

wahrnehmbares Ergebnis<br />

durch Akteur initiiert<br />

unteilbare Beschreibung<br />

76 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Exkurs - Unified Modeling Language (UML)<br />

Klassendiagramm (class diagram):<br />

Basiselemente:<br />

Klasse<br />

Objekt<br />

Schnittstelle<br />

Komponente<br />

...<br />

Beziehungselemente:<br />

Vererbung<br />

Assoziation<br />

Aggregation<br />

Komposition<br />

Abhängigkeitsbeziehung<br />

77 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Exkurs - Unified Modeling Language (UML)<br />

Kollaborationsdiagramm (collaboration diagram) /<br />

Interaktionsdiagramm:<br />

Interaktionen zwischen Objekten<br />

begrenzte Situation<br />

Betonung der Beziehungen<br />

andere Perspektive als<br />

Sequenzdiagramm<br />

79 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Exkurs - Unified Modeling Language (UML)<br />

Aktivitätsdiagramm (activity diagram) / Ablaufdiagramm:<br />

beschreibt Ablaufmöglichkeiten eines Systems<br />

spezielle Form des Zustandsdiagramms<br />

Aktivität: einzelner Schritt in einem Ablauf<br />

Nebenläufigkeit<br />

als Objektflussdiagramm einsetzbar<br />

78 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Exkurs - Unified Modeling Language (UML)<br />

Sequenzdiagramm (sequence diagram) / Interaktionsdiagramm:<br />

Austausch von Nachrichten zwischen<br />

Objekten<br />

zeitlich begrenzte Situation<br />

Betonung des zeitlichen Ablaufs<br />

andere Perspektive als<br />

Kollaborationsdiagramm<br />

80 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Exkurs - Unified Modeling Language (UML)<br />

Zustandsdiagramm (state diagram) / Zustandsübergangsdiagramm<br />

(state transition diagram):<br />

Folge von Zuständen, die ein Objekt einnehmen kann<br />

Zustandsänderungen<br />

hypothetische Maschine (endlicher Automat)<br />

81 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Exkurs - Unified Modeling Language (UML)<br />

Verteilungsdiagramm (deployment diagram):<br />

Konfiguration von Knoten (Prozesse,<br />

Computer)<br />

→ Zuordnung von Komponenten <strong>und</strong><br />

Objekten zu Knoten<br />

Kommunikationsbeziehungen an<br />

Knoten<br />

83 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Exkurs - Unified Modeling Language (UML)<br />

Komponentendiagramm (component diagram):<br />

Beziehungen der Komponenten<br />

untereinander<br />

Komponente:<br />

Software<br />

eigene Identität<br />

definierte Schnittstellen<br />

82 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Exkurs UML - Weiterführende Literatur<br />

Die UML-Kurzreferenz für die Praxis - Überblick über die<br />

wichtigsten Diagrammtypen, jeweils mit Definition,<br />

Beschreibung, Notation <strong>und</strong> Beispiel<br />

84 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zusammenfassung - Einordnung<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Phasen- Wasserfall- Prototyp. Iterativ-inkr.<br />

Modelle<br />

OMT X X<br />

Spiralmodell X X<br />

Unified Process X X<br />

XP X X<br />

Booch X<br />

Objectory X<br />

Fusion X<br />

Catalysis X<br />

KobrA X<br />

85 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zusammenfassung - Vor- / Nachteile<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Vorteile Nachteile<br />

Phasen- Integration einfach Aufwandsabschätzung schwierig<br />

modelle Vers.- / Konfig.management einfach Teilfunktionen mitgeplant<br />

Integrationstest schwierig<br />

Wasserfall- Integration einfach Aufwandsabschätzung schwierig<br />

modelle Vers.- / Konfig.management einfach Teilfunktionen mitgeplant<br />

Integrationstest schwierig<br />

Prototyp. Integration einfach Aufwandsabschätzung schwierig<br />

Modelle nicht-funktionale Anforderungen Teilfunktionen mitgeplant<br />

Vers.- / Konfig.management einfach Integrationstest schwierig<br />

Fehlentwicklung unwahrscheinlich Gefahr: Anforderungserhebung<br />

Weglassen von Systemteilen Gefahr: Prototyp als Endsystem<br />

It.-inkr. Auslieferungstermin einhalten Vers.- / Konfig.man. umfangreich<br />

Modelle Integrationstest einfach Inkrement-Integration schwierig<br />

87 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zusammenfassung - Anwendung<br />

Anforderungen beschreibbar <strong>und</strong> stabil:<br />

Phasenmodelle<br />

Wasserfallmodelle<br />

Anforderungen unklar:<br />

Prototypische Modelle<br />

Iterativ-inkrementelle Modelle<br />

Anforderungen instabil <strong>und</strong> aufteilbar:<br />

Iterativ-inkrementelle Modelle<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

86 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Fazit<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Verwendung eines Vorgehensmodells abhängig von:<br />

Anforderungen des Projekts<br />

Umfang des Projekts<br />

Größe des Entwickler-Teams<br />

Teamfähigkeit der Entwickler<br />

Kommunikationsmöglichkeiten mit dem K<strong>und</strong>en<br />

Es gibt kein Vorgehensmodell, das universell einsetzbar ist.<br />

88 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Fazit<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Wichtig ist die Bearbeitung der Kernprozesse:<br />

Planung<br />

Analyse<br />

Entwurf<br />

Programmierung<br />

Validierung & Verifikation<br />

<strong>und</strong> der Unterstützungsprozesse:<br />

Qualitätsmanagement<br />

Konfigurationsmanagement<br />

Dokumentation<br />

89 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Komplexität beherrschbar machen<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

konsistenter Quelltext einfacher zu verstehen<br />

Aussehen des Codes auch wichtig<br />

pedantisch? konsequent, professionell!<br />

91 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weiterführende Literatur<br />

Familien von Vorgehensmodellen<br />

Vorgehensmodelle<br />

Vorgehensmodelle kompakt - Überblick über die vorgestellten<br />

Vorgehensmodelle<br />

Extreme Programming - kurzgehaltene, anschauliche<br />

Einführung<br />

90 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmierstil<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Der Zweck eines bestimmten Programmierstils ist, den Code für<br />

einen selbst <strong>und</strong> andere leichter lesbar zu machen.<br />

Einfachheit (Programme kurz <strong>und</strong> handlich halten)<br />

Klarheit (verständlich vor allem für den Menschen)<br />

Allgemeinheit (in unterschiedlichsten Situationen korrekt<br />

funktionieren)<br />

Guter Stil ist entscheidend, wenn man gut programmieren will.<br />

92 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Schlechter Stil<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

93 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Guter Stil<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Prinzipien eines Programmierstils basieren auf ges<strong>und</strong>em<br />

Menschenverstand sowie Programmiererfahrung.<br />

Code sollte klar <strong>und</strong> einfach sein:<br />

geradlinige Logik<br />

natürliche Ausdrucksweise<br />

konventioneller Sprachgebrauch (Bewährtes anwenden)<br />

bedeutungsvolle Namen<br />

ordentliche Formatierung<br />

hilfreiche Kommentare<br />

Raffinierte Tricks <strong>und</strong> ungebräuchliche Konstruktionen vermeiden!<br />

95 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Guter Stil<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Gut geschriebene Programme sind besser als schlecht geschriebene,<br />

denn:<br />

leichter lesbar<br />

verständlicher<br />

enthalten weniger Fehler<br />

leichter zu debuggen<br />

leichter zu modifizieren<br />

Erfordert Disziplin.<br />

Compiler haben keine Probleme mit schlecht geschriebenem Code,<br />

Menschen schon...<br />

94 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Konsistenz<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Konsistenz erleichtert anderen Programmierern das Lesen des<br />

Codes.<br />

wichtig im Team: gemeinsamer Stil<br />

96 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Namen<br />

Ein Name<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

bezeichnet ein bestimmtes Objekt (oder Funktion)<br />

übermittelt Informationen über seinen Zweck<br />

sollte informativ, kurz, einprägsam <strong>und</strong> aussprechbar sein<br />

je größer der Sichtbarkeitsbereich, desto mehr Informationen<br />

sollte der Name vermitteln<br />

Beschreibende Namen für globale Variablen, <strong>und</strong> kurze für lokale.<br />

Konsistent sein: verwandten Dingen ähnliche Namen geben. Nicht<br />

Q, Queue <strong>und</strong> queue.<br />

97 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Namen - Variablen<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Klarheit wird oft durch Kürze erreicht.<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

1 for (theElementIndex = 0;<br />

2 theElementIndex < numberOfElements;<br />

3 theElementIndex++)<br />

4 elementArray[theElementIndex] =<br />

theElementIndex;<br />

Besser:<br />

1 for (i = 0; i < nElems; i++)<br />

2 elem[i] = i;<br />

99 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Namen - Variablen<br />

Lokale Variablen:<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

sollten kurz sein<br />

i, j für Schleifenvariablen<br />

p, q für Zeiger (nodep)<br />

s, t für Strings<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

n: Anzahl, nPoints (numberOfPoints ist übertrieben)<br />

98 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Namen - Variablen<br />

Globale Variablen:<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

beginnen oft mit Großbuchstaben oder ’ ’<br />

haben normalerweise längere (selbsterklärende) Namen<br />

(PointsOfInterest, RemoteAccessPoints)<br />

Konstanten:<br />

oft mit Großbuchstaben (MAX SIZE)<br />

100 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Namen - Funktionen<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Aktivität ausdrückende Namen für Funktionen: Verben eventuell<br />

gefolgt von Substantiv.<br />

1 now = date.getTime();<br />

2 putchar(’\n’);<br />

Rückgabewerte sollten einfach deutbar sein:<br />

1 if (checkoctal(c))<br />

besser:<br />

1 if (isoctal(c))<br />

101 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Den klarsten Code schreiben, der die Aufgabe erledigt.<br />

Quellcode so formatieren, dass er gut lesbar ist.<br />

Eigentlich trivial, aber wichtig.<br />

103 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Namen - Benennungskonventionen<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Schreibweise der Namen ist reine Geschmackssache:<br />

1 nPending<br />

2 numPending<br />

3 num_pending<br />

Spezielle Regeln weniger wichtig als das konsistente Einhalten eines<br />

Stils.<br />

102 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Ausdrücke <strong>und</strong> Anweisungen - Einrücken<br />

Einrücken, um Strukturen zu verdeutlichen:<br />

1 for(n++;n


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Ausdrücke <strong>und</strong> Anweisungen - Einrücken<br />

Konventionellere Form, leichter zu verstehen:<br />

1 for (n++; n < 100; n++)<br />

2 field[n] = ’\0’;<br />

3 *i = ’\0’;<br />

4 return(’\n’);<br />

105 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Ausdrücke <strong>und</strong> Anweisungen - Klammern<br />

Klammern setzen um Mehrdeutigkeiten vorzubeugen:<br />

geben Gruppierungen wieder<br />

Absicht verdeutlichen, auch wenn nicht nötig<br />

1 leapYear = y % 4 == 0 && y % 100 != 0<br />

2 || y % 400 == 0;<br />

Besser mit Klammern:<br />

1 leapYear = ((y % 4 == 0) && (y % 100 != 0))<br />

2 || (y % 400 == 0);<br />

107 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Ausdrücke <strong>und</strong> Anweisungen - Ausdrücke<br />

Ausdrücke in natürlicher Form schreiben:<br />

so wie man sie aussprechen würde<br />

Negierungen schwer zu verstehen<br />

1 if (!(n < min) && !(n > max))<br />

Besser Vergleiche positiv formulieren:<br />

1 if ((n >= min) && (n


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Ausdrücke <strong>und</strong> Anweisungen - Klar ausdrücken<br />

Immer versuchen klaren Code zu schreiben, statt kürzestmöglichen:<br />

1 child = (!LC&&!RC)?0:(!LC?RC:LC);<br />

einfacher zu verstehen:<br />

1 if (LC == 0 && RC == 0)<br />

2 child = 0;<br />

3 else if (LC == 0)<br />

4 child = RC;<br />

5 else<br />

6 child = LC;<br />

109 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Ausdrücke <strong>und</strong> Anweisungen - Seiteneffekte<br />

Code mit Seiteneffekten vermeiden.<br />

1 i = 3;<br />

2 array[i++] = i;<br />

Welches Array-Element wird auf welchen Wert gesetzt?<br />

Seiteneffekte mal definiert, mal <strong>und</strong>efiniert. Wenn unsicher: anders<br />

schreiben.<br />

1 i = 3;<br />

2 array[i] = i;<br />

3 i++;<br />

111 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Ausdrücke <strong>und</strong> Anweisungen - Klar ausdrücken<br />

Immer versuchen klaren Code zu schreiben, statt (vermeintlich)<br />

cleveren:<br />

1 subkey =<br />

2 subkey >> (bitoff - ((bitoff >> 3) > (bitoff & 0x7);<br />

oder:<br />

1 subkey >>= bitoff & 0x7;<br />

110 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Idiome<br />

Konsistenz führt zu besseren Programmen.<br />

Nicht:<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Schleifen mal vorwärts, mal rückwärts durchlaufen<br />

Strings mal mit strcpy, mal mit Schleifen kopieren<br />

Gleiche ”Berechnung” immer auf dieselbe Art <strong>und</strong> Weise<br />

vornehmen.<br />

112 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Konsistenz <strong>und</strong> Idiome - Konsistenz beim Einrücken <strong>und</strong><br />

Klammern<br />

Einrückungen offenbaren die Struktur.<br />

Öffnende Klammer auf gleicher Zeile wie if, for, ...?<br />

Letztendlicher Stil weniger wichtig als dessen konsequente<br />

Einhaltung.<br />

Bei Änderungen an fremdem Code, jeweiligen Stil beibehalten.<br />

113 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Idiome - Idiome<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Eines der bekanntesten Idiome ist die Form einer Schleife.<br />

Unüblich:<br />

1 i = 0;<br />

2 while (i = 0; )<br />

2 array[i] = 1.0;<br />

115 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Konsistenz <strong>und</strong> Idiome - Konsistenz beim Einrücken<br />

1 if (month == FEB)<br />

2 {<br />

3 if (year%4 == 0)<br />

4 if (day > 29)<br />

5 legal = false;<br />

6 else<br />

7 if (day > 28)<br />

8 legal = false;<br />

9 }<br />

Die Einrückungen hier sind irreführend! (else)<br />

(Tipp: auch einzelne Zeilen immer mit geschweiften Klammern<br />

umgeben.)<br />

114 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Idiome - Idiome<br />

übliche Form:<br />

1 for (int i = 0; i < n; i++)<br />

2 array[i] = 1.0;<br />

n Elemente besucht<br />

in aufsteigender Reihenfolge<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

gesamte Kontrolle der Schleife im for-Ausdruck<br />

++-Operator zum inkrementieren<br />

Immer bekannte Idiome benutzen.<br />

116 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Idiome - Schleifen<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Standardschleife zum Durchlaufen einer Liste in C:<br />

1 for (p = list; p != NULL; p = p->next)<br />

2 ...<br />

Endlosschleifen:<br />

1 for (;;)<br />

2 ...<br />

3 while (true)<br />

4 ...<br />

117 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Funktionsmakros<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

nicht verwenden<br />

#define ist reine textuelle Ersetzung<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

ändert lexikalische Struktur eines Programms im Hintergr<strong>und</strong><br />

in C++ inline-Funktionen verwenden<br />

Ein Parameter, der mehr als einmal in der Definition des Makros<br />

auftaucht wird auch mehrmals ausgewertet.<br />

119 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Konsistenz <strong>und</strong> Idiome - Mehrfachentscheidungen<br />

else-Klauseln vertikal übereinander statt auf Höhe des jeweiligen<br />

ifs. Betont, dass Tests nacheinander ausgeführt werden.<br />

1 if (Bedingung1)<br />

2 Anweisung1<br />

3 else if (Bedingung2)<br />

4 Anweisung2<br />

5 ...<br />

6 else<br />

7 Defaultanweisung<br />

Sobald eine Bedingung erfüllt ist, wird entsprechender Code<br />

ausgeführt <strong>und</strong> dann nach letztem else-Zweig fortgefahren.<br />

Vermeidet nach rechts wandernden Code. (Tiefe Schachtelung<br />

Zeichen für schlechten Code.)<br />

118 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Funktionsmakros<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Ungewollte Mehrfachauswertung:<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

1 #define isupper(c) ((c) >= ’A’ && (c) = ’A’ &&<br />

2 (c = getchar())


Magische Zahlen<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Magische Zahlen sind die Konstanten, Arraygrößen,<br />

Zeichenpositionen, Umrechnungsfaktoren <strong>und</strong> andere literale<br />

numerische Werte, die in einem Programm auftauchen.<br />

Magischen Zahlen einen Namen geben!<br />

121 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Magische Zahlen - Besser (1/2)<br />

1 enum {<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

2 MINROW = 1, // upper row<br />

3 MINCOL = 1, // left column<br />

4 MAXROW = 24, // lower row<br />

5 MAXCOL = 80, // right column<br />

6 LABELROW = 1, // label position<br />

7 NLET = 26, // alphabet size<br />

8 HEIGHT = MAXROW ? 4, // bar height<br />

9 WIDTH = (MAXCOL ? 1) / NLET // bar width<br />

10 };<br />

11<br />

12 // set scaling factor<br />

13 fac = (lim + HEIGHT - 1) / HEIGHT;<br />

14 if (fac < 1)<br />

15 fac = 1;<br />

123 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Magische Zahlen - Negativbeispiel<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

1 fac = lim / 20; // set scaling factor<br />

2 if (fac < 1)<br />

3 fac = 1;<br />

4<br />

5 // generate histogram<br />

6 for (i = 0, col = 0; i < 27; i++, j++) {<br />

7 col += 3;<br />

8 k = 21 - (let[i] / fac);<br />

9 star = (let[i] == 0 ) ? ’ ’ : ’*’;<br />

10 for (j = k; j < 22; j++)<br />

11 draw (j, col, star);<br />

12 }<br />

13<br />

14 draw(23, 2, ’ ’); // draw x-axis<br />

15 for (i = ’A’; i


Magische Zahlen<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Magische Zahlen als Konstanten definieren.<br />

In C nicht #define (Makro!) verwenden:<br />

1 enum { MAXROW = 24 };<br />

In C++:<br />

1 const int MAXROW = 24;<br />

In Java:<br />

1 static final int MAXROW = 24;<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

125 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Kommentare<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Kommentare sollten nicht offensichtliches wiederholen:<br />

1 // Default behavior<br />

2 default:<br />

3 break;<br />

4<br />

5 // return SUCCESS<br />

6 return SUCCESS;<br />

7<br />

8 zerocount++; // increment zero-entry-counter<br />

9<br />

10 // initialise "total" with "number_received"<br />

11 node->total = node->number_received;<br />

127 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Kommentare<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Kommentare sollen beim Verständnis eines Programms helfen. Sie<br />

sollten kurz bedeutende Details herausstellen oder einen<br />

umfassenden Blick auf den Programmablauf geben.<br />

Kommentare sollten zusätzliche Informationen beinhalten, die nicht<br />

direkt aus dem Code abgelesen werden können. Oder verstreute<br />

Informationen an einer Stelle sammeln.<br />

126 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Kommentare - Funktionen <strong>und</strong> globale Daten<br />

Funktionen <strong>und</strong> globale Daten sollten kommentiert werden.<br />

globale Variablen oft in größeren Abständen über Programm<br />

verstreut: Gedächtnisstütze<br />

Kommentar vor einer Funktion erspart u.U. ihren Code lesen<br />

zu müssen<br />

128 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Kommentare<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Schlechten Code nicht kommentieren, sondern neu schreiben!<br />

Wenn mehr Kommentare als Code geschrieben werden, dann<br />

bedarf der Code wahrscheinlich einer Überarbeitung.<br />

Nicht dem Code widersprechen: oft wird beim Ändern des<br />

Codes die Anpassung der Kommentare vergessen.<br />

Inkonsistenz verwirrt.<br />

Klarheit schaffen, keine Verwirrung (nicht noch mehr Fragen<br />

aufwerfen).<br />

129 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zusammenfassung 1/2<br />

Programmierstil<br />

beschreibende Namen<br />

Klarheit in Ausdrücken<br />

geradlinige Kontrollflüsse<br />

Lesbarkeit von Code <strong>und</strong> Kommentaren<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

konsistente Einhaltung von Konventionen <strong>und</strong> Idiomen<br />

131 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Kommentare<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Kommentare sollen helfen, Teile eines Programmes zu<br />

verstehen, die nicht beim bloßen Lesen des Codes erfasst<br />

werden können.<br />

Code schreiben, der leicht zu verstehen ist. Dann müssen<br />

weniger Kommentare geschrieben werden.<br />

Guter Code benötigt weniger Kommentare als schlechter.<br />

130 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zusammenfassung 2/2<br />

Lohnt der Aufwand?<br />

gut geschriebener Code<br />

ist leichter zu lesen <strong>und</strong> zu verstehen<br />

weist meist weniger Fehler auf<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

oft kürzer als sorglos zusammengestrickter Code<br />

Nachlässiger Code ist schlechter Code.<br />

Guter Stil sollte eine Angewohnheit sein.<br />

132 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Allgemeines<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Quellcode auf englisch<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Funktionen sollten möglichst kurz sein (kurz ist smart)<br />

133 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Style Guides<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

135 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Konsistenz <strong>und</strong> Programmierstil - Weiterführende Literatur<br />

Programmierpraxis, Prinzipien zur effizienten<br />

Programmierung (Brian W. Kernighan, Rob Pike)<br />

134 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Motivation<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Spaghetti-Code vermeiden<br />

Fehlervermeidung<br />

Code für Kollegen leichter verständlich<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Fehlersuche wird einfacher, da alter Code besser verständlich<br />

136 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Inhalt<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Kommentierung des Quellcodes (evtl. Schlüsselwörter)<br />

Namensgebung<br />

Formatierung<br />

Ausdrücke<br />

Reihenfolge der Eigenschaften in Klassendeklarationen<br />

Zugriffsrechte <strong>und</strong> -methoden von Klassen<br />

137 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Formatierung<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Einrücken<br />

verb<strong>und</strong>ene Ausdrücke<br />

Klammersetzung bei Blöcken<br />

Kontrollierter Datenfluss:<br />

leere Blöcke<br />

Blöcke mit nur einer Zeile<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

139 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Namensgebung<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

einheitliche Benennung (Variablen, Konstanten, ...)<br />

z.B. ungarische Notation:<br />

Charles Simonyi<br />

Kennzeichnung von Variablen <strong>und</strong> Funktionen durch optionales<br />

Präfix, Datentypangabe <strong>und</strong> Identifikator<br />

Variablenname dient der Identifikation<br />

Präfix <strong>und</strong> Datentypangabe meist ein bis zwei Kleinbuchstaben:<br />

Zeiger Wahrh.wert Zeichen Funktion Wort Long Byte ...<br />

p f ch fn w l b ...<br />

pointer flag character function word long byte ...<br />

Identifikator beginnt mit Großbuchstaben<br />

Identifikator setzt sich aus Worten zusammen, die mit<br />

Großbuchstaben beginnen<br />

138 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Ausdrücke<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Vermeiden von Shift-Operatoren statt arithmetischen<br />

Operationen<br />

Klammern setzen<br />

Konstanten statt Zahlenliteralen<br />

140 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Fazit<br />

Wichtig ist, dass<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

1 ein Style Guide existiert<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

2 sich das gesamte Team an den Style Guide hält<br />

3 der Style Guide nachvollziehbar ist<br />

4 der Style Guide möglichst viele Aspekte abdeckt<br />

5 Ausnahmen möglich sind, aber nicht zur Regel werden<br />

141 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Quellcode-Formatierer<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

Quellcode-Formatierer passen Quellcode an eigene Vorlieben an:<br />

http://jalopy.sourceforge.net (Java)<br />

http://perltidy.sourceforge.net (Perl)<br />

bcpp (http://dickey.his.com/bcpp/bcpp.html) (C++)<br />

http://www.faqs.org/docs/Linux-HOWTO/C-C++Beautifier-<br />

HOWTO.html<br />

Artistic Style (http://astyle.sourceforge.net) (C, C++, C#,<br />

<strong>und</strong> Java)<br />

143 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Beispiele<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Einige ”offizielle” Style Guides:<br />

Konsistenz <strong>und</strong> Programmierstil<br />

Namen<br />

Ausdrücke <strong>und</strong> Anweisungen<br />

Funktionsmakros<br />

Magische Zahlen<br />

Kommentare<br />

Zusammenfassung<br />

Style Guides<br />

http://java.sun.com/docs/codeconv/html/<br />

CodeConvTOC.doc.html<br />

http://www.perl.com/doc/manual/html/pod/perlstyle.html<br />

Ein Style Guide Generator für C, C++ <strong>und</strong> Java:<br />

http://www.rosvall.ie/CSG/<br />

142 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

DRY-Prinzip<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

144 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Die Übel der Wiederholung<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Als Programmierer sammelt, organisiert, pflegt <strong>und</strong> nutzt man<br />

Wissen.<br />

Wissen ist nicht stabil, es verändert sich schnell.<br />

Anforderungen (des K<strong>und</strong>en) können sich ändern<br />

gewählter Algorithmus funktioniert evtl. nicht<br />

Gesetze ändern sich<br />

Diese Instabilitäten führen dazu, dass das Wissen in einem System<br />

immer wieder neu organisiert <strong>und</strong> formuliert werden muss.<br />

145 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Wie entstehen Wiederholungen?<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Erzwungene Wiederholung. Man scheint keine Wahl zu<br />

haben. Umstände scheinen die Wiederholung zu erfordern.<br />

Unabsichtliche Wiederholung. Aus Versehen.<br />

Wiederholung aus Ungeduld. Faulheit. Wiederholen, weil<br />

es einfacher scheint.<br />

Wiederholungen durch mehrere Entwickler. Verschiedene<br />

Entwickler wiederholen dieselbe Information.<br />

147 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

DRY-Prinzip<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Wenn dasselbe Stück Wissen an zwei oder<br />

mehr Stellen auftaucht, muss bei einer<br />

Änderung einer dieser Repräsentationen daran<br />

gedacht werden auch alle anderen Vorkommen<br />

zu ändern. Sonst sind unschöne Widersprüche<br />

die Folge.<br />

Die Frage ist nicht, ob man die anderen Vorkommen vergisst,<br />

sondern wann.<br />

146 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Erzwungene Wiederholung - Verschiedene<br />

Repräsentationen einer Information<br />

Oft wird dieselbe Information in verschiedenen<br />

Repräsentationsformen benötigt.<br />

Client-Server-Anwendungen mit unterschiedlichen<br />

Programmiersprachen, die gemeinsame Strukturen verwenden<br />

müssen.<br />

Eine Klasse, die das Schema einer Datenbank widerspiegelt.<br />

Erzeugung von Folien, die Quelltext beinhalten, der aber auch<br />

getestet werden soll.<br />

148 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Erzwungene Wiederholung - Verschiedene<br />

Repräsentationen einer Information<br />

Lösungsansätze:<br />

Filter oder Quelltext-Generatoren, die auf gemeinsame<br />

Meta-Daten zurückgreifen<br />

Quellcode-Dateien, die Strukturen deklarieren, für mehrere<br />

Sprachen erzeugen<br />

Klassendeklaration aus Datenbank-Beschreibung erzeugen<br />

lassen<br />

Quellcode per include-Befehl einfügen<br />

149 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Erzwungene Wiederholung - Kommentare<br />

Besser:<br />

1 // check whether we have a valid country<br />

2 if ((country == "Austria") ||<br />

3 (country == "Switzerland") ||<br />

4 (country == "France"))<br />

5 {}<br />

Falsche Kommentare sind schlimmer als gar keine.<br />

151 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Erzwungene Wiederholung - Kommentare<br />

Konkretes Wissen gehört in den Quelltext. Kommentare sind für<br />

abstraktere Erklärungen.<br />

Ansonsten wird Wissen wiederholt, <strong>und</strong> bei jeder Änderung müssen<br />

sowohl Quelltext als auch Kommentar angepasst werden.<br />

1 // valid for Germany and Switzerland<br />

2 if ((country == "Austria") ||<br />

3 (country == "Switzerland") ||<br />

4 (country == "France"))<br />

5 {}<br />

150 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Erzwungene Wiederholung - Dokumentation im Quelltext<br />

Man schreibt Quelltext, <strong>und</strong> die Dokumentation dazu.<br />

Man ändert den Quelltext, <strong>und</strong> muss die Dokumentation<br />

ändern.<br />

Man ändert den Quelltext wieder, ...<br />

Dokumentation aus Quelltext extrahieren! (Doxygen, eigenes<br />

Skript)<br />

152 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Erzwungene Wiederholung - Sprachprobleme<br />

Bei Java ist Klassendeklaration <strong>und</strong> -Definition eins.<br />

In C++ gibt es Header-Dateien (Deklarationen) <strong>und</strong> die<br />

eigentlichen Quelltexte (Implementation der Deklarationen).<br />

1 // stack.h<br />

2 class IntStack<br />

3 {<br />

4 int pop();<br />

5 };<br />

1 // stack.cpp<br />

2 int IntStack::pop()<br />

3 {<br />

4 }<br />

153 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Unabsichtliche Wiederholung<br />

1 class Line {<br />

2 public:<br />

3 Point start;<br />

4 Point end;<br />

5 double length;<br />

6 };<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Wird ’start’ oder ’end’ geändert, so muss auch length neu<br />

berechnet werden.<br />

(Nebenbemerkung: Variablen sollten nie public sein. Stattdessen<br />

getter <strong>und</strong> setter <strong>Methoden</strong> verwenden.)<br />

155 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Unabsichtliche Wiederholung<br />

Fehler im Entwurf:<br />

1 class Van<br />

2 {<br />

3 string model;<br />

4 string licencePlate;<br />

5 string driver;<br />

6 };<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

1 class Tour<br />

2 {<br />

3 string from;<br />

4 string to;<br />

5 string driver;<br />

6 };<br />

Wenn der Van auf Tour geschickt wird, taucht der Fahrer zwei Mal<br />

auf.<br />

154 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Unabsichtliche Wiederholung<br />

Berechnen statt speichern:<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

1 class Line {<br />

2 public:<br />

3 Point start;<br />

4 Point end;<br />

5 double length() {<br />

6 return start.distanceTo(end);<br />

7 }<br />

8 };<br />

Zugriff:<br />

1 double len = line.length; // bad<br />

2 double len = line.length(); // good<br />

156 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Unabsichtliche Wiederholung<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Bei aufwändigen Berechnungen Ergebnis cachen.<br />

1 class Line {<br />

2 public:<br />

3 Point getEnd();<br />

4 void setEnd(Point p) {<br />

5 end = p;<br />

6 upToDate = false;<br />

7 }<br />

8 double length() {<br />

9 if (!upToDate) {<br />

10 length = start.distanceTo(end);<br />

11 upToDate = true;<br />

12 }<br />

13 return length;<br />

14 }<br />

15 };<br />

157 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Wiederholung aus Ungeduld<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Wenn man eine Funktion benötigt, die einer existierenden ähnelt,<br />

dann ist man oft versucht das Original zu kopieren <strong>und</strong> leicht zu<br />

modifizieren.<br />

Besser Originalfunktion flexibler machen, um für beides verwendet<br />

werden zu können.<br />

Oder Originalfunktion aus neuer Funktion heraus aufrufen.<br />

Abkürzungen dauern länger.<br />

159 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Unabsichtliche Wiederholung von Code<br />

Code der mehrmals auftaucht an eine Stelle (z.B. Funktion)<br />

auslagern:<br />

1 _cldb->getSig (get_c_string(car(file)));<br />

2 _cldb->getCoefs(get_c_string(car(file)));<br />

1 const EST_String<br />

2 fileName(get_c_string(car(file)));<br />

3<br />

4 _cldb->getSig (fileName);<br />

5 _cldb->getCoefs(fileName);<br />

reduziert Fehlerquellen, da weniger Code<br />

kann mehrfache Berechnungen ersparen<br />

158 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Wiederholungen durch mehrere Entwickler<br />

Schwer zu entdecken <strong>und</strong> zu vermeiden.<br />

Jeder programmiert sich seine eigenen Hilfsfunktionen. Viele sind<br />

dann mehrfach vorhanden.<br />

Aktive <strong>und</strong> häufige Kommunikation wichtig.<br />

Beispielsweise ein Diskussions-Forum einrichten.<br />

Hilfsfunktionen an zentralem Ort speichern.<br />

160 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Wiederholungen durch mehrere Entwickler<br />

Wiederverwendung einfach machen.<br />

Z.B. Informationen in einem Projekt-Wiki eintragen.<br />

Wenn es nicht einfach ist, werden es die Leute nicht tun.<br />

161 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

DRY-Prinzip<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Jedes Stück Wissen muss eine einzige, eindeutige <strong>und</strong> maßgebliche<br />

Repräsentation in einem System haben.<br />

DRY - Don’t Repeat Yourself!<br />

Eines der wichtigsten ”<strong>Werkzeuge</strong>” eines (pragmatischen)<br />

Programmierers.<br />

163 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Backups<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Backups zählen nicht als red<strong>und</strong>ante Wiederholung von<br />

Informationen.<br />

Regelmäßig Backups erzeugen.<br />

162 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zusammenfassung - DRY-Prinzip<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Don’t Repeat Yourself<br />

Wiederholung aus Ungeduld/ Unwissen vermeiden<br />

verschiedene Repräsentationen von Daten erzeugen lassen<br />

Wiederverwendung von Code <strong>und</strong> Daten<br />

Wiederverwendung einfach machen (autom.)<br />

164 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Datenformate<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Wissen möglichst in Klartext speichern.<br />

Klartext besteht aus druckbaren Zeichen, <strong>und</strong> kann von Menschen<br />

gelesen <strong>und</strong> direkt verstanden werden.<br />

Field42=0x23<br />

besteht aus druckbaren Zeichen, ist aber nichtssagend.<br />

Besser, weil verständlich:<br />

DrawingType=UMLActivityDrawing<br />

165 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Datenformate<br />

Vorteile von Klartext:<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

portabel (Vorsicht: Zeilenende)<br />

leicht zu lesen<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

für jede Art von Werkzeug zugänglich (nicht nur für das<br />

Erzeugende)<br />

Versicherung gegen Veralten<br />

vereinfacht Tests, da Eingabedaten leicht erzeugt werden<br />

können<br />

Beispiel: XML<br />

167 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Datenformate<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

Klartext ist oft abstrakter als binäre Kodierung.<br />

window.displayFrame=FALSE<br />

vs. binär:<br />

00101010<br />

Problem der meisten Binärformate:<br />

Kontext für das Verständnis der Daten ist von den Daten isoliert.<br />

Ohne die Anwendungslogik nichtssagend.<br />

Mit Klartext kann man einen selbstbeschreibenden Datenstrom<br />

erreichen.<br />

166 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Datenformate<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Nachteile von Klartext:<br />

Dateigröße (aber: zip <strong>und</strong> co)<br />

u.U. längere Ladedauer (Parsen)<br />

Möglichst Klartext speichern.<br />

DRY-Prinzip<br />

Gründe für Wiederholungen<br />

Zusammenfassung<br />

Datenformate<br />

168 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Orthogonalität<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

169 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Orthogonalität<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

Orthogonalität ist ein entscheidendes Konzept, wenn man Systeme<br />

erstellen will, die einfach<br />

zu entwerfen<br />

zu bauen<br />

zu testen<br />

<strong>und</strong> zu erweitern sind<br />

171 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Was ist Orthogonalität?<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

Orthogonalität ist ein Begriff aus der Geometrie.<br />

2 Geraden sind orthogonal, wenn sie sich<br />

im rechten Winkel treffen<br />

als Vektoren betrachtet sind sie<br />

unabhängig voneinander<br />

In der Informatik:<br />

Unabhängigkeit<br />

Entkopplung<br />

Zwei oder mehr Dinge sind orthogonal, wenn Veränderungen an<br />

einem keines der anderen beeinflußt.<br />

170 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Was ist Orthogonalität?<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

In einem gut entworfenen System ist z.B. die Datenbankanbindung<br />

orthogonal zur Benutzeroberfläche.<br />

Man kann das eine verändern ohne das andere zu beeinflussen.<br />

172 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Orthogonalität<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

Nicht-orthogonale Systeme sind von Natur aus schwer zu<br />

verändern.<br />

Wenn die Teile eines Systems voneinander abhängig sind, ist ein<br />

lokal begrenzter Eingriff nicht möglich.<br />

Wechselwirkungen zwischen unabhängigen Dingen beseitigen.<br />

173 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Isolierte Funktion<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

1 float calcFunnyNumber(float x, float offset, int n)<br />

2 {<br />

3 float temp = 0.0;<br />

4<br />

5 for (int i = 0; i < n; i++)<br />

6 {<br />

7 temp += temp * x;<br />

8 }<br />

9<br />

10 return temp + offset;<br />

11 }<br />

strong cohesion: erfüllt einen (wohldefinierten) Zweck<br />

loose coupling: verwendet nur übergebene Parameter <strong>und</strong> lokale<br />

Variablen<br />

175 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Orthogonalität<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

Komponenten sollten in sich abgeschlossen sein:<br />

Unabhängig, <strong>und</strong> mit einem einzigen, wohldefinierten Zweck<br />

(loose coupling (lose Kopplung), strong cohesion (hoher<br />

Zusammenhang))<br />

Wenn Komponenten voneinander isoliert sind, kann man eine<br />

ändern, ohne sich um den Rest kümmern zu müssen.<br />

174 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Gesteigerte Produktivität<br />

Veränderungen sind lokal beschränkt:<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

reduziert Zeit für Entwicklung <strong>und</strong> Testen<br />

leichter, kleine abgeschlossene Komponenten zu schreiben<br />

existierender Quelltext muss kaum angepasst werden<br />

fördert Wiederverwendung:<br />

wenn Komponenten spezifische, wohldefinierte<br />

Verantwortlichkeiten haben, können sie auf verschiedenste<br />

(unvorhergesehene) Art <strong>und</strong> Weise kombiniert werden (lose<br />

Kopplung)<br />

176 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Gesteigerte Produktivität<br />

subtile Produktivitätssteigerung:<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

Zwei Komponenten mit jeweils unterschiedlichen<br />

Funktionalitäten (M, N) können MxN neue Dinge tun. Bei<br />

Nichtorthogonalität gibt es Überschneidungen, <strong>und</strong><br />

dementsprechend weniger Kombinationsmöglichkeiten.<br />

177 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Vermindertes Risiko<br />

es wird vermutlich besser getestet:<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

einfacher Tests für einzelne Komponenten zu entwerfen <strong>und</strong><br />

laufen zu lassen<br />

geringere Bindung an einen bestimmten Hersteller:<br />

Schnittstellen zu Komponenten von Dritten sind auf kleineren<br />

Teil des Quelltexts beschränkt<br />

179 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Vermindertes Risiko<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

Orthogonales Vorgehen vermindert die inhärenten Risiken jeder<br />

Software-Entwicklung.<br />

problematische Quelltextabschnitte werden isoliert:<br />

gibt es Probleme in einem Modul, ist es weniger<br />

wahrscheinlich, dass sich die Symptome auf das ganze System<br />

ausbreiten<br />

System ist robuster:<br />

Reparaturen an einer Stelle wirken sich positiv auf viele<br />

Stellen des Systems aus<br />

178 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Projektteams<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

In effizienten Teams gibt es wenig Überschneidungen, da jeder<br />

spezielle Verantwortlichkeiten hat.<br />

Veränderungen erfordern keine Besprechung des ganzen Teams, da<br />

nicht jeder betroffen ist.<br />

180 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Entwurf<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

Systeme sollten aus einer Menge kooperierender Module<br />

zusammengesetzt werden.<br />

Z.B. Unterteilung in Schichten (jede Schicht greift nur auf Schicht<br />

direkt darunter zu)<br />

181 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Testen<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

Orthogonales System einfacher zu testen. Viele Tests können auf<br />

der Ebene einzelner Module stattfinden, da Interaktionen zwischen<br />

Komponenten geordnet <strong>und</strong> begrenzt sind.<br />

Gut, da Modultests einfacher zu spezifizieren <strong>und</strong> durchzuführen<br />

sind als Integrationstests.<br />

183 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Implementierung<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Quelltext entkoppelt halten:<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

schüchternen Code schreiben (Kapselung)<br />

Globale Daten vermeiden:<br />

Zugriff auf diese Daten über ganzen Quelltext verteilt<br />

benötigter Kontext direkt an Module/Funktionen übergeben<br />

ähnliche Funktionen vermeiden:<br />

wiederholter Quelltext Symptom für strukturelle Probleme<br />

z.B. Strategie- oder Schablonenmethode-Muster verwenden<br />

182 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zusammenfassung - Orthogonalität<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

Untrennbares Wissen nicht über mehrere Systemkomponenten<br />

verteilen.<br />

Wechselwirkungen zwischen unabhängigen Dingen beseitigen<br />

(Module, Klassen, Komponenten, Schichten)<br />

globale Daten vermeiden<br />

Gesteigerte Produktivität, da Veränderungen lokal beschränkt<br />

(lose Kopplung)<br />

fördert Wiederverwendung, neue Kombinationsmöglichkeiten<br />

(Unix-Tools)<br />

184 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weiterführende Literatur<br />

Orthogonalität<br />

Gesteigerte Produktivität<br />

Vermindertes Risiko<br />

Größere Projekte<br />

Zusammenfassung<br />

Der Pragmatische Programmierer, (Andrew Hunt, David<br />

Thomas)<br />

185 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Automatisierung<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

Die Anleitung für das Starten eines Ford T war mehr als 2 Seiten<br />

lang...<br />

Fehleranfällige Prozedur<br />

nervig<br />

187 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Automatisierung<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

“Die Zivilisation schreitet dadurch fort, dass wir die Anzahl<br />

wichtiger Tätigkeiten steigern, die wir ohne Nachdenken verrichten<br />

können.” (Alfred North Whitehead)<br />

186 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

Beispiele für Automatisierung beim <strong>Programmieren</strong><br />

Build-Prozess<br />

Freigabe von Programmversionen<br />

Papierkram für Quelltext-Review<br />

100 Dateien umbenennen<br />

Möglichst viel muss automatisch geschehen!<br />

188 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Konsistenz <strong>und</strong> Wiederholbarkeit<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

Automatisierung ist wichtig um Konsistenz <strong>und</strong><br />

Wiederholbarkeit in einem Projekt gewährleisten zu können.<br />

Manuelle Vorgänge überlassen die Konsistenz dem Zufall,<br />

wodurch die Wiederholbarkeit nicht garantiert ist.<br />

Anleitungen lassen oft Raum für Interpretationen. (Anlassen<br />

von Ford T!)<br />

189 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Projekt kompilieren<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

Kompilieren des Projekts ist eine Routineaufgabe. Sollte<br />

sein.<br />

zuverlässig<br />

<strong>und</strong> wiederholbar<br />

191 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Automatik<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

Shell-Skript oder Batch-Datei führt dieselben Anweisungen aus, in<br />

derselben Reihenfolge <strong>und</strong> immer wieder.<br />

Manuelle Vorgänge vermeiden!<br />

190 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Make<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

Änderung einer Datei führt zur Neukompilierung nur der<br />

betroffenen Dateien<br />

zentrale Konfigurationsstelle für alle anfallenden Aufgaben<br />

(clean, doc, install, test, create)<br />

anfänglicher Mehraufwand, der sich auszahlt<br />

nicht nur für Quelltext<br />

192 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Aufbau von Makefiles<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

Regeln: beschreiben, wie aus einer oder mehreren Quellen ein Ziel<br />

erzeugt wird.<br />

1 Ziel: Quelle1 Quelle2 ... QuelleN<br />

2 Befehl1<br />

3 Befehl2<br />

Aufruf von make:<br />

1 make [-f Makefile] [foobar]<br />

193 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Aufbau von Makefiles<br />

Falsche Ziele:<br />

1 clean:<br />

2 rm -f *.o<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

Bei mehreren Zielen wird per default das erste ausgewählt. Wird<br />

oft ’all’ genannt, <strong>und</strong> hat als ”Abhängigkeit” das Hauptziel.<br />

1 all: foobar<br />

195 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Aufbau von Makefiles<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

1 foobar: foo.c bar.c<br />

2 gcc foo.c bar.c -o foobar<br />

Erzeugt foobar komplett neu, auch wenn nur eine c-Datei geändert<br />

wurde.<br />

Besser:<br />

1 foobar: foo.o bar.o<br />

2 gcc foo.o bar.o -o foobar<br />

3<br />

4 foo.o: foo.c<br />

5 gcc foo.c -c<br />

6<br />

7 bar.o: bar.c<br />

8 gcc bar.c -c<br />

194 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Aufbau von Makefiles<br />

Implizite Regeln:<br />

1 .cpp.o:<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

2 $(CXX) $(DBG_FLAGS) -o $@ -c $(CXXFLAGS) $<<br />

ist eine Regel, wie aus .cpp-Dateien .o-Dateien erstellt werden<br />

sollen.<br />

Automatische Variablen:<br />

$@ repräsentiert den Dateinamen des Ziels, das die<br />

Ausführung der Regel verursacht hat.<br />

$< repräsentiert den Namen der ersten Abhängigkeit<br />

196 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Quelltext generieren<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

Um Wiederholungen zu vermeiden, können Quelltext <strong>und</strong> andere<br />

Dateien aus gemeinsamen Quellen abgeleitet werden.<br />

Der Abhängigkeitsmechanismus von make kann diesen Prozess<br />

vereinfachen.<br />

1 .SUFFIXES: .java .class .xml<br />

2<br />

3 .xml.java:<br />

4 convert.pl $< > $@<br />

5<br />

6 .java.class:<br />

7 $(JAVA) $(JAVAC_FLAGS) $<<br />

make test.class sucht eine Datei ’test.xml’, erzeugt daraus per<br />

Perl-Skript eine Java-Datei <strong>und</strong> kompiliert diese.<br />

197 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Build-Prozess<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

In vielen Projekten wird diese Art Build-Prozess jede Nacht<br />

automatisch ausgeführt.<br />

Dabei werden oft komplette Tests durchgeführt. So sieht man am<br />

nächsten Morgen, ob die letzten Änderungen Fehler eingeführt<br />

haben.<br />

199 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Build-Prozess<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

Build-Prozess beginnt mit leerem Verzeichnis, <strong>und</strong> baut das<br />

Projekt von Gr<strong>und</strong> auf. Erstellt alles was am Ende abgeliefert<br />

werden muss (CD-ROM-Master, selbst entpackendes Archiv).<br />

1 Auschecken der Quelltexte aus der Versionsverwaltung<br />

2 Projekt von Gr<strong>und</strong> auf bauen (z.B. per make). Jeder Lauf des<br />

Build-Prozesses erhält Versionsnummer.<br />

3 Erstellen einer vollständigen Version, die verteilt werden kann.<br />

4 Ausführen von Testläufen.<br />

198 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Webseiten erzeugen<br />

Der Build-Prozess kann auch:<br />

Dokumentation erzeugen<br />

interne Webseiten updaten<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

Alles sollte aus Informationen aus dem Versionsverwaltungssystem<br />

erzeugt <strong>und</strong> ohne menschliche Eingriffe veröffentlicht werden.<br />

Wieder DRY-Prinzip: Informationen existieren nur in einer einzigen<br />

Form. Web-Seite ist nur eine Sicht darauf.<br />

200 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Genehmigungsprozeduren<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

In einigen Projekten müssen bestimmte Verwaltungsabläufe befolgt<br />

werden:<br />

Reviews von Quelltexten <strong>und</strong> Entwürfen einplanen <strong>und</strong><br />

durchführen<br />

Genehmigungen erteilen<br />

Papierkram kann durch Automatisierung vereinfacht werden.<br />

201 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

cron<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

Führt Aufgaben zu genau festgelegten Zeitpunkten aus.<br />

1 # MIN HOUR DAY MONTH DAYOFWEEK COMMAND<br />

2 #-----------------------------------------------<br />

3 5 0 * * * /projects/Manhattan/bin/nightly<br />

4 15 3 * * 1-5 /usr/local/bin/backup<br />

5 0 0 1 * * /home/accounting/expense_reports<br />

1 crontab crontab.txt<br />

2 crontab -e<br />

3 crontab -r<br />

203 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Genehmigungsprozeduren<br />

1 // Status: needs_review<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

Ein Skript könnte die Quelltext-Hierarchie nach solchen Dateien<br />

durchsuchen <strong>und</strong>:<br />

eine Liste dieser Dateien auf eine Webseite stellen<br />

eine email an die betroffenen Personen schicken<br />

202 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

find<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

find hilft beim Suchen von Dateien<br />

1 find . -name "*.tex"<br />

2 find /usr/local -perm -400<br />

3 find /etc -type d<br />

4 find . -type f -empty<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

204 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


grep<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

grep hilft beim Durchsuchen von Dateien<br />

1 grep "Subject:" ~/mbox-spam<br />

2 grep -v DONT_SHOW<br />

3 grep -l PATTERN *<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

205 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Bash<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Umbenennen von Dateien:<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

1 for i in ‘find . -name "*.tex"‘; do<br />

2 mv $i ;<br />

3 done<br />

Parameter Expansion<br />

1 ${parameter#word}<br />

2 ${parameter##word}<br />

3 ${parameter%word}<br />

4 ${parameter%%word}<br />

5 ${parameter/pattern/string}<br />

207 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Bash<br />

Schleifen:<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

1 for i in ‘find . -name "*.tex"‘; do<br />

2 echo $i;<br />

3 done<br />

206 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

cms.sh<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

1 if [ -f ~/mbox-spam ]; then<br />

2 grep "Subject:" ~/mbox-spam;<br />

3 fi<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

1 if [ -f ~/mbox-spam ]; then<br />

2 grep "Subject:" ~/mbox-spam | grep -v SPAM;<br />

3 fi<br />

208 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


f.sh<br />

1 #!/bin/bash<br />

2<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

3 if [ $# -eq 0 ]<br />

4 then<br />

5 echo "usage: ${0} <<br />

FILES_TO_SEARCH>"<br />

6 echo "e.g.: ${0} printf \"*.cc\""<br />

7 exit 1<br />

209 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

sameRightsForGroup.sh<br />

1 #!/bin/bash<br />

2<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

3 echo "Giving the group the same rights as the owner<br />

..."<br />

4<br />

5 for i in ‘find . -perm -400‘; do<br />

6 chmod g+r $i<br />

7 done<br />

8 for i in ‘find . -perm -200‘; do<br />

9 chmod g+w $i<br />

10 done<br />

11 for i in ‘find . -perm -100‘; do<br />

12 chmod g+x $i<br />

13 done<br />

211 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

f.sh<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

1 elif [ $# -eq 1 ]<br />

2 then<br />

3 SEARCH_PATTERN=${1}<br />

4 FILES_TO_SEARCH="*"<br />

5 else<br />

6 SEARCH_PATTERN=${1}<br />

7 FILES_TO_SEARCH=${2}<br />

8 fi<br />

9<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

10 find . -name "${FILES_TO_SEARCH}" | xargs grep "${<br />

SEARCH_PATTERN}"<br />

210 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

replace.pl<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

1 #!/usr/bin/perl -w<br />

2<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

3 if (!defined($ARGV[0]) && !defined($ARGV[1]) && !<br />

defined($ARGV[2]))<br />

4 {<br />

5 print("usage: replace.pl <<br />

fileName>\n\n");<br />

6 print(" where is the string to search<br />

for\n");<br />

7 print(" and the string to insert<br />

instead.\n");<br />

8 exit(1);<br />

9 }<br />

212 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


eplace.pl<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

1 $searchString = $ARGV[0];<br />

2 $replaceString = $ARGV[1];<br />

3 $fileName = $ARGV[2];<br />

4<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

5 $tmpFile = $fileName . "." . getpgrp(0) . ".tmp";<br />

6<br />

7 open(IN, "$fileName")<br />

8 || die "Cannot open $fileName for reading: $!";<br />

9<br />

10 open(OUT, ">$tmpFile")<br />

11 || die "Cannot open $tmpFile for writing: $!";<br />

213 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

replace.pl<br />

1 close(IN);<br />

2 close(OUT);<br />

3<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

4 unlink($fileName);<br />

5 rename($tmpFile, $fileName);<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

215 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

replace.pl<br />

1 while ()<br />

2 {<br />

3 $line = $_;<br />

4<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

5 if (/$searchString/)<br />

6 {<br />

7 $line =~ s/$searchString/$replaceString/g;<br />

8 }<br />

9<br />

10 print(OUT $line);<br />

11 }<br />

214 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Leerzeichen am Zeilenende<br />

1 #!/bin/bash<br />

2<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

3 for i in ‘find . -name "*.tex" | xargs grep -l ’ \+$<br />

’‘; do<br />

4 echo $i;<br />

5 replace.pl ’ +$’ ’’ $i;<br />

6 done<br />

216 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Wiederholungen vermeiden<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

Wenn man bemerkt, dass man eine Aufgabe wieder <strong>und</strong> wieder<br />

(umständlich) erledigt, sollte man sich überlegen, wie man sie<br />

automatisieren kann.<br />

befreit Programmierer von Routinearbeiten<br />

217 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Entropie<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Entropie ist ein Begriff aus der Physik, der das Maß der<br />

Unordnung in einem System beschreibt.<br />

Unglücklicherweise besagen die Gesetze der Thermodynamik, dass<br />

die Entropie im Universum ein Maximum anstrebt.<br />

Wenn Unordnung in Software zunimmt, sagen Programmierer:<br />

”Die Software vergammelt.”<br />

219 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Zusammenfassung<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Automatisierung<br />

Make<br />

Build-Prozess<br />

Nützliche Programme<br />

Skripte<br />

Zusammenfassung<br />

manuelle Vorgänge vermeiden<br />

Skriptsprachen (Perl, Python, Tcl, *sh, ...)<br />

PCs machen stupides gerne <strong>und</strong> besser als der Mensch<br />

Quelltext, der Quelltext erzeugt<br />

was einfach machbar ist, wird eher gemacht<br />

218 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

Manche Projekte sehen so, andere so aus:<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

220 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Verfall beginnt mit einer zerbrochenen Fensterscheibe.<br />

<strong>und</strong> wird immer schlimmer. Man fühlt sich immer unwohler <strong>und</strong><br />

irgendwann besteht kein Interesse mehr an einer ”Renovierung”.<br />

Deshalb:<br />

Zerbrochene Fensterscheiben nicht akzeptieren. (Wehret den<br />

Anfängen)<br />

221 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Schlechten Quelltext nicht stehen lassen, sondern sofort reparieren<br />

sobald er entdeckt wird.<br />

Sonst kann es zu folgender Einstellung kommen:<br />

”Der Rest des Quelltexts ist schon Schrott. Ich mache es einfach<br />

genauso.”<br />

In einem Projekt mit sauber geschriebenem Code wird man mehr<br />

Sorgfalt walten lassen. Keiner will der Erste sein, der Schaden<br />

anrichtet.<br />

223 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Ein Versuch in New York begann mit einem intakten Auto <strong>und</strong><br />

endete so:<br />

222 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

Bei Zeitmangel<br />

Meldung ausgeben<br />

Quellcode kommentieren<br />

1 // FIXME: this does not work<br />

2 // XXX: nonsense<br />

3 // TODO: make it work<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

224 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Zusammenfassung<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Software vergammelt<br />

Fehler beheben, wenn man darauf stößt<br />

kein “das verbessere ich später”<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

chaotisch aussehender Code, sieht oft nicht nur so aus<br />

225 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Zufall beim Testen<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Es ist einfach anzunehmen, dass X unweigerlich zu Y führt.<br />

Nicht annehmen, sondern beweisen.<br />

Nicht mit dem Zufall programmieren/testen.<br />

227 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

<strong>Programmieren</strong> mit dem Zufall<br />

1 paint(g);<br />

2 invalidate();<br />

3 validate();<br />

4 revalidate();<br />

5 repaint();<br />

6 paintImmediately(r);<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Verzweiflung?<br />

Irgendwie scheint es zu funktionieren. Aber warum?<br />

226 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Überlegt <strong>Programmieren</strong><br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Ziel: Quelltext mit weniger Aufwand produzieren <strong>und</strong> Fehler so<br />

früh wie möglich erkennen <strong>und</strong> beseitigen.<br />

Sich immer bewusst sein, was man tut.<br />

Nicht mit verb<strong>und</strong>enen Augen programmieren.<br />

Programm verstehen<br />

Technologie verstehen<br />

Einem Plan folgen (d.h. vorher überlegen)<br />

228 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Überlegt <strong>Programmieren</strong><br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Nur auf Verlässliche Dinge verlassen. Keine Zufälle oder<br />

Annahmen.<br />

Annahmen dokumentieren<br />

Nicht nur Quelltext testen, sondern auch Annahmen. Nicht<br />

raten, sondern ausprobieren.<br />

229 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Zusammenfassung<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

“Es funktioniert doch, jetzt bloß nichts anfassen...” (Anonymer<br />

Programmierer)<br />

Bedenklich. Höchstwahrscheinlich versteht man das System nicht.<br />

(Sonst wüsste man, was man wie ändern kann.)<br />

nie mit dem Zufall programmieren<br />

immer verstehen was man tut<br />

nur auf verlässliches verlassen<br />

zur Not unverständlichen Quelltext ersetzen (refaktorisieren)<br />

231 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

<strong>Programmieren</strong> mit dem Zufall<br />

”Never change a running system”?<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Vielleicht funktioniert es ja gar nicht, sondern sieht nur so aus.<br />

Zufälliger Grenzfall<br />

Undokumentiertes Verhalten könnte sich in der nächsten<br />

Version der Bibliothek ändern.<br />

Zusätzliche, unnötige Aufrufe machen das Programm<br />

langsamer.<br />

Zusätzliche Aufrufe erhöhen das Risiko, zusätzliche Fehler<br />

einzubauen.<br />

Nur auf dokumentiertes Verhalten verlassen.<br />

230 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Refaktorisieren<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Hausbau ist eine übliche Metapher für Software-Entwicklung<br />

Architekt zeichnet Plan<br />

F<strong>und</strong>ament ausgraben, Geschosse bauen, Elektrik,<br />

Wasserversorgung, Innenausbau<br />

Mieter ziehen ein, <strong>und</strong> rufen bei Problemen den Hausmeister<br />

Software-Entwicklung funktioniert jedoch anders!<br />

232 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Refaktorisieren<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zutreffender ist Gartenpflege<br />

nach anfänglichem Plan, <strong>und</strong> unter<br />

Beachtung der Umgebungsbedingungen<br />

werden verschiedene Sachen im Garten<br />

angepflanzt<br />

einige gedeihen, andere nicht<br />

Pflanzen werden umgepflanzt<br />

Unkraut gejähtet; Pflanzen gedüngt<br />

Man beobachtet <strong>und</strong> greift bei Bedarf ein.<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

233 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Wie refaktorisiert man?<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Refaktorisieren ist eine Tätigkeit, die langsam, überlegt <strong>und</strong><br />

sorgfältig ausgeführt werden muss.<br />

Nicht gleichzeitig refaktorisieren <strong>und</strong> neue Funktionalität<br />

implementieren.<br />

Test-Code schreiben, <strong>und</strong> vor <strong>und</strong> nach der Änderung laufen<br />

lassen. ( Änderungen können neue Fehler hervorrufen.)<br />

Bei jedem Schritt nur kleine Änderungen vornehmen.<br />

Früh <strong>und</strong> häufig refaktorisieren.<br />

235 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Refaktorisieren - Definition<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Quelltext ist nichts statisches. Er muss sich weiterentwickeln.<br />

Quelltext neu zu schreiben, zu überarbeiten <strong>und</strong> neu zu entwerfen,<br />

ist allgemein als Refaktorisieren bekannt.<br />

Dabei wird normalerweise die Funktionalität nicht verändert.<br />

234 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Einfaches Erweitern<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Wenn man ein Programm um ein Feature erweitern möchte <strong>und</strong><br />

dies nicht einfach möglich ist, dann sollte man erst den Code<br />

ändern, so dass es einfach möglich ist. Erst dann sollte man das<br />

neue Feature einbauen.<br />

236 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehen<br />

Kleine Schritte:<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Vertrauen in Code wächst<br />

Weniger Stress<br />

Werkzeug-unterstütztes Refaktorisieren:<br />

Smalltalk-Refactoring-Browser<br />

Eclipse<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

237 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

”Schlechte Gerüche”<br />

Quelltext stinkt wenn<br />

Code dupliziert wird<br />

<strong>Methoden</strong> zu lang sind<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Klassen zu groß sind (zu viele Variablen)<br />

ein neues Feature viele Änderungen nötig macht<br />

Code unnötig generell ist<br />

(zu viele) Kommentare nötig sind<br />

...<br />

239 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Wann Refaktorisieren?<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Eine Vielzahl von Anzeichen qualifiziert Quelltext für das<br />

Refaktorisieren:<br />

Wiederholung. Verletzung des DRY-Prinzips.<br />

Nicht-orthogonaler Entwurf.<br />

Veraltetes Wissen. Dinge ändern sich, Anforderungen<br />

ebenso, eigenes Wissen wächst.<br />

Performance. Programm zu langsam.<br />

Früh <strong>und</strong> häufig refaktorisieren.<br />

238 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Katalog<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Wie bei Entwurfsmustern gibt es auch für Refaktorisierungen<br />

Kataloge von bewährten Code Transformationen.<br />

Aufbau:<br />

Name (Vokabular)<br />

Zusammenfassung<br />

der Situation in der sie benötigt wird<br />

dessen, was sie tut<br />

Motivation (wann anwenden <strong>und</strong> wann nicht)<br />

Mechanismus (knappe, Schritt für Schritt Anleitung)<br />

Beispiel<br />

Oft paarweises Vorkommen, für beide Richtungen.<br />

240 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

<strong>Methoden</strong> entwerfen - Methode extrahieren<br />

Ein Code-Fragment kann gruppiert werden.<br />

Das Fragment in eine eigene Methode auslagern. Der Name der<br />

Methode erklärt ihren Zweck.<br />

1 void printOwing(double amount) {<br />

2 printBanner();<br />

3<br />

4 // print details<br />

5 System.out.println("name: " + _name);<br />

6 System.out.println("amount " + amount);<br />

7 }<br />

241 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

<strong>Methoden</strong> entwerfen - Methode ”inlinen”<br />

Der Funktionsrumpf ist genauso klar wie ihr Name.<br />

Den Rumpf der Funktion an allen sie aufrufenden Stellen einsetzen.<br />

1 int getRating() {<br />

2 return moreThanFiveLateDeliveries() ? 2 : 1;<br />

3 }<br />

4 boolean moreThanFiveLateDeliveries() {<br />

5 return _numberOfDeliveries > 5;<br />

6 }<br />

1 int getRating() {<br />

2 return (_numberOfDeliveries > 5) ? 2 : 1;<br />

3 }<br />

243 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

<strong>Methoden</strong> entwerfen - Methode extrahieren<br />

1 void printOwing(double amount) {<br />

2 printBanner();<br />

3 printDetails(amount);<br />

4 }<br />

5<br />

6 printDetails(double amount) {<br />

7 System.out.println("name: " + _name);<br />

8 System.out.println("amount " + amount);<br />

9 }<br />

242 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

<strong>Methoden</strong> entwerfen - Temporäre Variable ”inlinen”<br />

Einer temporären Variable wird nur einmal ein Wert zugewiesen,<br />

<strong>und</strong> sie wird selten verwendet.<br />

Alle Referenzen auf die Variable durch den Ausdruck ersetzen.<br />

1 double basePrice = anOrder.basePrice();<br />

2<br />

3 return (basePrice > 1000);<br />

1 return (anOrder.basePrice() > 1000);<br />

244 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

<strong>Methoden</strong> entwerfen - Erklärende Variable einführen<br />

Man hat einen komplizierten Ausdruck.<br />

Das Ergebnis des Ausdrucks (oder Teile davon) in einer<br />

temporären Variable speichern.<br />

1 if ((platform.toUpperCase().indexOf("MAC") > -1) &&<br />

2 (browser.toUpperCase().indexOf("IE") > -1) &&<br />

3 wasInitialized() && resize > 0) {<br />

4 // do something<br />

5 }<br />

245 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

<strong>Methoden</strong> entwerfen - Temporäre Variable aufteilen<br />

Man hat eine temporäre Variable, der verschiedene Werte<br />

zugewiesen werden.<br />

Separate Variablen für jede Zuweisung einführen.<br />

1 double temp = 2 * (_height + _width);<br />

2 System.out.println(temp);<br />

3<br />

4 temp = _height * _width;<br />

5 System.out.println(temp);<br />

247 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

<strong>Methoden</strong> entwerfen - Erklärende Variable einführen<br />

1 final boolean isMacOS = platform.toUpperCase().<br />

indexOf("MAC") > -1;<br />

2 final boolean isIEBrowser = browser.toUpperCase().<br />

indexOf("IE") > -1;<br />

3 final boolean wasResized = resize > 0;<br />

4<br />

5 if (isMacOS && isIEBrowser && wasInitialized() &&<br />

wasResized) {<br />

6 // do something<br />

7 }<br />

246 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

<strong>Methoden</strong> entwerfen - Temporäre Variable aufteilen<br />

1 final double perimeter = 2 * (_height + _width);<br />

2 System.out.println(perimeter);<br />

3<br />

4 final double area = _height * _width;<br />

5 System.out.println(area);<br />

248 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

<strong>Methoden</strong> entwerfen - Zuweisungen zu Parametern<br />

entfernen<br />

Der Code weist einem Parameter Werte zu.<br />

Temporäre Variable verwenden.<br />

1 int discount(int inputVal, int quantity, int<br />

yearToDate) {<br />

2 if (inputVal > 50) inputVal -= 2;<br />

1 int discount(int inputVal, int quantity, int<br />

yearToDate) {<br />

2 int result = inputVal;<br />

3 if (inputVal > 50) result -= 2;<br />

249 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Daten organisieren - Feld kapseln<br />

1 private int _low, _high;<br />

2<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

3 boolean includes(int arg) {<br />

4 return arg >= getLow() && arg = _low && arg


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Daten organisieren - Ersetze magische Zahl durch<br />

symbolische Konstante<br />

Man hat eine Zahl mit einer bestimmten Bedeutung.<br />

Konstante erzeugen, <strong>und</strong> nach der Bedeutung der Zahl benennen.<br />

1 double potentialEnergy(double mass, double height) {<br />

2 return mass * 9.81 * height;<br />

3 }<br />

1 double potentialEnergy(double mass, double height) {<br />

2 return mass * GRAVITATIONAL_CONSTANT * height;<br />

3 }<br />

4 static final double GRAVITATIONAL_CONSTANT = 9.81;<br />

253 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Konditionalausdrücke vereinfachen - Schachtelungen durch<br />

”Wächter” ersetzen<br />

1 double getPayAmount() {<br />

2 if (_isDead) return deadAmount();<br />

3 if (_isSeparated) return separatedAmount();<br />

4 if (_isRetired) return retiredAmount();<br />

5<br />

6 return normalPayAmount();<br />

7 }<br />

255 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Konditionalausdrücke vereinfachen - Schachtelungen durch<br />

”Wächter” ersetzen<br />

Der normale Ausführungspfad durch eine Funktion ist nicht klar.<br />

”Wächter” für die Spezialfälle verwenden.<br />

1 double getPayAmount() {<br />

2 double result;<br />

3 if (_isDead) result = deadAmount();<br />

4 else {<br />

5 if (_isSeparated) result = separatedAmount();<br />

6 else {<br />

7 if (_isRetired) result = retiredAmount();<br />

8 else result = normalPayAmount();<br />

9 }<br />

10 }<br />

11 return result;<br />

12 }<br />

254 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

<strong>Methoden</strong>aufrufe vereinfachen - Methode umbenennen<br />

Der Name einer Methode macht ihren Zweck nicht klar.<br />

Den Namen ändern.<br />

1 getinvcdtlmt()<br />

1 getInvoiceCreditLimit()<br />

256 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

<strong>Methoden</strong>aufrufe vereinfachen - Trenne Abfrager von<br />

Modifizierer<br />

Eine Methode gibt einen Wert zurück, <strong>und</strong> ändert zusätzlich den<br />

Zustand des Objekts.<br />

Erzeuge zwei <strong>Methoden</strong>. Eine für die Abfrage, <strong>und</strong> eine für die<br />

Modifikation.<br />

1 getTotalOutstandingAndSetReadyForSummaries()<br />

1 getTotalOutstanding()<br />

2 setReadyForSummaries()<br />

257 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

<strong>Methoden</strong>aufrufe vereinfachen - Parameterobjekt einführen<br />

Eine Gruppe von Parametern passt zusammen.<br />

Ersetze sie durch ein Objekt.<br />

1 setDate(int day, int month, int year)<br />

1 setDate(Date today)<br />

259 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

<strong>Methoden</strong>aufrufe vereinfachen - Methode parametrisieren<br />

Mehrere <strong>Methoden</strong> machen etwas ähnliches, aber mit<br />

unterschiedlichen Werten.<br />

Eine Methode erzeugen, die den Wert als Parameter erhält.<br />

1 fivePercentRaise()<br />

2 tenPercentRaise()<br />

1 raise(percentage)<br />

258 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Generalisierung - Feld hochziehen<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Zwei Subklassen haben die gleiche Variable.<br />

Bewege die Variable in der Klassenhierarchie nach oben.<br />

1 class Employee { };<br />

2<br />

3 class Salesman extends Employee {<br />

4 String name;<br />

5 };<br />

6<br />

7 class Engineer extends Employee {<br />

8 String name;<br />

9 };<br />

260 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Generalisierung - Feld hochziehen<br />

1 class Employee {<br />

2 String name<br />

3 };<br />

4<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

5 class Salesman extends Employee { };<br />

6<br />

7 class Engineer extends Employee { };<br />

261 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weiterführende Literatur<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

Refactoring - Improving the design of existing code, Martin<br />

Fowler<br />

263 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Zusammenfassung<br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Aufräumen von Code<br />

Zerbrochene Fensterscheiben<br />

<strong>Programmieren</strong> mit dem Zufall<br />

Refaktorisieren<br />

Beispiele<br />

Zusammenfassung<br />

überarbeiten <strong>und</strong> dadurch interne Struktur verbessern<br />

ändert nichts am nach außen sichtbaren Verhalten<br />

investierte Zeit lohnt sich, sonst später Chaos<br />

kleine Änderungen, dann testen<br />

262 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

264 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

265 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

267 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

266 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

268 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

269 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

271 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

270 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

272 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

273 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

275 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

274 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

276 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

Rentierschlittenkufenwachsdosen-<br />

deckelbeschriftungsfarbenrotanteil<br />

277 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

279 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

Also, dass war dann so, dass<br />

ich dort jemanden getroffen hatte,<br />

der meinte, dass ich unbedingt <strong>und</strong> ganz,<br />

ganz dringend - es würde wirklich nicht anders<br />

gehen <strong>und</strong> es wäre schon wichtig, dass ich das tun würde, weil<br />

nämlich sonst etwas passieren könnte (oder würde ich einfach nur<br />

etwas verpassen? Naja, wie auch immer ist ja eigentlich auch egal), also<br />

was ich sagen wollte, war ... ja, was war das noch gleich, ah ja - auch das liegt<br />

durchaus im Bereich des möglichen - was tun sollte, das ich jetzt vergessen habe ...<br />

278 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

280 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

Ein Rückblick auf seine Reise zeigte dem Nikolaus auf, wie viel er<br />

unterwegs gelernt hatte:<br />

Kombination der Farben Rot <strong>und</strong> Blau zu<br />

vermeiden (Türkei)<br />

gängige Datenformate einzuhalten (Griechenland)<br />

Rot als Signalfarbe zu verwenden (Rumänien)<br />

auf gut erkennbare Kontraste zu achten (Ungarn)<br />

das Gesetz der Nähe ( Österreich)<br />

einfach <strong>und</strong> verständlich Hilfe zu leisten (Italien)<br />

281 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weiterführende Literatur<br />

Software-Ergonomie - ausführliche Einführung in die<br />

Software-Ergonomie mit Hintergr<strong>und</strong>-Erläuterungen<br />

283 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorgehensmodelle<br />

Konsistenz / Style Guides<br />

DRY-Prinzip / Wiederverwendung<br />

Orthogonalität<br />

Automatisierung<br />

Refaktorisieren<br />

Software-Ergonomie<br />

Weshalb der Nikolaus im Norden lebt<br />

das Gesetz der Isolation (Frankreich)<br />

Undo-Funktionen vorzusehen (Spanien)<br />

das Gesetz der Gleichheit (Frankreich)<br />

lange Antwortzeiten zu vermeiden oder überspielen<br />

(Schweiz)<br />

nicht mehr als sieben Informationseinheiten<br />

gleichzeitig zu verwenden (Deutschland)<br />

komplexe Fragestellungen mit Graphik zu<br />

verdeutlichen (Dänemark)<br />

keine starken Helligkeitskontraste zu verwenden<br />

(Norwegen)<br />

282 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Teil 2 - <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

8 Programmiersprachen<br />

9 Editoren<br />

10 Versionskontrolle<br />

11 Quellcode erzeugen / anpassen<br />

12 Fehlersuche<br />

13 Dokumentationserstellung<br />

14 Test<br />

284 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Programmiersprachen<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

285 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Klassifizierung nach Generationen - Maschinensprachen<br />

System von Instruktionen <strong>und</strong> Daten, die der Prozessor direkt<br />

ausführen kann<br />

Binärcode<br />

287 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung nach Generationen<br />

1 Maschinensprachen<br />

2 Assemblersprachen<br />

3 Höhere Programmiersprachen<br />

4 4GL-Sprachen<br />

5 Very High Level Languages<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

286 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Klassifizierung nach Generationen - Assemblersprachen<br />

Repräsentation der Maschinensprache einer spezifischen<br />

Prozessorarchitektur in einer für Menschen lesbaren Form<br />

Ausnutzung der kompletten Bandbreite des Computers<br />

direkte Programmierung von Hardwarechips<br />

in der Regel kleiner <strong>und</strong> schneller als Programme mit<br />

ähnlichem Komplexitätsgrad <strong>und</strong> Hochsprache als Basis<br />

höhere Fehleranfälligkeit<br />

extrem großer Programmieraufwand<br />

Portieren auf andere Hardware nicht möglich<br />

288 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Klassifizierung nach Generationen - Höhere<br />

Programmiersprachen<br />

Third generation language (3GL)<br />

Einführung von standardisierten Kontrollstrukturen<br />

genaue Beschreibung, wie ein Problem gelöst werden soll<br />

Aufgabenstellung schwierig aus Quellcode zu erkennen<br />

289 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Klassifizierung nach Generationen - Very High Level<br />

Languages<br />

Beschreiben von Sachverhalten <strong>und</strong> Problemen<br />

vor allem im Bereich der künstlichen Intelligenz<br />

291 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Klassifizierung nach Generationen - 4GL-Sprachen<br />

Fourth generation language<br />

anwendungsorientiert<br />

vorgefertigte Bausteine<br />

Beschreibung, was der Rechner tun soll<br />

Programme in der Regel gut lesbar<br />

290 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung nach Paradigma<br />

1 imperativ / prozedural<br />

2 funktional / applikativ<br />

3 logisch / prädikativ<br />

4 objektbasiert<br />

5 objektorientiert<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

292 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Klassifizierung nach Paradigma - imperativ / prozedural<br />

Programm als Folge von Befehlen, die der Rechner in einer<br />

definierten Reihenfolge abarbeitet.<br />

Funktionen <strong>und</strong> Prozeduren dienen der Kapselung <strong>und</strong><br />

Wiederverwendung von Funktionalität.<br />

Beispiele: Ada83, BASIC, C, COBOL, FORTRAN<br />

293 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Klassifizierung nach Paradigma - logisch / prädikativ<br />

Programm besteht aus einer Menge von Fakten <strong>und</strong> Regeln.<br />

Beispiel: PROLOG<br />

295 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Klassifizierung nach Paradigma - funktional / applikativ<br />

Berechnung von Funktionen, die Eingabewerte auf Ausgabewerte<br />

abbilden.<br />

Beispiel: LISP<br />

294 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Klassifizierung nach Paradigma - objektbasiert<br />

Objekte werden unterstützt, weiterführende Konzepte, wie Klassen<br />

<strong>und</strong> deren Beziehungen fehlen.<br />

Beispiel: JavaScript<br />

296 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Klassifizierung nach Paradigma - objektorientiert<br />

Alle zur Lösung eines Problems notwendigen Informationen<br />

(Daten, Anweisungen, Regeln) werden als Objekte aufgefasst.<br />

Beispiel: Ada95, C++, Java, Smalltalk<br />

297 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

C<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

C-Compiler für nahezu jede Prozessorarchitektur vorhanden<br />

fast alle Kernel der bekannten Betriebssysteme in C<br />

implementiert<br />

portabel <strong>und</strong> sowohl assemblernahe als auch abstrakte<br />

Programmierung möglich<br />

niedriger Abstraktionsgrad<br />

lückenhafte Sprachdefinition (Verhalten z. T. <strong>und</strong>efiniert)<br />

keine boolescher Datentyp, kein Datentyp für Zeichenketten<br />

keine Speicherverwaltung<br />

299 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

C<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Ken Thompson <strong>und</strong> Dennis Ritchie, frühe 1970er Jahre<br />

Weiterentwicklung von B (Bell Laboratories)<br />

prozedurale Programmiersprache<br />

Compiler<br />

gut geeignet für Systemprogrammierung<br />

Zeigerarithmetik zur effizienten Behandlung von Feldzugriffen,<br />

Parametern, ...<br />

Hardwarenahe Programmierung möglich, direkter<br />

Speicherzugriff <strong>und</strong> Zeigerarithmetik<br />

298 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

C++<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Bjarne Stroustrup (AT&T), ab 1979<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Weiterentwicklung (“Inkrement”) von C<br />

Multiparadigmen-Sprache (Hybridsprache), unterstützt:<br />

prozedurale Programmierung<br />

modulare Programmierung<br />

strukturierte Programmierung<br />

Programmierung mit selbstdefinierten Datentypen<br />

objektorientierte Programmierung<br />

generische Programmierung<br />

Compiler<br />

300 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


C++<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Erzeugung hocheffizienten Codes möglich<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

sowohl maschinennahe als auch hochabstrakte<br />

Programmierung<br />

sehr hohe Ausdrucksstärke <strong>und</strong> Flexibilität<br />

für große Projekte geeignet<br />

nicht im Besitz einer Firma; Standardisierung durch die ISO<br />

historischer Ballast wg. Kompatibilität mit C<br />

aktuelle C++-Standardbibliothek deckt einige neue<br />

Erfordernisse noch nicht ausreichend ab (z.B.: Threads,<br />

TCP/IP, Dateisystem-Verzeichnisse)<br />

301 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Java<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

aus Smalltalk übernommen:<br />

Objektbaum, in den alle Objekte<br />

eingehängt werden <strong>und</strong> von einem<br />

einzigen Mutterobjekt abstammen<br />

automatische Speicherbereinigung<br />

virtuelle Maschine<br />

Syntax an C++ angelehnt<br />

Konstrukte aus C++, die Java nicht<br />

bietet:<br />

Mehrfachvererbung<br />

fehleranfällige Zeigerarithmetik<br />

Überladen von Operatoren<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

303 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Java<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Patrick Naughton, Mike Sheridan,<br />

James Gosling, Bill Joy, ... (Sun<br />

Microsystems), 1991/1992 (Urversion,<br />

“The Green Project”)<br />

von den Entwicklern bevorzugte<br />

Kaffee-Sorte<br />

objektorientierte Programmiersprache<br />

Interpreter <strong>und</strong> Compiler<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

302 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Ada<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Jean Ichbiah (Honeywell Bull), 1970er<br />

Lady Ada Lovelace (1815-1852)<br />

imperative / prozedurale<br />

Programmiersprache<br />

Ada 95 unterstützt auch<br />

objektorientierte Programmierung <strong>und</strong><br />

dynamische Polymorphie<br />

Compiler<br />

erste standardisierte Hochsprache<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

304 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Ada<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

eingebettete <strong>und</strong> Echtzeit-Systeme<br />

strenges Typsystem (starke<br />

Typisierung)<br />

zahlreiche Prüfungen zur<br />

Programmlaufzeit<br />

parallele Verarbeitung<br />

Ausnahmebehandlung<br />

generische Systeme<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

305 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

COBOL<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

1960 als COBOL-60 von CODASYL verabschiedet<br />

Common Business Oriented Language<br />

imperative / prozedurale Programmiersprache<br />

Compiler<br />

betriebswirtschaftlicher Bereich:<br />

Handhabung großer Datenmengen<br />

Ein- <strong>und</strong> Ausgabe großer Datenmengen<br />

wortreich, stark an natürliche Sprache angelehnt<br />

strikte Trennung von Datendeklaration <strong>und</strong> prozeduralen<br />

Anweisungen<br />

307 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

FORTRAN<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

John W. Backus, ... (IBM), ab 1954<br />

FORmula TRANslation<br />

prozedurale, inzw. auch objektorientierte Programmiersprache<br />

Compiler<br />

numerische Berechnungen<br />

früher Fortran-Stil: Goto-Anweisungen<br />

seit FORTRAN 77 strukturierte Programmierung<br />

ab Fortran 90:<br />

Freigabe des aus der Lochkartenzeit stammenden Zeilenformats<br />

optionale Parameter<br />

Identifikation von Prozedurparametern über Namen, nicht nur<br />

über Position in Parameterliste<br />

306 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

COBOL<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Gliederung in vier Teile (DIVISION) mit einer festgelegten<br />

Reihenfolge:<br />

1 Identification Division: Programmname <strong>und</strong> Paragraphen für<br />

Kommentare<br />

2 Environment Division: Definition von Schnittstellen zum<br />

Betriebs- <strong>und</strong> Dateisystem<br />

3 Data Division: Definition der Programmvariablen <strong>und</strong><br />

Datenstrukturen<br />

4 Procedure Division: prozedurale Anweisungen<br />

<strong>und</strong> in Kapitel (SECTION) <strong>und</strong> Abschnitte (PARAGRAPH)<br />

traditionelles Kodierschema bei Cobol entspricht Lochkarte<br />

mit 80 Spalten<br />

308 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


BASIC<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

John George Kemeny <strong>und</strong> Thomas Eugene Kurtz (Dartmouth<br />

College), 1964<br />

Beginner’s All-purpose Symbolic Instruction Code<br />

imperative Programmiersprache<br />

Interpreter<br />

entwickelt, um Studenten den Einstieg in die Programmierung<br />

mit Algol <strong>und</strong> Fortran zu erleichtern<br />

309 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Perl<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Larry Wall, 1987<br />

Zitat aus dem Matthäus-Evangelium<br />

Hybridsprache<br />

Interpreter<br />

Werkzeug zur System- <strong>und</strong> Netzwerkadministration<br />

Entwicklung von Webanwendungen<br />

Bioinformatik<br />

Kombination von C mit <strong>Werkzeuge</strong>n wie sed, awk, grep <strong>und</strong><br />

sort <strong>und</strong> Eigenschaften der Bourne Shell<br />

schnelle Problemlösung <strong>und</strong> größtmögliche Freiheit für<br />

Programmierer<br />

Stärken: Umgang mit Texten <strong>und</strong> viele frei verfügbare Module<br />

311 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

BASIC<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Entwurfsprinzipien:<br />

für Anfänger einfach zu erlernen<br />

universell einsetzbar<br />

Erweiterbarkeit der Sprache für Experten<br />

Interaktivität<br />

klare Fehlermeldungen<br />

rasche Antwortzeiten<br />

Hardwareunabhängigkeit<br />

Betriebssystemunabhängigkeit<br />

Plattformunabhängigkeit nicht erreicht<br />

h<strong>und</strong>erte inkompatibler Dialekte, deren Gemeinsamkeiten sich<br />

auf Datenverarbeitung beschränken<br />

310 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

PHP<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Rasmus Lerdorf, 1995<br />

Personal Home Page Tools<br />

Hybridsprache<br />

Interpreter<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Erstellung von Webseiten oder Webanwendungen<br />

Open-Source-Software<br />

312 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Python<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Guido van Rossum (Centrum voor<br />

Wisk<strong>und</strong>e en Informatica,<br />

Amsterdam), 1990er Jahre<br />

benannt nach Monty Python<br />

objektorientierte, aspektorientierte <strong>und</strong><br />

funktionale Programmiersprache<br />

(Hybridsprache)<br />

Interpreter<br />

Übersichtlichkeit <strong>und</strong> Lesbarkeit des<br />

Codes (z.B.: Teamarbeit,<br />

Programmieranfänger)<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

313 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Ruby<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Yukihiro “Matz” Matsumoto, 1993 -<br />

1995<br />

Edelstein Rubin<br />

Hybridsprache, unterstützt:<br />

objektorientierte Programmierung<br />

prozedurale Programmierung<br />

funktionale Programmierung<br />

Nebenläufigkeit<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

315 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Python<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

einfach <strong>und</strong> übersichtlich<br />

(Entwurfsziel):<br />

mächtiger Funktionsumfang in nur<br />

wenigen Schlüsselwörtern<br />

grammatische Syntax reduziert <strong>und</strong><br />

auf Übersichtlichkeit optimiert<br />

Möglichkeit, auch Programme anderer<br />

Sprachen als Modul einzubetten<br />

maschinennahe Programmierung<br />

schnellerer Routinen<br />

Skriptsprache anderer Programme<br />

(z.B.: OpenOffice.org, Blender,<br />

PyMOL <strong>und</strong> Gimp)<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

314 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Ruby<br />

Interpreter<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

vollständig objektorientiert<br />

Principle Of Least Surprise<br />

Duck Typing: “When I see a bird that<br />

walks like a duck and swims like a<br />

duck and quacks like a duck, I call<br />

that bird a duck.” (James Whitcomb<br />

Riley)<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

316 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Lisp<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Massachusetts Institute of Technology (MIT), 1995<br />

List Processing<br />

objektorientierte, funktionale, prozedurale<br />

Programmiersprache<br />

Interpreter <strong>und</strong> Compiler<br />

ursprünglich FORTRAN-Unterprogramme, für symbolische<br />

Berechnungen bzgl. des Lambda-Kalküls<br />

historisch: Programmiersprache der künstlichen Intelligenz<br />

“programmierbare Programmiersprache”: große Flexibilität<br />

<strong>und</strong> weit reichende Einflussmöglichkeiten des Programmierers<br />

LISP = “Lots of Irritating Superfluous Parentheses”<br />

317 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Smalltalk<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Alan Kay, Dan Ingalls, Adele Goldberg (Xerox PARC<br />

Forschungszentrum), 1970er Jahre<br />

objektorientierte Programmiersprache<br />

Interpreter<br />

entwickelt für Unterrichtszwecke<br />

Expertensysteme (Anfang <strong>und</strong> Mitte der 1990er Jahre)<br />

Dynamische Typisierung<br />

keine Mehrfachvererbung<br />

Automatische Speicherbereinigung<br />

von Lisp <strong>und</strong> Simula beeinflusst<br />

Einfluss auf Entwicklung späterer Programmiersprachen (z.B.:<br />

Java, Ruby)<br />

319 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

PROLOG<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Alain Colmerauer, Anfang der 1970er Jahre<br />

Programming in Logic<br />

logische Programmiersprache<br />

Interpreter <strong>und</strong> Compiler<br />

beruht auf mathematischen Gr<strong>und</strong>lagen der Prädikatenlogik<br />

Sammlung von Horn-Klauseln<br />

Datenbasis, die Fakten <strong>und</strong> Regeln umfasst<br />

Anwendungsgebiete:<br />

1980er Jahre: Bau von Expertensystemen<br />

heute: Computerlinguistik, Künstliche Intelligenz<br />

318 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Interpreter vs. Compiler<br />

Interpreter:<br />

schnellere Entwicklungszyklen<br />

einfachere Testbarkeit<br />

höhere Flexibilität<br />

Compiler:<br />

Ausführungsgeschwindigkeit<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

320 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Weiterführende Literatur<br />

Klassifizierung von Programmiersprachen<br />

Programmiersprachen<br />

Taschenbuch Programmiersprachen - Überblick mit<br />

Beispielen, Bibliographie, ...<br />

321 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Editor<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

<strong>Werkzeuge</strong> sollen zur Verlängerung der Hände werden.<br />

Text muss mühelos bearbeitbar sein, da er das elementare<br />

Rohmaterial für’s <strong>Programmieren</strong> ist<br />

Konzentration auf einen Editor, <strong>und</strong> diesen beherrschen<br />

(Tastaturkürzel)<br />

Editor für Quelltext, Dokumentation <strong>und</strong> sonstige Daten<br />

verwenden<br />

323 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Handwerkszeug<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Ein Schreiner bearbeitet das Rohmaterial Holz.<br />

Ein Programmierer bearbeitet Text.<br />

322 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Editor<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Beim Verwenden mehrerer Programme darauf achten, dass<br />

(möglichst viele) Tastaturkürzel gleich sind<br />

Tastaturkürzel müssen zum Reflex werden<br />

idealerweise einen Editor wählen, der auf mehreren<br />

Plattformen verfügbar ist<br />

324 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Editor-Funktionen<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Elementare Fähigkeiten, die ein Editor mitbringen sollte:<br />

Konfigurierbarkeit<br />

Erweiterbarkeit<br />

Programmierbarkeit<br />

325 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Erweiterbarkeit<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Plugins bieten die Möglichkeit, den Editor um neue Funktionen zu<br />

erweitern.<br />

Editor sollte nicht veralten, wenn neue Programmiersprache<br />

oder neues Datenformat erscheint (z.B. Syntax-Highlighting)<br />

jede mögliche Compiler-Umgebung sollte integriert werden<br />

können (Aufruf der spezifischen Tools)<br />

327 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Konfigurierbarkeit<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Alle Aspekte sollten auf die eigenen Vorlieben hin konfigurierbar<br />

sein:<br />

Schriftart<br />

Farben (Syntax-Highlighting)<br />

Fenstergrößen<br />

Tastenbelegungen (alle Bearbeitungsoperationen sollten per<br />

Tastaturkürzel nutzbar sein) (”unsichtbares” kann mit<br />

Tastaturkürzeln erledigt werden)<br />

326 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmierbarkeit<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Editor sollte für komplizierte, mehrstufige Aufgaben<br />

programmierbar sein.<br />

Makros<br />

eingebaute Skriptsprache (z.B. Emacs-Lisp)<br />

328 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Produktivität<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Cursor-Bewegungen:<br />

Tastenkürzel, die den Cursor in Einheiten von Wörtern, Zeilen,<br />

Blocks oder Funktionen bewegen sind effizienter als wiederholt eine<br />

Taste zu drücken.<br />

Neue Datei:<br />

Editor kann abhängig vom Typ eine Vorlage liefern<br />

Namen der Klasse oder des Moduls<br />

Namen <strong>und</strong> Urheberrechtsangaben<br />

Gerüst für Deklarationen (z.B. Konstruktor, Destruktor)<br />

329 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Programmiersprachen-spezifische Funktionen<br />

Syntax-Hervorhebung (falsch geschriebene Schlüsselwörter<br />

fallen so z.B. schnell auf)<br />

Automatische Vervollständigung<br />

Automatische Einrückung<br />

Textvorlagen<br />

Verbindung mit Hilfesystem<br />

IDE-artige Merkmale<br />

z.B. Compiler <strong>und</strong> Debugger starten<br />

direkt zu Fehlern springen<br />

331 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Produktivität<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Automatische Einrückung:<br />

Nach drücken von Return (oder schon nach drücken z.B. von ’{’)<br />

wird neue Zeile richtig eingerückt.<br />

Zeilen sortieren:<br />

Emacs: M-x sort-lines<br />

330 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

jEdit<br />

www.jedit.org (Java)<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

332 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Editier-Modi<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

jEdit bietet verschiedene Modi für viele Datenformate bzw.<br />

Programmiersprachen. Ein Modus beschreibt:<br />

Syntax-Highlighting<br />

Einrückungsstil<br />

Softe vs. echte Tabs<br />

333 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Tastenkombinationen - Navigieren<br />

Navigieren:<br />

Gehe zu Zeile: Ctrl-L<br />

Ctrl-LEFT, -RIGHT, -UP, -DOWN<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

gehe zur passenden Klammer: Ctrl-]<br />

Code-Block auswählen: Ctrl-[<br />

vorherige Klammer: Ctrl-E Ctrl-[<br />

nächste Klammer: Ctrl-E Ctrl-]<br />

335 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Tastenkombinationen<br />

Menüs öffnen:<br />

Dateien:<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Alt-UnterstrichenerBuchstabe, dann UnterstrichenerBuchstabe<br />

öffnen: Ctrl-O (Dateien anwählen, indem Anfangsbuchstaben<br />

eingegeben werden)<br />

speichern: Ctrl-S<br />

334 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Tastenkombinationen - Editieren<br />

Editieren:<br />

Undo: Ctrl-Z<br />

Kopieren: Ctrl-C<br />

Ausschneiden: Ctrl-X<br />

Einfügen: Ctrl-V<br />

Zeile löschen: Ctrl-D<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Wort hinter Cursor löschen: Ctrl-DEL<br />

Bis Zeilenende löschen: Ctrl-Shift-DEL<br />

Wort vor Cursor löschen: Ctrl-BACKSPACE<br />

Bis Zeilenanfang löschen: Ctrl-Shift-BACKSPACE<br />

336 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Tastenkombinationen - Komfort<br />

Andere:<br />

Wort komplettieren: Ctrl-B<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Abkürzung expandieren: Ctrl-; (oder Eingabe von Space am<br />

Ende der Abkürzung)<br />

337 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Action Bar<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Action Bar (Ctrl-RETURN):<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

die meisten Editor-Features sind so per Tastatur erreichbar<br />

Wiederholungen: #Wiederholungen Taste/Aktion<br />

History; auch Menü-Aktionen <strong>und</strong> Toolbar-Klicks werden<br />

gespeichert<br />

mittels TAB wird eine Liste möglicher Aktionen angezeigt<br />

(sucht nicht nur am Anfand sondern auch nach Sub-Strings);<br />

RETURN nimmt das erste Element der (unsichtbaren) Liste<br />

Eigenschaften ändern (buffer.tabSize=4)<br />

339 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Tastenkombinationen - Buffer<br />

Buffer:<br />

Splitten:<br />

Vorheriger Buffer: Ctrl-PAGE UP<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Nächster Buffer: Ctrl-PAGE DOWN<br />

Letzter Buffer: Ctrl-BACK QUOTE<br />

Buffer-Liste: Alt-BACK QUOTE<br />

Horizontal: Ctrl-2<br />

Vertikal: Ctrl-3<br />

Umschalten zwischen Text Areas:<br />

Vorherige: Alt-PAGE UP<br />

Nächste: Alt-PAGE DOWN<br />

338 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Suchen <strong>und</strong> Ersetzen<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

inkrementelles Suchen: Alt-COMMA<br />

alle Vorkommen eines Ausdrucks: Alt-PERIOD<br />

reguläre Ausdrücke<br />

ersetzen durch BeanShell-Snippets<br />

340 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Makros<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Temporäres Makro aufnehmen: Ctrl-M Ctrl-M<br />

Temporäres Makro abspielen: Ctrl-M Ctrl-P<br />

Benanntes Makro aufnehmen: Ctrl-M Ctrl-R<br />

Aufnahme beenden: Ctrl-M Ctrl-S<br />

letztes Makro wiederholen: Ctrl-Shift-B<br />

Makro aufnehmen, speichern <strong>und</strong> eine Tastenkombination<br />

zuweisen.<br />

Makros sind BeanShell-Skripte.<br />

341 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Zwischenspeicher<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Nicht nur ein Zwischenspeicher, sondern (fast) beliebig viele:<br />

als Register bezeichnet<br />

in Register kopieren: Ctrl-R Ctrl-C key<br />

in Register ausschneiden: Ctrl-R Ctrl-X key<br />

aus Register kopieren: Ctrl-R Ctrl-V key<br />

Register-Inhalte werden zwischen Sitzungen gespeichert<br />

343 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

BeanShell<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Makro-Programmiersprache<br />

Java-Syntax<br />

erlaubt Zugriff auf jEdit-Klassen<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Utilities>BeanShell>Evaluate Selection: interpretiert Auswahl<br />

als BeanShell-Code <strong>und</strong> ersetzt Auswahl durch Ergebnis (z.B.<br />

”(2*3) + 4”)<br />

342 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Marker<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Marker markieren Positionen im Quelltext:<br />

unbenannten Marker einfügen/löschen: Ctrl-E Ctrl-M<br />

nächster Marker: Ctrl-E Ctrl-COMMA<br />

vorheriger Marker: Ctrl-E Ctrl-PERIOD<br />

benannten Marker einfügen: Ctrl-T key<br />

zu benanntem Marker gehen: Ctrl-Y key<br />

344 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Folding<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Folding (Ausblenden von Quelltext):<br />

Fold zuklappen: Alt-BACKSPACE<br />

eine Stufe zuklappen: Alt-RETURN<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

alle Stufen zuklappen: Alt-Shift-RETURN<br />

alles zuklappen: Ctrl-E C<br />

alles expandieren: Ctrl-E X<br />

Narrowing (Gegenteil von Folding):<br />

nur aktuellen Fold anzeigen: Ctrl-E N N<br />

nur aktuelle Auswahl anzeigen: Ctrl-E N S<br />

345 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Plugins<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

viele Plugins erhältlich:<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Anwendungen (z.B. Taschenrechner)<br />

Enterprise (z.B. SQL)<br />

Datei-Management (z.B. FindFile)<br />

Formatierer <strong>und</strong> Prüfer (z.B. AStyle Beautifier)<br />

HTML <strong>und</strong> XML (z.B. JTidyPlugin)<br />

Java (z.B. JExplorer)<br />

347 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Coole Features<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

entpackt <strong>und</strong> packt mit GZip komprimierte Dateien<br />

automatisch<br />

automatisches Speichern, <strong>und</strong> Crash Recovery<br />

Backups (speichert mehrere Versionen einer Datei)<br />

Kann gut mit Zeichenkodierungen umgehen<br />

Tooltips für Icons zeigen entsprechendes Tastaturkürzel<br />

Rechteck- <strong>und</strong> multiple Selektion von Text<br />

346 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Plugins<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Sprachunterstützung (z.B. ClassWizard)<br />

Netzwerk (z.B. FTP)<br />

Projekt-Management (z.B. JCounter)<br />

Unterstützung (z.B. ShortcutDisplay)<br />

Text (z.B. RETest)<br />

Versionskontrolle (z.B. GruntspudPlugin)<br />

Visual (z.B. Highlight)<br />

348 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Eclipse<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

www.eclipse.org (Java)<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

349 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Zusammenfassung<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Einen Editor, <strong>und</strong> den richtig beherrschen<br />

Konfigurierbar<br />

Erweiterbar<br />

Programmierbar (Makros, Skriptsprache)<br />

Tastaturkürzel lernen (!), sollten zum Reflex werden<br />

Syntaxhervorhebung, automatische Vervollständigung, autom.<br />

Einrückung, Textvorlagen, Hilfesystem, Tools starten<br />

eclipse, jedit, (emacs)<br />

351 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Eclipse - Coole Features<br />

Klassenbrowser<br />

Auto-Completion<br />

Fehler werden sofort angezeigt<br />

Editor<br />

Editor-Funktionen<br />

jEdit<br />

Eclipse<br />

Zusammenfassung<br />

Ctrl-LMB auf Funktions- oder Variablenname springt zur<br />

Definitionsstelle<br />

neue Variablen <strong>und</strong> Funktionen werden sofort im<br />

Klassenbrowser angezeigt<br />

Refaktorisieren<br />

Maustipps zeigen Javadoc oder Deklaration an<br />

350 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Versionskontrolle<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

352 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Motivation<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Zugriff auf ältere Versionen<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

Bearbeiten von Dateien durch mehrere Benutzer<br />

Erstellen von Zweigen<br />

Protokollierung von Änderungen<br />

353 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Sandbox<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

Definition<br />

Eine Sandbox dient der Ablage von Arbeitskopien der<br />

Dateiversionen aus dem Repository auf dem lokalen Rechner. Für<br />

jedes Repository kann eine beliebige Anzahl Sandboxes angelegt<br />

werden, z.B. für unterschiedliche Entwicklungsstufen des selben<br />

Projekts.<br />

355 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Repository<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

Definition<br />

Das Repository ist ein zentraler Ablageort für alle Dateien eines<br />

Projektes. Es enthält alle Angaben, die für die Wiederherstellung<br />

von früheren Versionen einer Projektdatei notwendig sind.<br />

354 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Aktionen<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Importieren von Daten<br />

Hinzufügen von Daten<br />

Holen von Daten<br />

Übermitteln von Daten<br />

Editieren von Dateien<br />

Löschen von Dateien<br />

Markieren von Dateien<br />

Aktualisieren der Daten<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

356 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Importieren von Daten<br />

Anlegen eines (leeren) Repository<br />

noch keine Sandbox vorhanden<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

Erstes Hinzufügen lokaler Projektdateien zum Repository<br />

357 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Holen von Daten<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Daten im Repository vorhanden<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

Daten in der Sandbox nicht vorhanden<br />

Holen von Dateien aus dem Repository in die Sandbox<br />

359 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Hinzufügen von Daten<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

Daten im Repository nicht vorhanden<br />

Daten in der Sandbox vorhanden<br />

Hinzufügen neuer Dateien aus der Sandbox zum Repository<br />

358 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Übermitteln von Daten<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

ältere Version der Daten im Repository vorhanden<br />

bearbeitete Version der Daten in der Sandbox<br />

Hinzufügen der bearbeiteten Daten aus der Sandbox ins<br />

Repository<br />

360 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Editieren von Dateien<br />

Datei zur Bearbeitung vorbereiten<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

Markierung der Datei zur Information für andere Bearbeiter<br />

361 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Markieren von Dateien<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

Markieren von Dateien, Verzeichnissen, Zweigen, ...<br />

Versionsnummer, ...<br />

363 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Löschen von Dateien<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

Entfernen von Dateien / Verzeichnissen aus dem Repository<br />

362 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Aktualisieren der Daten<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

Aktualisieren der Daten in der Sandbox<br />

Unterschiede in den Daten des Repository <strong>und</strong> der Sandbox<br />

werden dargestellt<br />

Dateien, die in einer älteren Version in der Sandbox liegen,<br />

werden durch die neueste Version aus dem Repository ersetzt<br />

364 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

Beispiele für Versionsverwaltungen<br />

RCS<br />

SCCS<br />

VSS<br />

Rational ClearCase<br />

CVS<br />

SVN<br />

365 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

SCCS<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Source Code Control System<br />

1972<br />

Bell Labs<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

367 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

RCS<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Revision Control System<br />

1980er<br />

Walter F. Tichy<br />

Purdue University<br />

GNU-Projekt<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

366 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

VSS<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Visual SourceSafe<br />

Microsoft<br />

VisualBasic, C++, C<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

368 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Rational ClearCase<br />

1980er Jahre<br />

IBM<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

369 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Aktionen<br />

import<br />

add<br />

checkout<br />

commit<br />

edit<br />

remove<br />

tag<br />

unedit<br />

update<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

371 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

CVS<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Concurrent Versions System<br />

Entwicklung seit 1989<br />

GNU General Public License<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

Weiterentwicklung von RCS <strong>und</strong> SCCS<br />

370 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

WinCVS<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

372 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Cervisia (KDE)<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

373 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

SVN<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Vorteile gegenüber CVS:<br />

Versionierung von Verzeichnissen<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

Umbenennen von Dateien (<strong>und</strong> Verzeichnissen) beeinflußt<br />

nicht die Historie der Datei<br />

Suche nach Unterschieden zwischen Dateien mit Algorithmus,<br />

der für Text- <strong>und</strong> Binärdateien funktioniert<br />

375 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

SVN<br />

Subversion<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Entwicklung seit 2000<br />

CollabNet<br />

Ersatz für CVS<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

Konversion eines CVS-Repository mit cvs2svn<br />

374 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Aktionen<br />

import<br />

add<br />

checkout<br />

commit<br />

copy<br />

delete<br />

update<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

376 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


SVN<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

377 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Software wird komplexer<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

früher zeichenorientierte Terminals<br />

heute grafische Benutzungsschnittstellen mit<br />

kontextsensitiver Hilfe<br />

Cut and Paste<br />

Drag and Drop<br />

Anwendungen selbst werden immer komplexer<br />

(Mehrschichtarchitektur). Programme sollen dynamisch <strong>und</strong><br />

flexibel sein <strong>und</strong> mit Anwendungen von Dritten zusammenarbeiten.<br />

<strong>Programmieren</strong> wird immer komplexer.<br />

379 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Weiterführende Literatur<br />

Fachbegriffe<br />

Aktionen<br />

Beispiele<br />

CVS<br />

SVN<br />

Literatur<br />

CVS kurz & gut - Überblick über die wichtigsten Befehle<br />

Versionskontrolle mit Subversion<br />

Kurzeinführung in CVS - kurze Einführung in die<br />

allerwichtigsten CVS-Befehle <strong>und</strong> in Cervisia<br />

378 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Zauberer<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

380 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Neue <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Heute benötigt man andere <strong>Werkzeuge</strong> wie vor 20 Jahren.<br />

”Assistenten” erzeugen mit wenigen Eingaben automatisch ein<br />

Quelltextgerüst. (Danach helfen sie einem dann aber nicht mehr...)<br />

Aber Vorsicht: Wer den erzeugten Programmcode nicht versteht<br />

programmiert mit dem Zufall.<br />

Keinen generierten Quelltext verwenden, den man nicht versteht.<br />

Sonst veliert man bald die Kontrolle.<br />

381 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Fachsprachen<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

“Die Grenzen meiner Sprache bedeuten die Grenze meiner Welt.”<br />

(Ludwig Wittgenstein)<br />

Programmiersprachen beeinflußen, wie man über Probleme<br />

nachdenkt<br />

Nahe am Problem programmieren, d.h. eigene einfache<br />

Sprache entwickeln<br />

383 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Unterscheidung zwischen fremdem <strong>und</strong> eigenem Code<br />

Implementierungen von verwendeten Bibliotheken versteht man oft<br />

auch nicht. Diese sind aber in sich gekapselt <strong>und</strong> nur durch<br />

wohldefinierte Schnittstellen ansprechbar.<br />

Generierter Quelltext wird jedoch Teil des eigenen Programms.<br />

382 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Fachsprachen<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Datenbeschreibungssprachen: erzeugen Datenstrukturen, die<br />

von der Anwendung benutzt werden<br />

sendmail-Konfiguration<br />

Menüs, Steuerelemente, Dialoge in Windows Ressourcen-Datei<br />

Imperative Sprachen: werden in ausführbaren Code umgesetzt<br />

Umsetzung von eigener Sprache in z.B. C++-Code<br />

Skriptsprachen, die in Anwendung interpretiert werden (z.B.<br />

Beanshell in jEdit)<br />

384 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Schablonen<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Wenn ein Schreiner dasselbe Stück immer wieder herstellen muss,<br />

dann macht er sich eine Schablone.<br />

vereinfacht die Aufgabe<br />

verringert das Risiko, Fehler zu begehen<br />

Der Handwerker kann sich auf die Qualität konzentrieren.<br />

385 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Passive Quelltextgeneratoren<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Passive Quelltextgeneratoren sparen Tipparbeit. Sie sind<br />

parametrisierte Vorlagen, die aus einer Menge von Eingaben eine<br />

vorgegebene Ausgabe erzeugen.<br />

Einsatzzwecke:<br />

Erzeugen neuer Quelltextdateien: z.B. Vorlagen,<br />

Urheberrechtsangaben, Standardkommentare,<br />

Code-Gr<strong>und</strong>gerüst<br />

387 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Quelltextgenerator<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Äquivalent kann sich ein Programmierer einen Quelltextgenerator<br />

schreiben.<br />

Es gibt 2 Arten von Quelltextgeneratoren:<br />

Passive: werden einmalig ausgeführt, von da an wird das<br />

Ergebnis selbständig<br />

Assistenten<br />

einige CASE-<strong>Werkzeuge</strong><br />

Aktive: werden jedesmal Mal ausgeführt, wenn das Ergebnis<br />

benötigt wird. Ergebnis ist ein Wegwerfprodukt, da es<br />

jederzeit neu hergestellt werden kann.<br />

386 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Passive Quelltextgeneratoren<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Einmalige Konvertierungen zwischen Programmiersprachen:<br />

z.B. troff nach L ATEX. Konvertierung muss nicht perfekt sein;<br />

geringe Nacharbeiten können OK sein.<br />

Erzeugen von Nachschlagetabellen (LUT) <strong>und</strong> anderen<br />

Ressourcen, die zur Laufzeit aufwändig zu berechnen sind.<br />

388 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Aktive Quelltextgeneratoren<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Passive Quelltextgeneratoren sind eine Annehmlichkeit, während<br />

aktive eine Notwendigkeit sind, wenn man dem DRY-Prinzip folgen<br />

will (ein einziges Stück Wissen in alle notwendigen Formen<br />

konvertieren).<br />

Immer wenn man versucht, verschiedene Umgebungen zur<br />

Zusammenarbeit zu bewegen, sollte man über aktive<br />

Quelltextgeneratoren nachdenken.<br />

389 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Aktive QTGs - Beispiel Programmiersprachen<br />

Werden mehrere Programmiersprachen in einer Anwendung<br />

verwendet, benötigt man für die Kommunikation (Datenstrukturen,<br />

Nachrichtenformate) gemeinsame Informationen.<br />

Entweder die Daten für die eine Sprache aus der anderen<br />

auslesen.<br />

Oft leichter Informationen in einer einfachen, sprachneutralen<br />

Darstellung zu formulieren, <strong>und</strong> Quelltext für beide Sprachen<br />

generieren.<br />

391 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Aktive QTGs - Beispiel DB<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Entwickeln einer Datenbankanwendung, 2 Umgebungen: DB <strong>und</strong><br />

Programmiersprache.<br />

Quelltext aus Datenbankschema generieren. Wird das Schema<br />

geändert erzeugt man einfach den Quelltext neu. Wird eine Spalte<br />

gelöscht, verschwindet auch das entsprechende Feld in der<br />

Datenstruktur.<br />

1 Schema<br />

2 Tabelle ’Employee’<br />

3 Tabelle ’Employer’<br />

4 Tabelle ’Benefit’<br />

1 struct EmployeeRow<br />

2 ...<br />

3 struct EmployerRow<br />

4 ...<br />

5 struct BenefitRow<br />

6 ...<br />

390 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Aktive QTGs - Beispiel Programmiersprachen<br />

1 # Add a product<br />

2 # to the ’on-order’ list<br />

3 M AddProduct<br />

4 F id int<br />

5 F name char[30]<br />

6 F order_code int<br />

1 /* Add a product */<br />

2 /* to the ’on-order’ list<br />

*/<br />

3 typedef struct {<br />

4 int id;<br />

5 char name[30];<br />

6 int order_code;<br />

7 } AddProductMsg;<br />

1 { Add a product }<br />

2 { to the ’on-order’ list }<br />

3 AddProductMsg = packed<br />

record<br />

4 id: LongInt;<br />

5 name: array[0..29] of<br />

char;<br />

6 order_code: LongInt;<br />

7 end;<br />

392 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Aktive QTGs - Beispiel UML zu Quellcode<br />

Erzeugung von Quelltext aus UML-Diagrammen<br />

z.B. mit Umbrello<br />

393 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

QTG - Keep it simple<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

QTGs sind im Idealfall sehr einfach gehalten<br />

Parsen der Steuerungsdatei ist eigentlich das größte Problem<br />

also Datenformat einfach halten!<br />

Erzeugung des Quelltexts besteht hauptsächlich aus<br />

print-Anweisungen<br />

QTGs können für jede beliebige Ausgabe verwendet werden<br />

(HTML, L ATEX, ...)<br />

395 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Intelligente QTGs<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Es geht auch ”two-way”: Eclipse passt die Ansicht einer Klasse im<br />

Klassen-Browser an, wenn der Quelltext geändert wird <strong>und</strong><br />

umgekehrt. Erzeugt aber nur Gr<strong>und</strong>gerüste.<br />

394 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Parsen<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Die Struktur einer Datei zu analysieren besteht aus 2 Aufgaben:<br />

1 die Datei in einzelne Token zerlegen<br />

2 die hierarchische Struktur erkennen<br />

Dafür gibt es die Programme flex (lex) <strong>und</strong> bison (yacc). Werden<br />

hauptsächlich beim Compilerbau verwendet.<br />

396 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


(f)lex<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

flex: ein schneller Scanner-Generator<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

zerlegt einen Eingabestrom in einzelne Einheiten<br />

gesteuert durch reguläre Ausdrücke <strong>und</strong> dazugehörige<br />

Programmfragmente<br />

flex analyse.lex<br />

erzeugt C[++]-Code, der Dateien entsprechend der regulären<br />

Ausdrücke segmentiert (deterministischer endlicher Automat)<br />

gcc lex.yy.c<br />

397 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

beispiel.lex<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

1 /* tells flex to provide a default main function */<br />

2 %option main<br />

3<br />

4 /* rules below */<br />

5 %%<br />

6 a |<br />

7 e |<br />

8 [iou] printf("\nVowel %s recognized\n", yytext);<br />

399 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Struktur einer flex-Datei<br />

Definitionsteil<br />

%%<br />

Regelteil<br />

%%<br />

Benutzerdefinierte Routinen<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Wobei der Regelteil folgendermaßen aussieht:<br />

r1 a1;<br />

r2 a2;<br />

rn an;<br />

Eine Aktion besteht aus einer oder mehreren C[++]-Anweisungen.<br />

398 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Segmentierung anhand von beispiel.lex<br />

Die Eingabe<br />

1 abcdefghijklmnopqrstuvwxyz<br />

wird in folgende Einheiten zerlegt:<br />

1 abcd<br />

2 e<br />

3 fgh<br />

4 i<br />

5 jklmn<br />

6 o<br />

7 pqrst<br />

8 u<br />

9 vwxyz<br />

400 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


ison (yacc)<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

yacc: yet another compiler-compiler (Compiler-Generator)<br />

analysiert die Struktur eines Datenstroms<br />

gesteuert durch eine LALR(1) kontextfreie Grammatik (BNF)<br />

<strong>und</strong> dazugehörigem Code<br />

bison analyse.y<br />

erzeugt C[++]-Code, der bei Auftreten einer Struktur, den<br />

entsprechenden Code ausführt<br />

401 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Andere Sprachen<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

flex <strong>und</strong> bison erzeugen C[++]-Code<br />

gibt es auch für andere Sprachen (z.B. javacc)<br />

http://catalog.compilertools.net<br />

403 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Struktur einer bison-Datei<br />

Definitionsteil<br />

%%<br />

Regelteil<br />

%%<br />

Benutzerdefinierte Routinen<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Wobei der Regelteil folgendermaßen aussieht:<br />

linkeSeite : rechteSeite a1;<br />

linkeSeite : rechteSeite a2;<br />

linkeSeite : rechteSeite an;<br />

Eine Aktion besteht aus einer oder mehreren C[++]-Anweisungen.<br />

402 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Zusammenfassung<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Assistenten verwenden ist OK, wenn man den erzeugten<br />

Quelltext versteht<br />

Format der Steuerungs-Datei einfach halten<br />

nicht nur Quelltext kann erzeugt werden, sondern natürlich<br />

jede Art von Daten (HTML, Text, ...)<br />

404 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Weiterführende Literatur<br />

Komplexität<br />

Fachsprachen<br />

Quelltextgeneratoren<br />

Dateien parsen<br />

Zusammenfassung<br />

Der Pragmatische Programmierer, (Andrew Hunt, David<br />

Thomas)<br />

Compilers - Principles, Techniques and Tools, (Aho,<br />

Sethi, Ullman)<br />

405 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Debuggen<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

“Es ist eine schmerzhafte Sache, seine eigenen Probleme zu sehen<br />

<strong>und</strong> zu wissen, dass nur man selbst <strong>und</strong> niemand anders sie<br />

verursacht hat.” (Sophokles)<br />

407 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Der 1. Bug<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

406 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Psychologie der Fehlersuche<br />

niemand schreibt perfekte Software<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

ca. 50 % der Zeit werden Fehler gesucht<br />

Fehlersuche einfach als Lösen von Problemen betrachten<br />

Wer ist schuld? Egal, Problem beheben!<br />

408 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Mentalität für die Fehlersuche<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

“Sich selbst kann man am leichtesten täuschen.” (Edward<br />

Bulwer-Lytton)<br />

entspannen<br />

Bequem machen<br />

Keine Panik!<br />

ruhig nachdenken, worin die Ursachen liegen könnten<br />

Wurzel des Problems finden, nicht nur Symptome beseitigen<br />

409 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Daten visualisieren<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

bearbeitete Daten anzeigen lassen<br />

als einfacher Text<br />

grafisch<br />

Debugger verwenden, der Daten <strong>und</strong> deren Zusammenhänge<br />

visualisieren kann<br />

Daten als 3D-Landschaft<br />

als Strukturdiagramm<br />

Papier <strong>und</strong> Bleistift<br />

411 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Wo beginnen?<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

bevor man beginnt, sicherstellen, dass Quelltext ohne<br />

Warnungen kompiliert<br />

genaue Fehlerbeschreibung, relevante Informationen<br />

zusammentragen<br />

eventuell Anwender befragen, der Fehler entdeckte<br />

künstliche Tests testen die Anwendung nicht ausreichend<br />

sowohl Grenzfälle als auch realistische Eingabemuster testen<br />

Fehler (mit möglichst wenigen Schritten) reproduzierbar<br />

machen<br />

410 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Tracing<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

Zustand des Programms oder einer Datenstruktur im Laufe<br />

der Zeit beobachten<br />

Diagnosemeldungen auf Bildschirm oder in Log-Datei<br />

reguläres, konsistentes Format verwenden; ermöglicht<br />

automatische Analyse<br />

412 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Gummi-Enten<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

einfache aber nützliche Technik für die Analyse eines<br />

Problems: es jemand anderem erklären<br />

das kann eine Gummi-Ente sein :-)<br />

oft führt das schrittweise Erklären dazu, dass einem die<br />

Ursache des Problems klar wird<br />

dadurch werden Dinge explizit ausgesprochen, die man für<br />

selbstverständlich hält<br />

413 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Überraschungsmomente<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

manchmal liegt der Fehler in einer Funktion, von der man<br />

glaubte, dass sie absolut korrekt funktioniert<br />

nicht annehmen, dass etwas auf eine bestimmte Art <strong>und</strong><br />

Weise funktioniert, sondern beweisen<br />

gibt es andere Stellen im Programm, die für diesen Fehler<br />

anfällig sein könnten? gleich mitbeheben.<br />

wenn Fehlersuche lange gedauert hat, überlegen, wie man es<br />

beim nächsten Mal schneller machen kann<br />

415 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Ausschlussverfahren<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

meist liegt der Fehler im eigenen Code, <strong>und</strong> nicht in den<br />

verwendeten Bibliotheken<br />

lesen der Dokumentation hilft, wenn man meint, etwas müsste<br />

auf eine bestimmte Art <strong>und</strong> Weise funktionieren, es aber nicht<br />

tut<br />

binäres Verfahren zur Fehlersuche<br />

414 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Tote Programme lügen nicht<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

immer Prüfen, ob Funktionen fehlerfrei beendet wurden<br />

defensiv <strong>Programmieren</strong>: Probleme so früh wie möglich<br />

erkennen<br />

Programme abstürzen lassen (aber möglichst noch<br />

Aufräumen), sonst macht man eventuell mit zweifelhaften<br />

Daten weiter<br />

Java wirft z.B. Runtime Exceptions<br />

416 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Abgesichert <strong>Programmieren</strong><br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

“Selbstbezichtigung ist auch eine Art Luxus. Wenn wir uns selbst<br />

die Schuld geben, glauben wir niemand sonst habe das Recht uns<br />

zu beschuldigen.” (Oscar Wilde)<br />

”Das kann nie passieren...” Doch!<br />

Das Unmögliche mit Zusicherungen verhindern.<br />

C[++]: assert-Makro<br />

1 void writeString(char* string) {<br />

2 assert(string != NULL);<br />

3 ...<br />

417 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Design by Contract<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

geht noch weiter als Zusicherungen<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

dokumentiert Rechte <strong>und</strong> Pflichten von Softwaremodulen<br />

Vorbedingungen: müssen gelten damit eine Funktion<br />

aufgerufen werden kann<br />

Nachbedingungen: garantierter Zustand nach Beendigung<br />

der Funktion<br />

Klassen-Invarianten: Klasse stellt sicher, dass diese<br />

Bedingung aus Sicht des Aufrufers immer gilt<br />

arbeitsscheuen Code schreiben: streng sein mit dem was man<br />

akzeptiert, <strong>und</strong> wenig versprechen<br />

unterstützt von Eiffel, iContract für Java, Nana für C[++]<br />

419 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Abgesichert <strong>Programmieren</strong><br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

Bedingung einer Zusicherung darf keine Seiteneffekte haben<br />

(also keinen Quelltext, der ausgeführt werden muss)<br />

Heisen-Bug: Fehlersuche, die das Verhalten des Systems<br />

beeinflusst<br />

Zusicherungen möglichst immer eingeschaltet lassen<br />

418 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

Design by Contract - Beispiel (iContract)<br />

1 /**<br />

2 * @invariant forall Node n in element() |<br />

3 * n.prev() != null<br />

4 * implies<br />

5 * n.value().compareTo(n.prev().value()) > 0<br />

6 */<br />

7 public class dbc_list {<br />

8 /**<br />

9 * @pre contains(aNode) == false<br />

10 * @post contains(aNode) == true<br />

11 */<br />

12 public void insertNode(final Node aNode) {<br />

13 // ...<br />

420 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


GDB<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

421 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

DDD<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

graphisches Front-End für zeichenorientierte Debugger (GDB,<br />

DBX, Ladebug, XDB)<br />

unterstützt auch Java (jdb), Python (pydb), Perl <strong>und</strong> Bash<br />

stellt Datenstrukturen <strong>und</strong> deren Beziehungen übersichtlich<br />

dar<br />

423 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

GDB<br />

GNU Debugger<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

zeichenorientierter Debugger für C[++] <strong>und</strong> Modula-2,<br />

Fortran, Java, Pascal, Assembler <strong>und</strong> Ada<br />

Schritt für Schritt durch ein Programm<br />

Anzeigen von Variablen-Inhalten<br />

Haltepunkte an beliebigen Stellen, oder wenn bestimmte<br />

Bedingungen eintreten<br />

funktioniert sehr gut, ist jedoch mühsam zu bedienen<br />

422 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

DDD<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

424 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Valgrind<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

läßt zu untersuchende Programme in einer virtuellen Maschine<br />

laufen<br />

findet Speicherlecks<br />

cachegrind prüft Laufzeit (profiler)<br />

425 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Strace<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Zeigt geöffnete Dateien <strong>und</strong> Systemaufrufe.<br />

Anzahl <strong>und</strong> Dauer von Systemaufrufen<br />

1 strace -c ls -l<br />

Dateizugriffe<br />

1 strace -e trace=file ls -l<br />

Netzwerkzugriffe<br />

1 strace -e trace=network firefox<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

427 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Flawfinder<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

analysiert Quellcode statisch (eingebaute DB von C/C++<br />

Funktionen mit bekannten Problemen, einfaches<br />

Patternmatching)<br />

findet häufige Fehler<br />

ähnliche Tools: splint, RATS (Rough Auditing Tool for<br />

Security)<br />

426 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Zusammenfassung<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

50 % der Zeit Fehler suchen, Keine Panik!<br />

Fehler binär suchen<br />

Compilerwarnungen beachten<br />

gdb, ddd als Frontend<br />

Programme kennenlernen<br />

Tracing (Logging)<br />

Gummi-Ente<br />

428 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Weiterführende Literatur<br />

Debuggen<br />

Psychologie der Fehlersuche<br />

Strategien für die Fehlersuche<br />

Debugger<br />

Nützliche Programme<br />

Zusammenfassung<br />

Der Pragmatische Programmierer, (Andrew Hunt, David<br />

Thomas)<br />

429 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Dokumentation<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

Dokumentieren sollte als integraler Bestandteil der<br />

Software-Entwicklung angesehen werden<br />

Dokumentieren wird einfacher wenn<br />

man die Arbeit nicht mehrfach macht<br />

die Dokumentation in Reichweite aufbewahrt wird<br />

Donald Knuth: ”Literate Programming” (Schreiben von<br />

Computerprogrammen in einer Form, so dass sie vor allem für<br />

Menschen lesbar sind)<br />

Javadoc, etc.<br />

431 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Dokumentation<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

“Die blasseste Tinte ist besser als das schlechteste Gedächtnis.”<br />

(Chinesisches Sprichwort)<br />

430 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Dokumentation<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

Quelltext <strong>und</strong> Dokumentation sind 2 Sichten auf dasselbe<br />

Modell<br />

Dokumentation ist ein Spiegel des Quelltextes. Bei<br />

Unstimmigkeiten zählt der Quelltext<br />

Deutsch (Englisch) wie eine Programmiersprache behandeln. (D.h.<br />

alle pragmatischen Prinzipien genauso auf Dokumentation<br />

anwenden wie auf Quelltext.)<br />

Dokumentation einbauen anstatt sie dranzuschrauben.<br />

432 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Arten der Dokumentation<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

Es gibt 2 Arten der Dokumentation:<br />

interne<br />

Quelltextkommentare<br />

Entwurfs- <strong>und</strong> Testdokumente<br />

Pflichtenheft<br />

externe<br />

alles was ausgeliefert oder für die Außenwelt veröffentlicht wird<br />

(z.B. Benutzerhandbücher)<br />

433 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Kommentare im Quelltext<br />

Kommentiert werden sollten:<br />

das Modul<br />

Datentypen<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

Klassen<br />

Funktionen<br />

beschreibt, wie die Funktion aufgerufen wird, <strong>und</strong> was dabei<br />

beachtet werden muss<br />

435 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Kommentare im Quelltext<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

Aus Kommentaren <strong>und</strong> Deklarationen im Quelltext kann<br />

Dokumentation erzeugt werden. Quelltext benötigt Kommentare,<br />

zu viele sind aber genauso schlecht wie zu wenige.<br />

Kommentare sollen erklären wieso etwas getan wird (Zweck <strong>und</strong><br />

Ziel, Gr<strong>und</strong> für Kompromisse, Alternativen). Wie es getan wird<br />

steht schon im Quelltext (<strong>und</strong> sollte deshalb nicht kommentiert<br />

werden).<br />

434 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Kommentare im Quelltext<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

Was nicht in Quelltextkommentaren stehen sollte:<br />

eine Liste der exportierten Funktionen der Datei<br />

Änderungshistorie (dafür sind Versionskontrollsysteme da)<br />

Liste von Dateien, die verwendet werden<br />

Name der Datei<br />

Es gibt externe Programm, die Quelltext analysieren, <strong>und</strong> diese<br />

Informationen ermitteln können.<br />

436 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Ausführbare Dokumente<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

SQL-Anweisungen <strong>und</strong> Datenstruktur aus<br />

Datenbank-Spezifikation erzeugen<br />

bei Vorlage in Klartext z.B. Perl verwenden<br />

bei Vorlage in proprietärem Format:<br />

Makros schreiben<br />

oder als Klartext exportieren<br />

bei Änderung der Spezifikation können andere ”Ansichten”<br />

auf das ”Modell” einfach automatisch erzeugt werden<br />

437 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Drucken oder Weben<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

Dokumentation auf Papier veraltet sobald sie gedruckt ist<br />

Dokumentation möglichst (zusätzlich) in einer Form erstellen,<br />

die im Netz mit Hyperlinks veröffentlicht werden kann<br />

ist leichter aktuell zu halten<br />

oft muss Dokumentation in verschiedenen Formaten erstellt<br />

werden (Handbuch, Webseite)<br />

kein Cut and Paste!<br />

alles automatisch aus einer Quelle erstellen<br />

oder Textbearbeitungsprogramm verwenden, das in die<br />

benötigten Formate exportieren kann<br />

439 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Technische Autoren<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

externe Dokumentation wie Benutzerhandbücher <strong>und</strong><br />

Werbematerial werden oft von professionellen technischen<br />

Autoren geschrieben<br />

diese sollten auch Zugriff auf automatisch generierte<br />

Dokumentation haben<br />

438 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Markup-Sprachen<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

für (große) Dokumentationsprojekte Markup-Sprachen<br />

verwenden<br />

DocBook (SGML-basiert)<br />

kann in viele verschiedene Formate umgewandelt werden<br />

(TeX, PS, HTML)<br />

440 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Dokumentationswerkzeuge<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

Dokumentation im Quellcode (DRY)<br />

javadoc, doxygen, DOC++<br />

Quellcode browsen (auch ohne zusätzliche Kommentare)<br />

Visualisierung von Vererbungsdiagrammen <strong>und</strong><br />

Abhängigkeitsgraphen<br />

441 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Doxygen<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

443 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Doxygen<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

unterstützte Programmiersprachen: C[++], Java, Python, ...<br />

Ausgabeformate: HTML, LaTeX, PostScript, PDF, Man page,<br />

...<br />

442 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Zusammenfassung<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

Dokumentation <strong>und</strong> Quellcode sind (sollten sein) zwei Sichten<br />

auf dasselbe Modell<br />

Dokumentation im Quellcode (DRY)<br />

javadoc, doxygen<br />

erzeugte API-Doku kann zum Quellcodebrowsen verwendet<br />

werden<br />

444 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Weiterführende Literatur<br />

Dokumentation<br />

Dokumentationswerkzeuge<br />

Zusammenfassung<br />

Der Pragmatische Programmierer, (Andrew Hunt, David<br />

Thomas)<br />

445 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Motivation<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Code and Fix: Codierung oder Korrektur im Wechsel mit<br />

Ad-hoc-Tests (unwirtschaftlich, aber weit verbreitet)<br />

Tests gehören zu den Kernprozessen in einem<br />

Entwicklungsprozess<br />

Zusammenspiel mehrerer Komponenten<br />

Nacharbeiten (nach Auslieferung) vermeiden:<br />

K<strong>und</strong>e soll funktionierende Software erhalten<br />

K<strong>und</strong>e soll vollständige Software erhalten (entsprechend<br />

Spezifikation)<br />

Fehler sind nicht immer offensichtlich<br />

447 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Test<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

446 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Testarten<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Was wird getestet?<br />

Modultest (Low-Level)<br />

Integrationstest (Low-Level)<br />

Systemtest (High-Level)<br />

Akzeptanztest (High-Level)<br />

→ vgl. Kernprozesse eines Entwicklungsprozesses<br />

Wie wird getestet?<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

448 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Modultest<br />

Unit Test<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Komponententest<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Überprüfung der Korrektheit eines Software-Moduls<br />

automatisiert (Testprogramm)<br />

Vorstufe zu Integrationstest<br />

Voraussetzung für Refaktorisieren:<br />

Modultest nach jeder Änderung<br />

449 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Systemtest<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Test des Gesamtsystems gegen die Spezifikation<br />

Funktionaler Systemtest:<br />

Überprüfung auf Korrektheit <strong>und</strong> Vollständigkeit<br />

Nicht funktionaler Systemtest:<br />

Überprüfung auf Sicherheit, Benutzbarkeit, Zuverlässigkeit, ...<br />

451 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Integrationstest<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Test des Zusammenspiels abhängiger Komponenten<br />

vorheriger Test der einzelnen Komponenten<br />

Überprüfung der einzelnen Komponenten nach der<br />

Zusammenführung<br />

Überprüfung des Datenaustausches über gemeinsame<br />

Schnittstelle(n)<br />

Bottom-Up-Methode:<br />

Integrationstest für abgegrenztes Subsystem<br />

Subsystem wird als Komponente betrachtet<br />

450 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Akzeptanztest<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Test durch K<strong>und</strong>e/Anwender<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Überprüfung der Anforderungen aus dem Pflichtenheft<br />

452 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Testbare Eigenschaften<br />

Funktionalität<br />

Installation<br />

Wiederinbetriebnahme<br />

Verfügbarkeit<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

453 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Installation<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Installation möglich?<br />

Inbetriebnahme möglich?<br />

Dokumentation vollständig?<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

455 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Funktionalität<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Spezifikation erfüllt?<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

454 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Wiederinbetriebnahme<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Neustart nach Unterbrechung möglich?<br />

Dokumentation vollständig?<br />

456 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Verfügbarkeit<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Systemlauf über geforderte Zeitspanne<br />

Störung?<br />

457 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorbereitung<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Testplan erstellen:<br />

Abgleich mit Spezifikation<br />

Wiederverwendung<br />

Erweiterung<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

459 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorbereitung<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Testfälle bestimmen:<br />

Anfangszustand<br />

Werte der Eingabedaten<br />

Bedienungen<br />

erwartete Ausgaben<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

458 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Vorbereitung<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Der Test sollte nach Möglichkeit nicht vom Entwickler selbst<br />

ausgeführt werden.<br />

Ein Test durch den Entwickler ist aber immer noch besser als gar<br />

kein Test.<br />

460 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Regeln<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

kein vorzeitiger Abbruch<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

keine spezielle Testvariante des Programms<br />

kein Wechseln zwischen Test <strong>und</strong> Debugging<br />

461 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Auswertung<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Prüfung, ob Programm genau das tut, was es soll <strong>und</strong> nichts<br />

anderes<br />

Testbericht:<br />

administrative Angaben (Modulbezeichnung, Datum, ...)<br />

Schlußbewertung<br />

Verweise auf den Test betreffende Dokumente<br />

festgestellte Abweichungen (⇒ Problemmeldung)<br />

Gr<strong>und</strong>lage für Planung <strong>und</strong> Kontrolle der Fehlerbehebung<br />

463 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Abbruchkriterien<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

nach festgelegter Maximaldauer<br />

nach bestimmtem Aufwand<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

nach festgelegter Laufzeit ohne Fehler<br />

Ausführung aller spezifizierten Testfälle liefert spezifizierte<br />

Ergebnisse<br />

durchschnittliche Testkosten pro entdecktem Fehler<br />

übersteigen festgelegten Wert<br />

festgelegte Anzahl Fehler entdeckt<br />

462 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Regressionstest<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Änderung von Software:<br />

Bugfix<br />

Erweiterung<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Überprüfung auf Nebenwirkungen durch Modifikation bereits<br />

getesteter Software<br />

Wiederholung aller Testfälle<br />

Übereinstimmung der Testresultate mit denen der Vorversion<br />

(abgesehen von gewollten Unterschieden)<br />

automatisierte Ausführung möglich<br />

464 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Funktionstest<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Abgleich mit Spezifikation<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Testdatenauswahl entsprechend der gewünschten<br />

Funktionalität des Programms<br />

465 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Eingabeüberdeckung<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Bearbeitung aller unterschiedlichen Eingabekombinationen<br />

Eingabekombinationen aus Spezifikation auflisten<br />

Testfall für jede Eingabemöglichkeit beschreiben<br />

467 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Funktionsüberdeckung<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Überprüfung aller Funktionen des Programms<br />

Funktionen aus Spezifikation auflisten<br />

Testfall für jede Funktion beschreiben<br />

466 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Ausgabeüberdeckung<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Erzeugen sämtlicher möglicher Ausgabeformen<br />

Ausgabeformen aus Spezifikation auflisten<br />

Testfall/Testfälle für jede Ausgabeform beschreiben<br />

468 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Beispiel - Testgegenstand<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

469 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Beispiel - Funktionsüberdeckung<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Nr. Beschreibung Eingabe Ausgabe Kommentar<br />

F01 Transportmittel vollpacken <strong>und</strong> Gepäck wird ok<br />

(R01) losschicken transportiert<br />

F02 handhabbar von A nach B bewegt sich durchgef.<br />

(R02) führen von A nach B (störrisch)<br />

F03 kommt mit un- über unebenes bewegt sich ok<br />

ebenem Ge- Gelände führen über unebenes<br />

lände klar (R03) Gelände<br />

... ... ... ... ...<br />

Fnn umweltfre<strong>und</strong>l. Brennstoff umweltvertr. ok<br />

(Rnn) Abfallprodukt<br />

471 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Beispiel - Anforderungen<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Nr. Beschreibung<br />

R01 als Transportmittel nutzbar<br />

R02 leicht handhabbar<br />

R03 kommt mit unebenem Gelände zurecht<br />

... ...<br />

Rnn umweltfre<strong>und</strong>lich<br />

470 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Beispiel - Eingabeüberdeckung<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Nr. Eingabe geforderte Reaktion Kommentar<br />

E01 Kommando “Los” Vorwärtsbewegung durchgefallen<br />

(funktioniert oft)<br />

E02 Kommando “links” Bewegung nach durchgefallen<br />

links (unzuverlässig)<br />

E03 Kommando “rechts” Bewegung nach durchgefallen<br />

rechts (unzuverlässig)<br />

E04 Kommando Stillstand durchgefallen<br />

“stehenbleiben” (unzuverlässig)<br />

... ... ... ...<br />

Enn Manueller Anschub Vorwärtsbewegung ok (widerwillig)<br />

472 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Beispiel - Ausgabeüberdeckung<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Nr. geforderte Ausgabe benötigte Eingabe Kommentar<br />

A01 Vorwärtsbewegung Kommando “Los”, ok<br />

ggf. manueller Anschub<br />

A02 Stillstand Kommando “stehen- ok<br />

bleiben”, ggf. Festhalten<br />

A03 voll Beladen Festhalten <strong>und</strong> Beladen ok<br />

... ... ... ...<br />

Ann Fortbewegung in Kommando “rechts”, ok<br />

korrekte Richtung “links” oder manueller (widerwillig)<br />

Anschub<br />

473 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Anweisungsüberdeckung<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Überprüfung möglichst vieler Anweisungen<br />

Idealfall:<br />

Überprüfung aller Anweisungen<br />

Überdeckung wird als Verhältnis angegeben:<br />

x % der Anweisungen wurden im Test ausgeführt<br />

475 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Strukturtest<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Überprüfung der Abläufe<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Testdatenauswahl unter Einfluß der inneren Struktur des<br />

Programms<br />

474 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Zweig- / Entscheidungsüberdeckung<br />

Überprüfung möglichst vieler Verzweigungsmöglichkeiten<br />

Idealfall:<br />

Überprüfung aller Verzweigungsmöglichkeiten<br />

Überdeckung wird als Verhältnis angegeben:<br />

x % der Verzweigungsmöglichkeiten wurden im Test ausgeführt<br />

476 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Termüberdeckung<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Ausführen möglichst vieler logischer Terme<br />

Idealfall: Ausführen aller logischen Terme<br />

Überdeckung wird als Verhältnis angegeben:<br />

x % der logischen Terme wurden im Test wirksam<br />

477 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Pfadüberdeckung<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Ausführen möglichst vieler Pfade durch das Programm<br />

Idealfall: Ausführen aller möglichen Pfade<br />

Überdeckung wird als Verhältnis angegeben:<br />

x % der möglichen Pfade wurden im Test durchlaufen<br />

479 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Behandlung von Schleifen<br />

Umgehung der Schleife<br />

eine Iteration<br />

zwei Iterationen<br />

typische Anzahl Iterationen<br />

maximale Anzahl Iterationen<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

478 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Programmeinheitenüberdeckung<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Überdeckungskriterium für Programmkomponenten<br />

jede Komponente wird mindestens einmal aufgerufen<br />

480 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>


Aufrufüberdeckung<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Überdeckungskriterium für Programmkomponenten<br />

jeder aufrufbare Teil der Einheiten eines Programms wird<br />

wenigstens einmal aufgerufen<br />

481 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Zusammenfassung<br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Modultest zur Überprüfung von Programmkomponenten<br />

Integrationstest zur Überprüfung des Zusammenspiels<br />

mehrerer Komponenten<br />

Systemtest zur Überprüfung des Gesamtsystems<br />

Akzeptanztest durch den K<strong>und</strong>en<br />

Black-Box-Test zur Überprüfung der Funktionalität<br />

Glass-Box-Test zur Überprüfung der Struktur<br />

Black- <strong>und</strong> Glass-Box-Test ergänzen einander<br />

Testen ist wichtig!<br />

483 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Programmpfadüberdeckung<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Überdeckungskriterium für Programmkomponenten<br />

alle möglichen Ausführungssequenzen von Programmeinheiten<br />

werden mindestens einmal durchlaufen<br />

482 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong><br />

Programmiersprachen<br />

Editoren<br />

Versionskontrolle<br />

Quellcode erzeugen / anpassen<br />

Fehlersuche<br />

Dokumentationserstellung<br />

Test<br />

Weiterführende Literatur<br />

Motivation<br />

Testarten<br />

Testbare Eigenschaften<br />

Testablauf<br />

Regressionstest<br />

Black-Box-Test<br />

Glass-Box-Test<br />

Zusammenfassung<br />

Quelle: Skript zur Vorlesung “Software-Engineering” (Stand:<br />

Mai 1997)<br />

Prof. Dr. rer. nat. Jochen Ludewig<br />

http://www.iste.uni-stuttgart.de/se/se.html<br />

484 Martin Barbisch, Ursula Vollmer <strong>Effizientes</strong> <strong>Programmieren</strong> - <strong>Methoden</strong> <strong>und</strong> <strong>Werkzeuge</strong>

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!