Effizientes Programmieren - Methoden und Werkzeuge ...
Effizientes Programmieren - Methoden und Werkzeuge ...
Effizientes Programmieren - Methoden und Werkzeuge ...
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>