SlideShare ist ein Scribd-Unternehmen logo
1 von 73
Downloaden Sie, um offline zu lesen
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
• XDEV Software Weiden ☺
• xdev-software.de
• 15+ years full stack
• RapidClipse committer
• rapidclipse.com
• MicroStream committer
• microstream.one
• Loves
• Clean Code | Agile stuff
• JUG Oberpfalz | JCON
Richard Fichtner
@RichardFichtner
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Java User Group Oberpfalz
Das sind die Quellen
http://jug-oberpfalz.de/
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
https://jcon.one/
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Kunden und Partner
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
MicroStream is a
completely new written Serialization for
Java
Download free:
www.microstream.one
Free support:
MicroStream Community Forum
www.microstream.one
Twitter: @microstreamOne
MicroStream - Java Native Data Store
Create ultra-fast In-Memory Database Applications.
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Agenda
▪Warum Clean Code?
▪3 Stufen von Clean Code
▪Code Smells
▪Beispiele aus über 15 Jahren Kampf um / mit Clean Code
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Kostenverteilung im Software Lebenszyklus
Quelle: Schach, S. R., 1999. Software Engineering. Fourth Edition Hrsg. Boston: McGraw-Hill
Glass, R. L., 2001. Frequently Forgotten Fundamental Facts about Software Engineering. IEEE Software, Issue May/June, pp. 110-112.
7%
6%
12%
8%
40%
16%
11%
67%
SOFTWARE LIFECYCLE
Requirements Engineering Design Programming
Integration Enhancements Migration
Bug Fixes
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Entwicklung und Wartung
0%
100%
200%
Entwicklung Wartung
Code schreiben Code lesen
Quelle: Parikh, G. & Zvegintzov, N., 1983. Tutorial on software maintenance. s.l.:IEEE Computer Society Press.
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Kostenverteilung im Software Lebenszyklus
Quelle: Schach, S. R., 1999. Software Engineering. Fourth Edition Hrsg. Boston: McGraw-Hill
Glass, R. L., 2001. Frequently Forgotten Fundamental Facts about Software Engineering. IEEE Software, Issue May/June, pp. 110-112.
0% 20% 40% 60% 80% 100%
Gesamt
Wartung
Code Verstehen
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Das sind die Quellen
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Keinen Code schreiben
Tools verwenden:
▪Code Generatoren
▪Modellgetrieben
▪UI Builder
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
CSV Import?!
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
make or buy?
Make Buy / Use
Code Qualität
Tests
Dokumentation
Preis / Leistung
Spezialisierung
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Copy & Paste vs. Reuse
▪DRY (Don‘t Repeat Yourself)
▪“three strikes and you refactor”
Original Copy 1 Copy 2
Quelle: Martin Fowler , Kent Beck , John Brant: Refactoring: Improving the Design of Existing Code
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Design Pattern / Entwurfsmuster
Quelle: ModelViewControllerDiagram.svg: Traced by User:Stannered derivative work: Davjoh (talk) - ModelViewControllerDiagram.svg
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Design Pattern / Entwurfsmuster
bewährte Lösungsschablonen für wiederkehrende
Entwurfsprobleme
Ein gutes Muster sollte
▪ ein oder mehrere Probleme lösen,
▪ ein erprobtes Konzept bieten,
▪ auf realen Designs basieren
Quelle: http://de.wikipedia.org/wiki/Entwurfsmuster
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Quelle: 2008 Focus Shift / OSNews / Thom Holwerda http://www.osnews.com/comics
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Was ist sauberer Code?
▪Code ohne Compiler-Fehler?
▪Code ohne Warnings?
▪Code nach bestimmter Formatierung?
Definitionssache!?
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Was ist nicht sauberer Code?
„Unter Code-Smell versteht man in der
Programmierung ein Konstrukt, das eine
Überarbeitung des Programm-Quelltextes
nahelegt.“
Quelle: Martin, Robert C. (2009). "17: Smells and Heuristics". Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall. ISBN 978-0-13-235088-4.
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Code Smells
▪Überholte Kommentare
▪Auskommentierter Code
▪Tote Funktionen / Code
▪Funktionen mit vielen Parametern
▪Funktionen mit Flag-Parameter
▪Magic-Numbers
▪…
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Wer warnt mich?
▪(Java) Compiler
▪PMD
▪Checkstyle
▪FindBugs / SpotBugs
▪SonarQube / SonarLint
▪u.v.m.
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Aufgeben?
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Zero Warning Policy
▪Warnings weisen auf Probleme hin
▪Nicht alle Warnings sind immer ein Problem
▪Warnings lassen sich konfigurieren
▪Nur noch relevante Warnings anzeigen lassen
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Kosten von Änderungen / Bugs
0
20
40
60
80
100
120
Requirements Design Code Test Production
hoursofwork
Phase detected
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Struktur und Namensgebung
▪API unmissverständlich gestalten
LocalDate now = LocalDate.now();
LocalDate future = now.add(7);------------------------------
LocalDate future = now.addDays(7);
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
?!
var mystery =
FloatFactoryFactory.getInstance(FloatFactoryFactory.
defaultInstanceDescriptionString).getFactory(
Locale.getLocale("en-US")).createBuilder().setString("1.5").
getResult();
var mystery = 1.5F;
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
?!
if ((method.getName().startsWith("get")
|| method.getName().startsWith("is")) &&
(method.getName().substring(3).
toUpperCase().equals(
fieldName.toUpperCase()) ||
method.getName().substring(2).
toUpperCase().equals(fieldName.
toUpperCase())) {
// [MY_CODE]
}
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
?
if(method.getName().startsWith("get")) {
if(method.getName().substring(3).toUpperCase().
equals(fieldName.toUpperCase())) {
// [MY_CODE]
}
} else if(method.getName().startsWith("is")) {
if(method.getName().substring(2).toUpperCase().
equals(fieldName.toUpperCase())) {
// [MY_CODE]
}
}
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Sag doch gleich was du willst …
if( isGetter(method) || isBooleanGetter(method) ) {
// [MY_CODE]
}
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Reading is more important
than writing
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Was ist mit altem Code (auskommentiert)?
▪Reduziert Übersichtlichkeit
▪Trügerische Sicherheit
▪ Es fehlen die Infos dazu
▪ Das Sourcecode Versionssystem hilft
▪Raus damit!
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Code Konventionen: Struktur
▪Code Formatter verwenden
▪ Zeichenlimit pro Zeile
▪ Leerzeilen / Leerzeichen
▪ Position von Klammern / Geschweiften Klammern
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Code Konventionen: Struktur
▪Bei if, else, for, while, IMMER geschweifte Klammern
schreiben
if(isValid())
save();
if(isValid())
save();
close();
if(isValid())
save();
close();
if(isValid()){
save();
close();
}
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Code Konventionen: Struktur
▪Else Block immer schreiben oder nicht?
if(isValid()){
save();
close();
}
if(isValid()){
save();
close();
} else {
// Nix zu tun :)
}
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Style Guide?
Quelle: https://xkcd.com/1513/
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Speicher tauschen
/*
* swap left and right
* elements for whole array
*/
for( i = 0; i < MAX_ELEMENTS; i++)
leftElement = left [ i ];
left[ i ] = right [ i ];
right [ i ] = leftElement;
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Rechenstunde
x = 3+4 * 2+7 = 63
x = (3+4) * (2+7) = 63
x = 3+ 4*2 +7 = 18
x = 3+ (4*2) +7 = 18
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Code Konventionen: Style
vusing adjhungarian nnotation vmakes nreading
ncode adjdifficult
▪Ungarische Notation mit Vorsicht genießen
▪ Insbesondere bei Sprachen mit statischer Typisierung
▪ Interfaces nicht mit einem vorangestellten "I" markieren
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Kommentare
Quelle: http://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered
// When I wrote this, only God and I understood
// what I was doing
// Now, God only knows
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Kommentare
▪Vorgehen kommentieren (Warum? und nicht Wie!)
// gibt 1 zurück
return 1;
[…]
i++; // i um eins erhöhen
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
if(person.age() >= 18){
[. . .]
// prüfen ob Person schon 18 ist
if(person.age() >= 18){
[. . .]
Kommentare
▪Vorgehen kommentieren (Warum? und nicht Wie!)
// Volljährigkeit prüfen
if(person.age() >= 18){
[. . .]
if(person.age() >= LEGAL_AGE){
[. . .]
if(person.age() >= country.getLegalAge()){
[. . .]
if(person.age() >=
country.getLegalAgeInYears()){
[. . .]
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Kommentare
▪Code Marker verwenden ( // TODO, FIXME)
// TODO: RF (2014-06-23) AWP-5486 Kommentar
// FIXME: RF (2014-06-23) AWP-8478 Kommentar
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Quelle: http://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered
/**
* Dear maintainer:
*
* Once you are done trying to 'optimize' this routine,
* and have realized what a terrible mistake that was,
* please increment the following counter as a warning
* to the next guy:
*
* total_hours_wasted_here = 42
*/
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Fehlermeldungen
ArrayIndexOutOfBoundsException:
Array index out of range
ArrayIndexOutOfBoundsException:
Array index 15 out of range
ArrayIndexOutOfBoundsException:
Array index 15 out of range [0:9]
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Quelle: Capers Jones, Chief Scientist Emeritus: Software Quality in 2002: A Survey of the State of the Art. Software Productivity Research an Artemis company
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Quelle: Capers Jones, Chief Scientist Emeritus: Software Quality in 2002: A Survey of the State of the Art. Software Productivity Research an Artemis company
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Review
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Review
▪Oft
▪Kurz
▪Informal
▪Frühes Feedback
▪Beidseitig
▪Selten
▪Lang
▪Formal
▪Spätes Feedback
▪Einseitig
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Gegenseitiger Austausch
Jedi Meister Jedi
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Review Benefits
▪Zone of Chaos vermeiden
▪Personalentwicklung
▪Verbesserung der Codebasis
▪Weniger Stress, mehr Haare am Kopf, mehr von der Rente ☺
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
Links
▪https://dev.to/bosepchuk/the-one-chart-every-developer-must-
understand-2db9
RICHARD FICHTNER
@RichardFichtner | r.fichtner@xdev-software.de
picture credits
All pictures in this presentation originate from pixabay.
This is a human-readable summary of the Pixabay License (read the full text).
You can use all images and videos published on Pixabay for free (except as set out below). You may
use them for commercial and non-commercial purposes, in altered and unaltered form. You don't
need to ask permission from or provide credit to the image author or Pixabay, although it is
appreciated when possible.
Cartoons:
▪ https://xkcd.com/1513/
▪ https://xkcd.com/844/

Weitere ähnliche Inhalte

Ähnlich wie Clean Code mit Fun und nicht cleanem Code aus 15 Jahren Software Entwicklung

Icinga 2: Integration von Graphite (Webinar vom 25.09.2014)
Icinga 2: Integration von Graphite (Webinar vom 25.09.2014)Icinga 2: Integration von Graphite (Webinar vom 25.09.2014)
Icinga 2: Integration von Graphite (Webinar vom 25.09.2014)NETWAYS
 
W-JAX 2013 Spring Batch - Performance und Skalierbarkeit
W-JAX 2013 Spring Batch - Performance und SkalierbarkeitW-JAX 2013 Spring Batch - Performance und Skalierbarkeit
W-JAX 2013 Spring Batch - Performance und Skalierbarkeittobiasflohre
 
BASTA! 2016 - Roslyn & Visual Studio Extensions
BASTA! 2016 - Roslyn & Visual Studio ExtensionsBASTA! 2016 - Roslyn & Visual Studio Extensions
BASTA! 2016 - Roslyn & Visual Studio ExtensionsRobin Sedlaczek
 
Giessen r user group treffen 10 05-2011 - foliensatz
Giessen r user group treffen 10 05-2011 - foliensatzGiessen r user group treffen 10 05-2011 - foliensatz
Giessen r user group treffen 10 05-2011 - foliensatzmasem research institute
 
GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!
GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!
GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!Robin Sedlaczek
 
REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...
REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...
REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...predic8
 
Architectures for .Net Core Applications
Architectures for .Net Core ApplicationsArchitectures for .Net Core Applications
Architectures for .Net Core ApplicationsRobin Sedlaczek
 
Magdeburger Developer Days 2018 - Das perfekte Anwendungsmodell
Magdeburger Developer Days 2018 - Das perfekte AnwendungsmodellMagdeburger Developer Days 2018 - Das perfekte Anwendungsmodell
Magdeburger Developer Days 2018 - Das perfekte AnwendungsmodellRobin Sedlaczek
 
BASTA! Spring 2017 - C# Script in Action
BASTA! Spring 2017 - C# Script in ActionBASTA! Spring 2017 - C# Script in Action
BASTA! Spring 2017 - C# Script in ActionRobin Sedlaczek
 
FMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang Wunderlich
FMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang WunderlichFMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang Wunderlich
FMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang WunderlichVerein FM Konferenz
 
BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?
BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?
BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?Robin Sedlaczek
 
ADC Core 2017 - Warum warten auf die IDE?
ADC Core 2017 - Warum warten auf die IDE?ADC Core 2017 - Warum warten auf die IDE?
ADC Core 2017 - Warum warten auf die IDE?Robin Sedlaczek
 
JavaScript-UI mit React
JavaScript-UI mit ReactJavaScript-UI mit React
JavaScript-UI mit Reactgedoplan
 
Vom Framework zur App - Ein Blick in das React-Ökosystem
Vom Framework zur App - Ein Blick in das React-ÖkosystemVom Framework zur App - Ein Blick in das React-Ökosystem
Vom Framework zur App - Ein Blick in das React-ÖkosystemPeter Hecker
 
FM2014: Einführung in Function Scripting by Thomas Hirt
FM2014: Einführung in Function Scripting by Thomas HirtFM2014: Einführung in Function Scripting by Thomas Hirt
FM2014: Einführung in Function Scripting by Thomas HirtVerein FM Konferenz
 
Webinar SAP/ABAP und Microsoft
Webinar  SAP/ABAP und MicrosoftWebinar  SAP/ABAP und Microsoft
Webinar SAP/ABAP und MicrosoftCadaxo GmbH
 
Logstash: Open Source Log-Management (Webinar vom 20.02.2014)
Logstash: Open Source Log-Management (Webinar vom 20.02.2014)Logstash: Open Source Log-Management (Webinar vom 20.02.2014)
Logstash: Open Source Log-Management (Webinar vom 20.02.2014)NETWAYS
 
BASTA! Spring 2018 - Architekturen für .NET Core-Anwendungen
BASTA! Spring 2018 - Architekturen für .NET Core-AnwendungenBASTA! Spring 2018 - Architekturen für .NET Core-Anwendungen
BASTA! Spring 2018 - Architekturen für .NET Core-AnwendungenRobin Sedlaczek
 

Ähnlich wie Clean Code mit Fun und nicht cleanem Code aus 15 Jahren Software Entwicklung (20)

Icinga 2: Integration von Graphite (Webinar vom 25.09.2014)
Icinga 2: Integration von Graphite (Webinar vom 25.09.2014)Icinga 2: Integration von Graphite (Webinar vom 25.09.2014)
Icinga 2: Integration von Graphite (Webinar vom 25.09.2014)
 
W-JAX 2013 Spring Batch - Performance und Skalierbarkeit
W-JAX 2013 Spring Batch - Performance und SkalierbarkeitW-JAX 2013 Spring Batch - Performance und Skalierbarkeit
W-JAX 2013 Spring Batch - Performance und Skalierbarkeit
 
BASTA! 2016 - Roslyn & Visual Studio Extensions
BASTA! 2016 - Roslyn & Visual Studio ExtensionsBASTA! 2016 - Roslyn & Visual Studio Extensions
BASTA! 2016 - Roslyn & Visual Studio Extensions
 
Giessen r user group treffen 10 05-2011 - foliensatz
Giessen r user group treffen 10 05-2011 - foliensatzGiessen r user group treffen 10 05-2011 - foliensatz
Giessen r user group treffen 10 05-2011 - foliensatz
 
GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!
GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!
GUI & DESIGN 2017 - Das perfekte Anwendungsmodell. UIs für jedes Device!
 
REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...
REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...
REST: Versprechen, Wirklichkeit & Alternativen: GraphQL, GRPC, JSON RPC...
 
Architectures for .Net Core Applications
Architectures for .Net Core ApplicationsArchitectures for .Net Core Applications
Architectures for .Net Core Applications
 
Magdeburger Developer Days 2018 - Das perfekte Anwendungsmodell
Magdeburger Developer Days 2018 - Das perfekte AnwendungsmodellMagdeburger Developer Days 2018 - Das perfekte Anwendungsmodell
Magdeburger Developer Days 2018 - Das perfekte Anwendungsmodell
 
BASTA! Spring 2017 - C# Script in Action
BASTA! Spring 2017 - C# Script in ActionBASTA! Spring 2017 - C# Script in Action
BASTA! Spring 2017 - C# Script in Action
 
FMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang Wunderlich
FMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang WunderlichFMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang Wunderlich
FMK2015: FrameWork Konzepte in FileMaker Pro by Wolfgang Wunderlich
 
Enterprise APEX
Enterprise APEXEnterprise APEX
Enterprise APEX
 
BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?
BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?
BASTA! 2017 Jubiläumskonferenz - Warum warten auf die IDE!?
 
ADC Core 2017 - Warum warten auf die IDE?
ADC Core 2017 - Warum warten auf die IDE?ADC Core 2017 - Warum warten auf die IDE?
ADC Core 2017 - Warum warten auf die IDE?
 
JavaScript-UI mit React
JavaScript-UI mit ReactJavaScript-UI mit React
JavaScript-UI mit React
 
Vom Framework zur App - Ein Blick in das React-Ökosystem
Vom Framework zur App - Ein Blick in das React-ÖkosystemVom Framework zur App - Ein Blick in das React-Ökosystem
Vom Framework zur App - Ein Blick in das React-Ökosystem
 
FM2014: Einführung in Function Scripting by Thomas Hirt
FM2014: Einführung in Function Scripting by Thomas HirtFM2014: Einführung in Function Scripting by Thomas Hirt
FM2014: Einführung in Function Scripting by Thomas Hirt
 
Webinar SAP/ABAP und Microsoft
Webinar  SAP/ABAP und MicrosoftWebinar  SAP/ABAP und Microsoft
Webinar SAP/ABAP und Microsoft
 
Logstash: Open Source Log-Management (Webinar vom 20.02.2014)
Logstash: Open Source Log-Management (Webinar vom 20.02.2014)Logstash: Open Source Log-Management (Webinar vom 20.02.2014)
Logstash: Open Source Log-Management (Webinar vom 20.02.2014)
 
BASTA! Spring 2018 - Architekturen für .NET Core-Anwendungen
BASTA! Spring 2018 - Architekturen für .NET Core-AnwendungenBASTA! Spring 2018 - Architekturen für .NET Core-Anwendungen
BASTA! Spring 2018 - Architekturen für .NET Core-Anwendungen
 
Web Applikations Security
Web Applikations SecurityWeb Applikations Security
Web Applikations Security
 

Clean Code mit Fun und nicht cleanem Code aus 15 Jahren Software Entwicklung

  • 1. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 2. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de • XDEV Software Weiden ☺ • xdev-software.de • 15+ years full stack • RapidClipse committer • rapidclipse.com • MicroStream committer • microstream.one • Loves • Clean Code | Agile stuff • JUG Oberpfalz | JCON Richard Fichtner @RichardFichtner
  • 3. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Java User Group Oberpfalz Das sind die Quellen http://jug-oberpfalz.de/
  • 4. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 5. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 6. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 7. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de https://jcon.one/
  • 8. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 9. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 10. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Kunden und Partner
  • 11. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de MicroStream is a completely new written Serialization for Java Download free: www.microstream.one Free support: MicroStream Community Forum www.microstream.one Twitter: @microstreamOne MicroStream - Java Native Data Store Create ultra-fast In-Memory Database Applications.
  • 12. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Agenda ▪Warum Clean Code? ▪3 Stufen von Clean Code ▪Code Smells ▪Beispiele aus über 15 Jahren Kampf um / mit Clean Code
  • 13. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 14. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Kostenverteilung im Software Lebenszyklus Quelle: Schach, S. R., 1999. Software Engineering. Fourth Edition Hrsg. Boston: McGraw-Hill Glass, R. L., 2001. Frequently Forgotten Fundamental Facts about Software Engineering. IEEE Software, Issue May/June, pp. 110-112. 7% 6% 12% 8% 40% 16% 11% 67% SOFTWARE LIFECYCLE Requirements Engineering Design Programming Integration Enhancements Migration Bug Fixes
  • 15. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Entwicklung und Wartung 0% 100% 200% Entwicklung Wartung Code schreiben Code lesen Quelle: Parikh, G. & Zvegintzov, N., 1983. Tutorial on software maintenance. s.l.:IEEE Computer Society Press.
  • 16. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Kostenverteilung im Software Lebenszyklus Quelle: Schach, S. R., 1999. Software Engineering. Fourth Edition Hrsg. Boston: McGraw-Hill Glass, R. L., 2001. Frequently Forgotten Fundamental Facts about Software Engineering. IEEE Software, Issue May/June, pp. 110-112. 0% 20% 40% 60% 80% 100% Gesamt Wartung Code Verstehen
  • 17. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 18. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Das sind die Quellen
  • 19. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 20. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Keinen Code schreiben Tools verwenden: ▪Code Generatoren ▪Modellgetrieben ▪UI Builder
  • 21. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 22. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de CSV Import?!
  • 23. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de make or buy? Make Buy / Use Code Qualität Tests Dokumentation Preis / Leistung Spezialisierung
  • 24. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 25. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Copy & Paste vs. Reuse ▪DRY (Don‘t Repeat Yourself) ▪“three strikes and you refactor” Original Copy 1 Copy 2 Quelle: Martin Fowler , Kent Beck , John Brant: Refactoring: Improving the Design of Existing Code
  • 26. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Design Pattern / Entwurfsmuster Quelle: ModelViewControllerDiagram.svg: Traced by User:Stannered derivative work: Davjoh (talk) - ModelViewControllerDiagram.svg
  • 27. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Design Pattern / Entwurfsmuster bewährte Lösungsschablonen für wiederkehrende Entwurfsprobleme Ein gutes Muster sollte ▪ ein oder mehrere Probleme lösen, ▪ ein erprobtes Konzept bieten, ▪ auf realen Designs basieren Quelle: http://de.wikipedia.org/wiki/Entwurfsmuster
  • 28. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 29. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Quelle: 2008 Focus Shift / OSNews / Thom Holwerda http://www.osnews.com/comics
  • 30. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Was ist sauberer Code? ▪Code ohne Compiler-Fehler? ▪Code ohne Warnings? ▪Code nach bestimmter Formatierung? Definitionssache!?
  • 31. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Was ist nicht sauberer Code? „Unter Code-Smell versteht man in der Programmierung ein Konstrukt, das eine Überarbeitung des Programm-Quelltextes nahelegt.“ Quelle: Martin, Robert C. (2009). "17: Smells and Heuristics". Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall. ISBN 978-0-13-235088-4.
  • 32. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Code Smells ▪Überholte Kommentare ▪Auskommentierter Code ▪Tote Funktionen / Code ▪Funktionen mit vielen Parametern ▪Funktionen mit Flag-Parameter ▪Magic-Numbers ▪…
  • 33. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 34. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 35. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Wer warnt mich? ▪(Java) Compiler ▪PMD ▪Checkstyle ▪FindBugs / SpotBugs ▪SonarQube / SonarLint ▪u.v.m.
  • 36. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Aufgeben?
  • 37. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Zero Warning Policy ▪Warnings weisen auf Probleme hin ▪Nicht alle Warnings sind immer ein Problem ▪Warnings lassen sich konfigurieren ▪Nur noch relevante Warnings anzeigen lassen
  • 38. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Kosten von Änderungen / Bugs 0 20 40 60 80 100 120 Requirements Design Code Test Production hoursofwork Phase detected
  • 39. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 40. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Struktur und Namensgebung ▪API unmissverständlich gestalten LocalDate now = LocalDate.now(); LocalDate future = now.add(7);------------------------------ LocalDate future = now.addDays(7);
  • 41. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de ?! var mystery = FloatFactoryFactory.getInstance(FloatFactoryFactory. defaultInstanceDescriptionString).getFactory( Locale.getLocale("en-US")).createBuilder().setString("1.5"). getResult(); var mystery = 1.5F;
  • 42. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de ?! if ((method.getName().startsWith("get") || method.getName().startsWith("is")) && (method.getName().substring(3). toUpperCase().equals( fieldName.toUpperCase()) || method.getName().substring(2). toUpperCase().equals(fieldName. toUpperCase())) { // [MY_CODE] }
  • 43. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 44. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de ? if(method.getName().startsWith("get")) { if(method.getName().substring(3).toUpperCase(). equals(fieldName.toUpperCase())) { // [MY_CODE] } } else if(method.getName().startsWith("is")) { if(method.getName().substring(2).toUpperCase(). equals(fieldName.toUpperCase())) { // [MY_CODE] } }
  • 45. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Sag doch gleich was du willst … if( isGetter(method) || isBooleanGetter(method) ) { // [MY_CODE] }
  • 46. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Reading is more important than writing
  • 47. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Was ist mit altem Code (auskommentiert)? ▪Reduziert Übersichtlichkeit ▪Trügerische Sicherheit ▪ Es fehlen die Infos dazu ▪ Das Sourcecode Versionssystem hilft ▪Raus damit!
  • 48. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Code Konventionen: Struktur ▪Code Formatter verwenden ▪ Zeichenlimit pro Zeile ▪ Leerzeilen / Leerzeichen ▪ Position von Klammern / Geschweiften Klammern
  • 49. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Code Konventionen: Struktur ▪Bei if, else, for, while, IMMER geschweifte Klammern schreiben if(isValid()) save(); if(isValid()) save(); close(); if(isValid()) save(); close(); if(isValid()){ save(); close(); }
  • 50. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Code Konventionen: Struktur ▪Else Block immer schreiben oder nicht? if(isValid()){ save(); close(); } if(isValid()){ save(); close(); } else { // Nix zu tun :) }
  • 51. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Style Guide? Quelle: https://xkcd.com/1513/
  • 52. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Speicher tauschen /* * swap left and right * elements for whole array */ for( i = 0; i < MAX_ELEMENTS; i++) leftElement = left [ i ]; left[ i ] = right [ i ]; right [ i ] = leftElement;
  • 53. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Rechenstunde x = 3+4 * 2+7 = 63 x = (3+4) * (2+7) = 63 x = 3+ 4*2 +7 = 18 x = 3+ (4*2) +7 = 18
  • 54. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Code Konventionen: Style vusing adjhungarian nnotation vmakes nreading ncode adjdifficult ▪Ungarische Notation mit Vorsicht genießen ▪ Insbesondere bei Sprachen mit statischer Typisierung ▪ Interfaces nicht mit einem vorangestellten "I" markieren
  • 55. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Kommentare Quelle: http://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered // When I wrote this, only God and I understood // what I was doing // Now, God only knows
  • 56. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Kommentare ▪Vorgehen kommentieren (Warum? und nicht Wie!) // gibt 1 zurück return 1; […] i++; // i um eins erhöhen
  • 57. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de if(person.age() >= 18){ [. . .] // prüfen ob Person schon 18 ist if(person.age() >= 18){ [. . .] Kommentare ▪Vorgehen kommentieren (Warum? und nicht Wie!) // Volljährigkeit prüfen if(person.age() >= 18){ [. . .] if(person.age() >= LEGAL_AGE){ [. . .] if(person.age() >= country.getLegalAge()){ [. . .] if(person.age() >= country.getLegalAgeInYears()){ [. . .]
  • 58. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Kommentare ▪Code Marker verwenden ( // TODO, FIXME) // TODO: RF (2014-06-23) AWP-5486 Kommentar // FIXME: RF (2014-06-23) AWP-8478 Kommentar
  • 59. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Quelle: http://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered /** * Dear maintainer: * * Once you are done trying to 'optimize' this routine, * and have realized what a terrible mistake that was, * please increment the following counter as a warning * to the next guy: * * total_hours_wasted_here = 42 */
  • 60. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Fehlermeldungen ArrayIndexOutOfBoundsException: Array index out of range ArrayIndexOutOfBoundsException: Array index 15 out of range ArrayIndexOutOfBoundsException: Array index 15 out of range [0:9]
  • 61. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 62. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Quelle: Capers Jones, Chief Scientist Emeritus: Software Quality in 2002: A Survey of the State of the Art. Software Productivity Research an Artemis company
  • 63. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Quelle: Capers Jones, Chief Scientist Emeritus: Software Quality in 2002: A Survey of the State of the Art. Software Productivity Research an Artemis company
  • 64. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Review
  • 65. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Review ▪Oft ▪Kurz ▪Informal ▪Frühes Feedback ▪Beidseitig ▪Selten ▪Lang ▪Formal ▪Spätes Feedback ▪Einseitig
  • 66. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 67. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Gegenseitiger Austausch Jedi Meister Jedi
  • 68. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Review Benefits ▪Zone of Chaos vermeiden ▪Personalentwicklung ▪Verbesserung der Codebasis ▪Weniger Stress, mehr Haare am Kopf, mehr von der Rente ☺
  • 69. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 70. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 71. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de
  • 72. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de Links ▪https://dev.to/bosepchuk/the-one-chart-every-developer-must- understand-2db9
  • 73. RICHARD FICHTNER @RichardFichtner | r.fichtner@xdev-software.de picture credits All pictures in this presentation originate from pixabay. This is a human-readable summary of the Pixabay License (read the full text). You can use all images and videos published on Pixabay for free (except as set out below). You may use them for commercial and non-commercial purposes, in altered and unaltered form. You don't need to ask permission from or provide credit to the image author or Pixabay, although it is appreciated when possible. Cartoons: ▪ https://xkcd.com/1513/ ▪ https://xkcd.com/844/