![Page 1: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/1.jpg)
Software Engineering
Software Engineering2. Best Practices -‐ Lesbaren Code schreiben
Jonathan BrachthäuserTeilweise basierend auf Folien von Gabriele Täntzer und Klaus Ostermann
![Page 2: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/2.jpg)
Software Engineering
Einordnung
2
!
Lösung
"Entwurf
Realisierung -‐ Programmierrichtlinien -‐ Code Smells -‐ Dokumentation -‐ Refactorings
#
Problem
$Anforderung
Anforderungsermittlung -‐ (Nicht-‐)funktionale Anf. -‐ Anwendungsfälle -‐ Userstories
Modellierung -‐ UML -‐ OO-‐Design -‐ Design / Architektur Patterns -‐ SOLID Design Prinzipien -‐ GRASP
Continuous Delivery & Feedback
Testing
/ TDD /
BDD
![Page 3: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/3.jpg)
Software Engineering3
Literaturhinweis
![Page 4: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/4.jpg)
Einführung in die Softwaretechnik
Warum ist lesbarer Quelltext wichtig?
4
![Page 5: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/5.jpg)
Software Engineering5
Programme für Menschen} Privater und öffentlicher Quelltext } Team } Wartung } Wiederverwendung
![Page 6: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/6.jpg)
Software Engineering6
Warum} Der Evolutionsanteil an Softwareentwicklung wird immer höher
} "80% der Kosten im Lebenszyklus einer Software entfallen auf die Wartung."
} "Faktor 2 bis 100, je nach Anwendung" (Sommerville, 2001) } "1976 – 1998: Wartungskosten mehr als 67%" (Schach, 2003)
} Softwareentwickler im Projekt wechseln und neue Entwickler müssen sich einarbeiten} Bevor eine Software neu geschrieben wird sitzen durchschnittlich 10 “Generationen” Wartungsprogrammierer daran. (Parikh, Zvegintzov 1983)
} Wartungsprogrammierer verbringen durchschnittlich 50% ihrer Zeit damit Quelltext zu verstehen. (Fjeldstad & Hamlen, 1983; Standish, 1984)
![Page 7: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/7.jpg)
Software Engineering7
Wartungskosten
Jussi Koskinen, http://users.jyu.fi/~koskinen/smcosts.htm
![Page 8: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/8.jpg)
Software Engineering8
Warum verständlichen Code schreiben?} Verständlichkeit (Teamwork, Wartung)
} Fehlerrate (nachvollziehen was passiert = Fehler gleich vermeiden)
} Debugging (leichter verstehen = leichter Fehler finden)} Änderbarkeit (Änderungen verlieren ihren Schrecken)} Wiederverw. (lesbaren Code kann man leichter wiederverwenden)
} Entwicklungszeit (aus allem hiervor)
} Produktqualität (aus allem hiervor)
![Page 9: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/9.jpg)
Software Engineering9
Zitat
“Falls du glaubst du brauchst keinen lesbaren Quelltext schreiben, weil ihn eh niemand anderes angucken wird, verwechsle nicht Ursache und Wirkung.”
(Steve McConnell)
![Page 10: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/10.jpg)
Software Engineering
Lesbaren Code Schreiben
![Page 11: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/11.jpg)
Software Engineering11
Developer debugging his own code after a month Sir Joseph Noel Paton, 1861 Oil on canvas Frei nach http://classicprogrammerpaintings.com/
![Page 12: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/12.jpg)
Software Engineering12
Lesbaren Code Schreiben} Entwicklungsrichtlinien } Namenswahl } Magische Zahlen } Selbstdokumentierender Code
![Page 13: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/13.jpg)
Software Engineering13
Entwicklungsrichtlinien} Konstruktive Qualitätssicherungsmaßnahme } Für alle Phasen des Entwicklungsprozesses nötig
} Programmtextebene (Namenskonventionen, Code Layout, ...) } Auf Ebene der Modellierung (Modellierungskonventionen, Architekturentscheidungen)
} Gestaltungsrichtlinien (für graphische Oberflächen) } Auf Prozessebene (Pull-‐Request Workflow, ...)
} Werden beeinflusst von: } Firmenphiliosophie } Entwicklerteam } Entwicklungsumgebung (d.h. verwendete Sprachen, Plattformen)
} Können teilweise automatisch erzwungen werden (Linter)
![Page 14: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/14.jpg)
Software Engineering14
Namenskonventionen} Konventionen erhöhen Lesbarkeit } Erlauben direkte Unterscheidung von Klassen, Methoden, Variablen, Konstanten, ...
package MeinPackage;
public class calculate { final static int zero=0; public void POWER(int x, int y) { if (y<=zero) return 1; return x*this.POWER(x,y-1); } public void handleincomingmessage() {} }
![Page 15: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/15.jpg)
Software Engineering15
Beispiel: Java-‐Namenskonventionen} Klassennamen:
} Substantive in "CamelCase" } Klassennamen sollten einfach und beschreibend sein } Ganze Wörter verwenden, keine Abkürzungen, außer gebräuchliche, dabei erster Buchstabe groß (z.B. Gui, Html, Uml)
} Methodennamen: } Verb oder Verbalphrase in "camelCase" } Schwache Verben vermeiden (z.B. "handleCalculation") } Prädikate beginnen mit "is", z.B. "isEmpty()"
![Page 16: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/16.jpg)
Software Engineering16
Namenswahl} Konventionen abhängig vom Ökosystem } Tipp: Etablierte Bibliotheken als Inspiration
Bedeutung Möglicher Name Negativ BeispielAnzahl Studenten pro Vorlesung numberOfStudents i,c,spc,students, students1
Aktuelles Datum currentDate cd,c,date,current,x
Pausieren und Wiederaufnahme eines Spieles
pause/resume pause/unpause,stop/unpause,off/start
Datenbankergebnis studentList, students databaseresult, data, input
![Page 17: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/17.jpg)
Software Engineering17
Namenswahl} So spezifisch wie möglich } Problemorientiert, statt Lösungsorientiert
} "Was" statt "Wie" } z.B. employee statt inputRecord, printerReady statt bitFlag
} Namenskonventionen können helfen } Aus dem Ökosystem, sowie Projektspezifische } Sollten dokumentiert sein
} Mehrdeutigkeiten vermeiden } Paare von Methoden sollten sprachlich passen
} on/off, pause/resume, undo/redo
} Namenslänge proportional zum Scope } Methodennamen sollten die vollständige Tätigkeit abdecken
} Wenn mehrere Tätigkeiten, dann Indiz für Refactoring
![Page 18: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/18.jpg)
Software Engineering18
Magische Zahlen
for (Event event : events) { if (event.startTime > now && event.startTime < now + 86400) { event.print(); } }
... status == 1 ...
if (key == 'D') key = 'A';
for (int i=0; i < min(20, data.length); i++)
![Page 19: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/19.jpg)
Software Engineering19
Entzauberte Zahlen
for (Event event : events) { if (event.startTime > now && event.startTime < now + SECS_PER_DAY) { event.print(); } }
... status == OPEN ...
if (key == DELETE) key = APPROVE;
for (int i=0; i < min(MAX_ROWS, data.length); i++)
![Page 20: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/20.jpg)
Software Engineering20
Selbstdokumentierender Code} Guter Quellcode benötigt gar keine oder nur wenige Kommentare } Zumindest innerhalb von Methoden/Funktionen } Bei der Dokumentation von APIs kann jedoch eine informelle Spezifikation sinnvoll sein.
} Kommentare können sogar schaden } Beste Quellcode-‐Dokumentation durch
} gute Variablen-‐ und Methodennamen } geringe Komplexität
![Page 21: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/21.jpg)
Software Engineering21
Selbstdokumentierender Code vs. Kommentare
/* if operation flag is 1 */ if (opFlag == 1) ...
/* if operation is “delete all” */ if (opFlag == 1) ...
/* if operation is “delete all” */ if (operationFlag == DELETE_ALL) ...
if (operationFlag == DELETE_ALL) ...
![Page 22: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/22.jpg)
Software Engineering22
Selbstdokumentierender Code (Beispiel 2)
for (Event event : events) { if (event.startTime > now && event.startTime < now + SECS_PER_DAY) { event.print(); } }
![Page 23: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/23.jpg)
Software Engineering23
Selbstdokumentierender Code (Beispiel 2)
boolean isInFuture(Event event) { return event.startTime > now; } boolean isWithinOneDay(Event event) { return event.startTime < now + SECS_PER_DAY; }
for (Event event : events) { if (isInFuture(event) && isWithinOneDay(event)){ event.print(); } }
![Page 24: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/24.jpg)
Software Engineering24
Selbstdokumentierender Code (Beispiel 2)
boolean isInFuture(Event event) { return event.startTime > now; } boolean isWithinOneDay(Event event) { return event.startTime < now + SECS_PER_DAY; }
events.filter(e -> isInFuture(e)) .filter(e -> isWithinOneDay(e)) .forEach(e -> print(e));
Noch mehr sprechende Abstraktion mit Java-‐8 Streams.
Was denken Sie über die Wahl des Variablennamens "e"?
![Page 25: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/25.jpg)
Software Engineering25
Selbstdokumentierender Code (Beispiel 3)
void Update () { if (!paused) { Time.timeScale = Time.timeScale * timeModificator; if (Time.timeScale > 1 || Time.timeScale < minTimescale) { timeModificator = 1; } } }
timeModificator liegt entweder zwischen 0 und 1 (verlangsamen), oder > 1 (beschleunigen)
![Page 26: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/26.jpg)
Software Engineering26
Selbstdokumentierender Code (Beispiel 3)
void Update () { if (paused) return;
if (tooFast() || tooSlow()) { stopAcceleration() } }
![Page 27: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/27.jpg)
Software Engineering
Dokumentation
![Page 28: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/28.jpg)
Software Engineering28
Developers look for documentation in legacy system Jean-François Millet, 1857 Oil on canvas http://classicprogrammerpaintings.com/
![Page 29: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/29.jpg)
Software Engineering29
Exkurs: Kommentare im Apollo 11 Lander
# Page 801 CAF TWO # WCHPHASE = 2 TS WCHPHOLD TS WCHPHASE TC BANKCALL # TEMPORARY, I HOPE HOPE HOPE CADR STOPRATE # TEMPORARY, I HOPE HOPE HOPE
Quelle: https://github.com/chrislgarry/Apollo-‐11/blob/master/Luminary099/LUNAR_LANDING_GUIDANCE_EQUATIONS.agc
![Page 30: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/30.jpg)
Software Engineering30
} (1) Schreibe aus der Sicht des Lesers } (2) Vermeide unnötige Wiederholungen } (3) Vermeide Mehrdeutigkeiten } (4) Verwende eine Standardstrukturierung } (5) Halte Begründungen für Entscheidungen fest } (6) Halte Dokumentation aktuell, aber nicht zu aktuell } (7) Überprüfe Dokumentation auf ihre Gebrauchstauglichkeit
Die 7 Regeln für gute Dokumentation
Quelle: http://www.embarc.de/die-‐sieben-‐regeln-‐fuer-‐gute-‐dokumentation-‐in-‐stein-‐gemeisselt-‐tafel-‐1-‐von-‐3 nach Documenting Software Architectures: Views and Beyond – Clements et al. (2002)
![Page 31: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/31.jpg)
Software Engineering31
(1) Schreibe aus der Sicht des Lesers
} Wer sind die Leser (Zielgruppenanalyse)? } Was interessiert die Leser?
} z.B. Nutzer einer API } Ersten Schritte (Installation, Konfiguration, notwendige Abhängigkeiten etc.)
} Grundlegende Benutzung (Häufigste Nutzung anhand von Beispielen)
} Wichtige Domänenkonzepte und Zusammenhänge, sowie Übersetzung in Source Code
} API Dokumentation (Nachschlagewerk, z.B. was sind die Randbedingungen für jede einzelne Klasse / Methode)
![Page 32: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/32.jpg)
Software Engineering32
(1) Schreibe aus der Sicht des Lesers
} Wer sind die Leser (Zielgruppenanalyse)? } Was interessiert die Leser?
} z.B. Entwickler, verantwortlich für Wartung } Ersten Schritte (Installation, Konfiguration, notwendige Abhängigkeiten etc.)
} Hinweise zum Debugging (Komandozeilenbefehle, Konfigurationen, Beispielcode)
} Getroffene Designentscheidungen (z.B. Abweichungen vom Standard, in Kauf genommene Nachteile)
} API Dokumentation
![Page 33: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/33.jpg)
Software Engineering33
(2) Vermeide unnötige Wiederholungen
} Spart dem Leser Zeit und unnötigen Wartungsaufwand } Über Wiederholungen (textuell) Abstrahieren (DRY) } Wiederholungen an einer Stelle ausreichend erklären, dann nur noch darauf verweisen } Die meisten Dokumentationsgeneratoren unterstützen Verweise
} z.B. Wenn es Standards im Projekt gibt, diese an zentraler Stelle erläutern und nur Abweichungen vom Standard dokumentieren
} Macros erlauben Textausschnitte an verschiedenen Stellen wiederzuverwenden, ohne diese zu kopieren
![Page 34: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/34.jpg)
Software Engineering34
(3) Vermeide Mehrdeutigkeiten
} Kategorisieren des Wortschatzes in drei Teilbereiche } Allgemeiner Wortschatz } Domänenspezifischer Wortschatz } Technischer Wortschatz
} Zuweisung in einen Teilbereich sollte stets eindeutig sein } Für die gleiche Bedeutung sollte immer das gleiche Wort gewählt werden (insb. für Domäne und Technik)
} Standardbegriffe vorziehen } Leser hat i.d.R. keine Zeit: subtile Unterschiede vermeiden } Möglichkeit zum Nachlesen bieten (z.B. Glossar, Verweise)
![Page 35: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/35.jpg)
Software Engineering35
(4) Verwende eine Standardstrukturierung
} Standards helfen dem Lesenden Zeit zu sparen } Standards machen dem Autor evtl. notwendige Details bewusst } Gilt auf verschiedenen Ebenen
} Externe Architektur Dokumentation (z.B. arc42) } API Dokumentation (z.B. Javadoc) } Sogar auf Satzbauebene ("Instances of <CLASS> represent ...")
* Returns a list iterator over the elements in this * list (in proper sequence). * * <p>The returned list iterator is * <a href="#fail-fast"><i>fail-fast</i></a>.</p> * * @see #listIterator(int) */ public ListIterator<E> listIterator() {...}
Kurzbeschreibung (ca. 1 Satz)
Optionale längere Beschreibung
Verweise
![Page 36: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/36.jpg)
Software Engineering36
Exkurs: Kommentare für Methoden
} Wenn sinnvoll (siehe auch selbstdokumentierender Code) } 1 bis 2 Sätze
} Intention der Methode beschreiben } "Was macht die Methode", nicht "Wie macht sie es" } lieber Methode teilen, wenn mehrere Verantwortlichenkeiten
} Grenzen der Methoden dokumentieren } Vor-‐ und Nachbedingungen } z.B. nur positive Eingabewerte
![Page 37: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/37.jpg)
Software Engineering37
(5) Halte Begründungen für Entscheidungen fest
} Source Code Intern (z.B. API Dokumentation) } Source Code Extern
} Architekturdokumentation (z.B. Confluence, github Wiki) } Diskussionen im Issuetracker (z.B. JIRA , github Issues)
![Page 38: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/38.jpg)
Software Engineering38
(5) Halte Begründungen für Entscheidungen fest
Quelle: Softwarearchitekturen dokumentieren und kommunizieren – Stefan Zörner (2012)
![Page 39: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/39.jpg)
Software Engineering
Inserzons (LOC) Delezons (LOC)
39
(6) Halte Dokumentation aktuell, aber nicht zu aktuell
} Dokumentation veraltet sehr schnell } Designentscheidungen werden revidiert } Refactorings werden durchgeführt } Neue Anwendungsfälle werden implementiert } Fehler werden behoben und der Code wird verändert
} Unterschiedliche Entwicklungsphasen -‐> Unterschiedlicher Dokumentationsanspruch
![Page 40: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/40.jpg)
Software Engineering40
(6) Halte Dokumentation aktuell, aber nicht zu aktuell
} Keine Ausrede, um gar nicht zu dokumentieren } Eher Argument für knappe (DRY) und treffende Dokumentation } Besser abstrahieren: Details die schnell veralten nicht erwähnen, eher Struktur beschreiben
} Durchgehend wichtig: Selbstdokumentierender Code
![Page 41: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/41.jpg)
Software Engineering41
Dokumentation aktuell halten
} Jede Änderung am Code kann Dokumentation invalidieren } Deshalb Aktualisierungen so einfach wie möglich machen:
} Dokumentation so nah wie möglich am Objekt der Beschreibung halten (z.B. im Quelltext)
} Rückverweise im Quelltext zu externer Dokumentation (z.B. "Diese Klasse kollaboriert mit Klasse B, wie in Dokument X beschrieben.")
} Dokumentation automatisch generieren } Aus Kommentaren im Source Code (z.B. Javadoc, ScalaDoc, ...) } Aus struktierten Textdateien (Literate Programming, readthedocs.io) } Erzeugen und Veröffentlichen der Dokumentation am besten vollautomatisch (bei jedem Commit / PR).
![Page 42: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/42.jpg)
Software Engineering42
Dokumentation automatisch generieren
Dokumentationsgeneratoren } Dokumentation aus Sourcecode
extrahieren } Source Code und Dokumentation
(Schnittstellendokumentation) zusammen in einer Datei
} Codestruktur beeinflusst Text } Idee: Source Code Artefakte wie
Klassen und Methoden werden mit besonderen Kommentaren dokumentiert } Spezielle Syntax erlaubt
automatisches Generieren } z.B. Javadoc, ScalaDoc, RDoc, ...
Literate Programming } Source Code aus Dokumentation
extrahieren } Source Code und Dokumentation
(Endbenutzerdoku) zusammen in einer Datei
} Textstruktur beeinflusst Code } Idee: Quelltext der Dokumentation
anpassen } Primär für den menschlichen Leser
schreiben } Sourcecode ist Sekundärartefakt
} z.B. Rocco, Docco, lhs2tex, tut, ...
![Page 43: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/43.jpg)
Software Engineering43
API-‐Dokumentation (Beispiel Javadoc)public interface Set<E> extends Collection<E> { /** * Returns <tt>true</tt> if this set contains the specified element. * More formally, returns <tt>true</tt> if and only if this set * contains an element <tt>e</tt> such that * <tt>(o==null ? e==null : o.equals(e))</tt>. * * @param o element whose presence in this set is to be tested * @return <tt>true</tt> if this set contains the specified element * @throws ClassCastException if the type of the specified element * is incompatible with this set (optional) * @throws NullPointerException if the specified element is null and this * set does not permit null elements (optional) */ boolean contains(Object o); …
![Page 44: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/44.jpg)
Software Engineering
public interface Set<E> extends Collection<E> { /** * Returns <tt>true</tt> if this set contains the specified element. * More formally, returns <tt>true</tt> if and only if this set * contains an element <tt>e</tt> such that * <tt>(o==null ? e==null : o.equals(e))</tt>. * * @param o element whose presence in this set is to be tested * @return <tt>true</tt> if this set contains the specified element * @throws ClassCastException if the type of the specified element * is incompatible with this set (optional) * @throws NullPointerException if the specified element is null and this * set does not permit null elements (optional) */ boolean contains(Object o); …
44
API-‐Dokumentation (Beispiel Javadoc)
![Page 45: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/45.jpg)
Software Engineering45
Literate Programming (Haskell Beispiel)
![Page 46: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/46.jpg)
Software Engineering46
Dokumentation aktuell halten
} Dokumentation automatisch überprüfen } Code Beispiele in Dokumentation sollten automatisch kompiliert und ausgeführt werden
} Änderungen im Code -‐> ggf. Fehler beim Erzeugen der Doku. } z.B. Scala: tut, Haskell: doctest
Here is how you add numbers: ```tut 1 + 1 ```
Eingabe (in Markdown)
Here is how you add numbers: ```scala scala> 1 + 1 res0: Int = 2 ```
Generierte Ausgabe (in Markdown)
https://github.com/tpolecat/tut
![Page 47: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/47.jpg)
Software Engineering47
(7) Überprüfe Dokumentation auf ihre Gebrauchstauglichkeit
} Nur die Leserzielgruppe kann über Tauglichkeit entscheiden } Reviews mit Vertretern aus der Zielgruppe } Feedback direkt von Lesern erheben, sammeln und auswerten } Lesern die Möglichkeit bieten, direkt Änderungen vorzuschlagen oder durchzuführen
![Page 48: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/48.jpg)
Software Engineering48
Zusammenfassung: Dokumentation
} Ziel von Dokumentation: Leser können effizient und effektiv Informationen extrahieren
} Effizient: Wiederholungen vermeiden, Verwirrung vermeiden } Effektiv: Notwendige Information ist vorhanden und aktuell
![Page 49: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/49.jpg)
Software Engineering
Code Smells & Refactoring
![Page 50: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/50.jpg)
Software Engineering50
Programmers at work performing a major, unpaid refactoring Eero Järnefelt, 1893 Oil on canvas Frei nach http://classicprogrammerpaintings.com/
![Page 51: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/51.jpg)
Software Engineering51
Was sind Bad Code Smells?} Kondensierung von Erfahrungswissen } verdächtige Code-‐Stellen } Anhaltspunkte für mögliche Schwachstellen / Verbesserungspotenzial
} sollten evtl. durch Refactoring behoben werden } Häufig rein syntaktisch oder basierend auf Code-‐Metriken (z.B. LoC, Anzahl von abhängigen Klassen etc.) } automatisiert erkennbar durch statische Analyse
Erweiterte Liste an Code Smells mit automatischer Erkennung durch statische Analyse: http://findbugs.sourceforge.net/bugDescriptions.html
![Page 52: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/52.jpg)
Software Engineering52
Was ist ein Refactoring?
“Refactoring ist der Prozess, ein Softwaresystem so zu verändern, dass das externe Verhalten unverändert bleibt, der Code aber eine bessere Struktur erhält.”
(Martin Fowler)
![Page 53: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/53.jpg)
Software Engineering53
Was ist ein Refactoring?} “... dass das externe Verhalten unverändert bleibt ...” } Abhängig von der Grenze zwischen intern/extern } Grenzen häufig zwischen verschiedenen Rollen:
} Endnutzer(in)/Programmierer(in) } API-‐Nutzer(in)/API-‐Implementierer(in) } Modul-‐Tester(in)/Modul-‐Implementierer(in)
} Interfaces (z.B. in Java) ermöglichen Repräsentation der Grenze im Code
![Page 54: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/54.jpg)
Software Engineering54
Was ist ein Refactoring?} “... dass das externe Verhalten unverändert bleibt ...” } Extern nicht sichtbar -‐> kann geändert werden } "Sichtbar" kann heißen
} durch manuelles Beobachten in der entsprechenden Rolle } durch automatisches Testen (kann auch Zeit-‐/Speicher/IO-‐Verhalten einschließen)
} Sicherstellen durch Tests (automatisiert!) } Bedeutung sollte sich nicht ändern, analog zu algebraischen Umformungen
![Page 55: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/55.jpg)
Software Engineering55
Warum Refactoring?} Beheben von Code Smells } Lesbarkeit / Übersichtlichkeit / Verständlichkeit
} Reduktion vom Komplexität, z.B. Aufteilen von Methoden } Bewusste Benennung von Variablen, Methoden, …
} Wiederverwendung / Entfernen von Redundanz } z.B. Methoden aufteilen um Teile wiederzuverwenden } Kopierte Quelltextfragmente in eine Methode extrahieren
} Erweiterbarkeit und Testen } später mehr dazu
Literaturhinweis (inkl. Liste an Smells und Refactorings): Martin Fowler, "Refactoring" (2005)
![Page 56: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/56.jpg)
Software Engineering56
Refactoring Beispielclass Person { String name; String street; String houseNumber; String zipCode; String city; ... }
Literaturhinweis zu Datenmodellierung: http://spaceninja.com/2015/12/07/falsehoods-‐programmers-‐believe
class Company { String name; String street; String houseNumber; String zipCode; String city; ... }
class Person { Address address; ... }
class Company { Address address; ... }
class Address { String name; String street; String houseNumber; String zipCode; String city; ... }
![Page 57: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/57.jpg)
Software Engineering57
Refactoring
} Schwächen im Quelltext } Aus Erfahrung festgehalten } Einteilung in:
} Klasseninterne Smells } Klassenübergreifende Smells
} Rezepte zur Verbesserung } Manuelles Vorgehen und Automatisierung möglich
} Besteht aus: } Name } Motivation } Vorgehen } Beispiele
Zuordnung: welches Refactoring hilft bei welchem Code Smell
Code Smell
Code Smell vs. Refactoring
![Page 58: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/58.jpg)
Software Engineering58
Klasseninterne Bad Smells} Beispiele: } Lange Methode } Doppelter Code } Lange Parameterliste } Kommentare } Temporäre Felder } Switch-‐Befehle } ...
![Page 59: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/59.jpg)
Software Engineering59
Beispiel 1: Lange Methode} Vermeiden von "Spaghetti Code" } Extrahieren statt Kommentieren } Ideale Methodenlänge ist abhängig von: } Ökosystem } Informationsdichte
} üblicherweise ca. 1-‐50 Zeilen } Refactoring: Methode Extrahieren
![Page 60: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/60.jpg)
Software Engineering60
Extract Method – Vorgehen1. Neue Methode anlegen – sinnvollen Namen vergeben 2. Zu extrahierenden Code in die neue Methode kopieren 3. Zugriffe auf lokale Variablen suchen -‐> als Parameter
übergeben 4. Temporäre Variablen nur in Fragment benutzt -‐> in
neuer Methode anlegen 5. Werden lokale Variablen verändert? -‐> Rückgabewert
der neuen Methode 6. Originalquelltext mit Methodenaufruf ersetzen
![Page 61: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/61.jpg)
Software Engineering61
Extract Method – Bedingungen (Auszug)} Extrahierter Code muss ein oder mehrere komplette Statements sein
} Maximal auf eine lokale Variable (die später benutzt wird) wird schreibend zugegriffen
} Bedingtes return-‐Statement verboten } Break und Continue verboten, wenn das Ziel außerhalb des zu extrahierenden Code liegt
![Page 62: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/62.jpg)
Software Engineering62
Beispiel 2: Doppelter Code} sehr häufiger Code Smell } Grund häufig: Copy-‐and-‐Paste
} ermöglicht schnelle Wiederverwendung } führt evtl. Fehler ein, wenn nicht an Kontext angepasst } erhöhter Wartungsaufwand
} Mögliche Refactorings } Klasse extrahieren } Methode extrahieren } Methode nach oben verschieben } Template Methode bilden
![Page 63: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/63.jpg)
Software Engineering63
Beispiel 2: Doppelter Codevoid valuesChanged() { speedModifier = model.speedModifier; if (lastSpeedModifier != speedModifier) { model.component.speedModifier = speedModifier; lastSpeedModifier = speedModifier; }
distance = model.distance; if (lastDistance != distance) { model.component.distance = distance; lastDistance = distance; }
showAnimations = model.showAnimations; if (lastShowAnimations != showAnimations) { model.component.showAnimations = showAnimations; lastShowAnimations = showAnimations; } }
![Page 64: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/64.jpg)
Software Engineering64
Beispiel 2: Doppelter Codeabstract class Cache<T> { T lastValue; void update(T newValue) { if (lastValue != newValue) { onChange(lastValue, newValue); lastValue = newValue; } } abstract void onChange(T oldValue, T newValue); }
![Page 65: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/65.jpg)
Software Engineering65
Klassenübergreifende Bad Smells} Beispiele: } Große Klassen } (Methoden-‐)Neid } Nachrichtenketten } Verweigertes Erbe } Datenhaufen } Faule Klasse } ...
![Page 66: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/66.jpg)
Software Engineering66
Beispiel 1: Große Klassen
vorher
![Page 67: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/67.jpg)
Software Engineering67
Beispiel 1: Große Klassen
nachher
![Page 68: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/68.jpg)
Software Engineering68
Beispiel 2: (Methoden/Daten-‐)Neid} Klassen enkapsulieren Daten und Verhalten } Verdächtig: eine Methode, die auf mehr auf Daten / Methoden einer anderen Klasse zugreift, als auf die eigenen
} Mögliche Refactorings } Methode verschieben } Methode aufteilen } Feld verschieben
![Page 69: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/69.jpg)
Software Engineering69
Automatisierte Refactorings} Viele Entwicklungsumgebungen automatisieren Refactorings
} Ursprung in Smalltalk und IntelliJ
![Page 70: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/70.jpg)
Software Engineering70
Refactorings Allgemein} Refactoring als allgemeines Konzept } Auch große Refactorings in ganzen Klassenhierarchien } Für viele Sprachen und Modelle, auch sprachübergreifend } Änderung von Softwaredesign
} Fundamental für einige Softwaretechnikansätze } Schnell erste Quelltextversion schreiben, später umstrukturieren
} Software wächst, Umstrukturieren wird fast immer nötig sein } Nur möglich mit geeigneten Interfaces
![Page 71: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/71.jpg)
Software Engineering
Coding Practices
![Page 72: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/72.jpg)
Software Engineering
Crowd of maintainers sentencing developers for not following good coding practices Grigoriy Myasoyedov, 1897 Oil on canvas Frei nach http://classicprogrammerpaintings.com/
![Page 73: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/73.jpg)
Software Engineering73
DRY -‐ Don't Repeat Yourself} Als ProgrammiererIn stehen uns zwei wesentliche Werkzeuge zur Verfügung } Abstraktion } Automation
} DRY kann man entsprechend auf zwei Weisen interpr. } Wiederhole Dich nicht in Programmcode } Wiederhole Dich nicht in einer Tätigkeit
} Wiederholung ist in beiden Fällen ein Bad Smell
![Page 74: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/74.jpg)
Software Engineering74
DRY -‐ Don't Repeat Yourself
Quelle: https://xkcd.com/1205/
![Page 75: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/75.jpg)
Software Engineering75
KISS – Keep it simple stupid (Premature Abstraction)} Wann ist welche Abstraktion angemessen? } Abhängig vom Projektumfeld & Anforderungen } Nicht: Persönlicher Geschmack!
fac n = if n == 0 then 1 else n * fac (n-1)
refold c n p f g = fold c n . unfold p f g fac = refold (*) 1 (==0) id pred
fac n = product [1..n]
Quelle: https://www.willamette.edu/~fruehr/haskell/evolution.html
![Page 76: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/76.jpg)
Software Engineering76
Premature Optimization
“We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities
in that critical 3%.” (Donald Knuth)
![Page 77: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/77.jpg)
Software Engineering77
Premature Optimization} Häufig sind low-‐level Optimierungen zunächst zu vernachlässigen, erhöhen aber den Wartungsaufwand
} Eine genaue Beschreibung der erwarteten Performance sollte Teil der Anforderungen sein
} Erfüllbarkeit der Anforderungen im Blick behalten } "Back of the envelope calculations" } Frühe Performancetests der einzelnen Komponenten auf echten Beispielen
} Frühe (und wiederholte) Lasttests auf einer Testinfrastruktur, die möglichst nah am Produktivsystem ist
} Nicht: Optimierungen für Probleme vornehmen, die noch gar nicht aufgetreten sind
![Page 78: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/78.jpg)
Software Engineering78
NIH – "Not invented here" und Komplizen
} Abzuwägen: In manchen Fällen ist Neuentwicklung tatsächlich wichtig } Deshalb, stattdesse:
} "Know your tools" – Lieber existierende Lösungen recherchieren. } Existierende Lösungen können angepasst werden: Fragen und/oder Forken } Neuentwicklung erst nach ausreichender Recherche
} Randnotiz: Bei Wiederverwendung von Bibliotheken immer einen Paketmanager verwenden und das "Bauen" (d.h. den Erstellungsprozess) automatisieren (z.B. mit make, Ant, sbt, rake, ...)
"Viel zu kompliziert, so schwer kann das nicht sein..." "Schneller neu-‐programmiert,
als Doku gelesen..."
![Page 79: 2.)BestPractices)4)Lesbaren)Code)schreibenps.informatik.uni-tuebingen.de/teaching/ss17/se/02-Best-Practices.pdf · Software)Engineering Einordnung 2! Lösung " Entwurf Realisierung)](https://reader030.vdocuments.pub/reader030/viewer/2022041202/5d4cea4388c9930e558b738c/html5/thumbnails/79.jpg)
Software Engineering
Erinnerung
Nächste Woche: Gastvortrag von Amra Avdic (NovaTec GmbH)