SlideShare una empresa de Scribd logo
1 de 37
B.Schmid & O.Pehnke| eXXcellent solutions gmbh

Vital und fit bis ins hohe Alter:
Refactoring im Projekt
Wie soll es sein – Entwurfsprinzipien der OO

» Open-Closed Principle
Software-Einheiten sollten offen für Erweiterungen, aber
geschlossen gegenüber Modifikationen sein

» Dependency Inversion Principle (DIP)
Baue auf Abstraktionen, nicht konkreten Implementierungen

» Law of Demeter (LoD)
„Sprich nur zu deinen nächsten Freunden“

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Was ist Refactoring?
“A change to the system that leaves its behavior
unchanged, but enhances some nonfunctional
quality – simplicity, flexibility, understandability,
performance”
Kent Beck, „Extreme Programming Explained“ S.179

2
+b) =
(a
2 + 2ab +
a
b2
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Refactoring ist …
eine Transformation in isolierten Einzelschritten welche
» das äußere Verhalten der Software beibehält
» die innere Struktur der Software verbessert
Grundlagen: W. F. Opdyke., W.Cunningham, K.Beck (XP), M.Fowler

Refactoring ist aber nicht:
» Bugfixing
» Änderung der Funktionalität
„The Two Hats“ (Beck)
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Ein einfaches Motivations-Beispiel
F206: „Encapsulate Field“ (Fowler)
» Symptom: Eine Klasse hat öffentliche Attribute
» Änderung: private + Getter/Setter einführen

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Ein einfaches Motivations-Beispiel
Welche Verbesserungen bringt dieses Refactoring?
Kapselung ist ein Grundpfeiler der OO:
» begrenzt Kontrolle auf Objekt
( Zuständigkeit)
» erlaubt isolierte Änderung
von Internas
( Modularisierung)
» Klar definierte Schnittstelle
( bessere Wartbarkeit)
» Raum für zusätzliche Logik
( Erweiterbarkeit)
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Charakteristik von Refactoring
Refactoring bedeutet den Code

» in einfachen und kleinen Schritten
stufenweise fehlerarm zu ändern

» ihn dabei besser verstehen
zu lernen (Bugs!)

» seine nicht-funktionale Aspekte
zu verbessern

» und damit seine Wartbarkeit
zu begünstigen
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Welche Refactorings gibt es?
Kategorien & Refactorings nach Fowler
» Composing Methods
» Moving Features Between Objects
» Organizing Data
» Simplifying Conditional Expressions
» Making Method Calls Simpler
» Dealing with Generalization
» Big Refactorings

( 9)
( 8)
(16)
( 8)
(15)
(12)
( 4)
72

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Warum Refactoring?
Die Theorie:
Analyse
Analyse

Design
Design

Implementierung
Implementierung

Wachstum
Wachstum

Konsolidierung
Konsolidierung

Die Praxis:
Mehr WiederMehr Wiederverw.
verw.
» Iterativ wachsendes Verständnis
der Problem-Domäne
» Gutes Design ist
Neue
Neue
– im ersten Wurf extrem schwierig
Anforderungen
Anforderungen
– erst durch die Implementierung verifiziert
– Langfristige Entwicklung/Anforderungen oft unklar
» Natürliche Alterungsprozesse

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Warum Refactoring?
“Grow, don’t build software”
Fred Brooks, “No Silver Bullet“

„Using patterns to improve an existing design is
better than using patterns early in a new design“
Joshua Kerievsky, “Refactoring to Patterns”

“Refactoring may be the single most important
technical factor in achieving agility”
Jim Highsmith, „Agile Software Development“

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Welche Code refactoren?

© osnews.com
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Welche Code refactoren?
Wunsch: Formale Indikatoren
Praxis: Erfahrung und Intuition
erforderlich

„If it stinks, change it!“
Grandma Beck

Wegweiser:
» Beck/Fowler: 22 „Code Smells“
» Hotspots von Problemen & Bugs
» Hohe Änderungsrate
» Unklare Codeownership
(„Volle-Windel Effekt“)
» Metriken & Bug Pattern Detectors
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Wann refactoren?
» Beim Hinzufügen von Funktionalität,
wenn…
– diese nur schwer integrierbar ist
– Code wieder verwendet werden kann
– Zukünftige Änderungen leichter werden

» Beim Bug-Fixing wenn …
– Code unklar oder schwer nachvollziehbar ist

» Im Rahmen von Code-Reviews
– Als Ergebnis der Design-Verifizierung
– Als Plattform zum Know-How Austausch

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Nun in die Praxis …

Eclipse 3.3.2 (Europa)
IntelliJ 7.0.3

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Vergleich: Automatische Refactorings der IDEs
Refactoring-Kategorie

Fowler

Eclipse

IntelliJ

Composing Methods

9

5

5

Moving Features Between Objects

8

2

3

16

3

3

8

1

1

Making Method Calls Simpler

15

5

5

Dealing with Generalization

12

7

7

4

-

-

6

11

Organizing Data
Simplifying Conditional Expressions

Big Refactorings
Andere Refactorings

» Viele, nicht direkt-unterstützte Refactorings lassen sich
»

über Zwischenschritte ebenfalls automatisiert erreichen!
Eclipse & IntelliJ zahlenmäßig gleichauf;
der Teufel steckt jedoch im Detail!
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Vorbereitung
Vor dem Refactoring:
» Läuft der Code?
» Welche Regression-Test vorhanden?
» Was ist das Problem?
Und dann:
» Kleine Schritte, eins nach dem anderen
» Nach jedem Schritt testen, um sicher zu stellen keinen Fehler
(Defekt) eingebaut zu haben
» Falls ein Fehler auftritt, gibt es nur einen kleinen Bereich in
dem er liegen kann
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Refactorings – Rename Method/Field/Class/…
Code Smells: Block Comments, Speculative Generality,
Alternative Classes with Different Interfaces

Rename

+

+
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Live Beispiel #1

» Refactoring in Eclipse: Marry Poppins
–
–
–
–

Rename class
Rename parameter
Rename field
including JavaDoc und Code links

» Inklusive Unit-Tests!
-> Validierung vorher/nachher

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Code Smells und ihre Refactorings (1)
Long Method
Unpassende Dekomposition des Problems
F110: Extract Method
F120: Replace Temps with Query

Live & in Farbe
Live & in Farbe

Block Comments
Erklärungsbedürftiger, vermutlich schlechter Code
F110: Extract Method
F273: Rename Method
Live & in Farbe
F123: Introduce Explaining Variable
Live & in Farbe
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Refactorings - Extract & Inline Method
Code Smells: Comments, Duplicated Code, Long Method, …
Middle Man
CardValidator

CardValidator

+matches(String card)

+matches(String card)
-isValidPrefix ()
-isValidChecksum()

Extract Method

+

+

Inline

+

+
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Refactorings - Introduce & Inline Variable
Code Smells: (n/a) [Codeduplikate, komplex. Logik]

Extract Variable

+

+

Inline

+

+
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Live Beispiel #2

» Refactoring in Eclipse: StoreManager
1. „Extract Method“: Methode checkdigit
2. „Introduce Explaining Temp“: Variable prefix
3. „Decompose Conditional“: Methode checkprefix
4. Coment
„Extract Method“: checkCardNumber
5. „Inline Temp“: checkDigit
String checkDigit = Integer.toString(sum % 10);
return checkDigit;
6. Manuelle Aufarbeitung

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Code Smells und ihre Refactorings (2)
Duplicated Code
Fehlende Abbildung von Gemeinsamkeiten durch Vererbung
oder fehlende Delegation an zuständiges Methode/Objekt
F110 Extract Method
F322 Pull up Method
F336 Extract Superclass
F149 Extract class

Long Parameter List
Parameterobjekt fehlend bzw. zu früh aufgelöst
Live & in Farbe
Live & in Farbe
F288 Preserve Whole Object
F295 Introduce Parameter Object
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Refactoring – Add & Remove Parameter
Code Smells: Data Clumps, Long Method, Long Parameter List,
Primitive Obsession, …
Speculative Generality

Change Signature
Safe delete

+

{

}

+
+
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Refactorings - Preserve Whole Object
»

Code Smells: Long Method, Long Parameter List, Data Clumps
Kein direktes, automatisches Refactoring - aber über
Zwischenschritte möglich!

» 1. Übergeordnetes Objekt als neuer Parameter
» 2. Referenzen austauschen (name -> person.getName())
» 3. Unnötige Parameter nun entfernen
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Live Beispiel #3

» Refactoring in IntelliJ: Birthday-Greeter
1. „Change Method signature“ (neu: Person p)
2. Ändere Methodenimplementierung auf p
3. „Change Method signature“ / „Safe delete“
Entferne überflüssige Paramter

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Code Smells und ihre Refactorings (3)
Large Class / God Class
Klasse vereint zu viele Verantwortlichkeiten
F330 Extract Subclass
F341 Extract Interface
Liive &
L ve &
Liive &
F149 Extract Class
n Fa
L ve & in iin Farrbe
b
in Farrbe
Fa be

e

Data Clumps
Zusammengehörende Daten sind nicht in einer gemeinsamen
Klasse zusammengefasst
F288 preserve whole object
F149 Extract Class
F295 introduce parameter object
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Refactorings – Extract Superclass
Code Smells: Large Class

» Motivation: Abbilden von Gemeinsamkeiten (gleichem Code)
in gemeinsamer Überklasse
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Refactorings – Replace Inheritance with Delegation
Code Smells: Middle Man, Inappropriate Intimacy, …

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Extract Class
Code Smells: Duplicated Code, Large Class, Primitive Obsession
Divergent Change, …

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Live Beispiel #4

» Refactoring in IntelliJ: Person
» „Extract Class“ via
– „Extract Superclass“
– „Replace Inheritance via Delegation“
– „Inline method“

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Weitere Code Smells
» Shotgun Surgery
Eine Erweiterung erfordert
Änderungen an vielen,
verschiedenen Klassen

» Divergent Change
Eine Klasse muss für aus
unterschiedlichen Gründe immer
wieder modifiziert werden

» Primitive Obsession

» Type Tests /
Switch Statements
Varianten werden nicht durch
Polymorphie abgebildet

» Feature Envy
Eine Methode ist mehr an
Elementen einer fremden Klasse,
als an den eigenen interessiert

… und weitere!

Primitive Datentypen erfüllen
Funktionen fachlicher Klassen

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Die wertvollen Refactorings im Alltag
oder: Was Großmutter noch wusste!

» Renaming, Renaming, Renaming
» Inline & Extract
» Sichtbarkeit von Methoden &
Attributen reduzieren
(z.B. via ‚Search for Usage‘)

» „final“ fields
(Immutable Objects)

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Grenzen von Refactoring

» Veröffentlichte Schnittstellen
( API minimieren)
» Datenbanken
( Tool: Liquibase)
» FUBAR Code
( Neu gestalten)
Grenzen autom. Refactorings:
» MDSD / UML
» XML (Struts, Spring, etc.)
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Fazit

» Refactoring = Way to go!
– Heutzutage: Hervorragende Werkzeugunterstützung
also: Nur Mut!
– Wichtig: Unit Tests für autom. Regressionstests
– Strenge Typisierung (OOD, Generics) hilft
Defekte erkennen & vorbeugen

„Nichts ist beständiger als der Wandel“
Heinrich Heine

B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Vielen Dank für Ihre Aufmerksamkeit!

Besuchen Sie uns!

Direkt am Eingang der Ausstellung
http://www.exxcellent.de
B.Schmid@exxcellent.de
B.Schmid & O.Pehnke| eXXcellent solutions gmbh
Referenzen
»

„Der 10-Punkte-Plan für den sicheren
Weg zum nicht-wartbaren Code“,
B.Schmid, O.Pehnke, 2007
http://www.exxcellent.de/download/WJAX07Der_10_Punkte_%20Plan.pdf

»

„Refactoring object-oriented
frameworks“,
W. F. Opdyke, 1992
http://www.laputan.org/pub/papers/opdyke-thesis.pdf

»

„Refactoring: Improving the Design of
Existing Code“,
M. Fowler et al., 1999

»

“Refactoring to Patterns”,
J. Kerievsky, 2004

»

“Refactoring”,
http://sourcemaking.com/refactoring
Anonymous

B.Schmid & O.Pehnke| eXXcellent solutions gmbh

Más contenido relacionado

Similar a Vital und fit bis ins hohe Alter: Refactoring im Projekt

Clean Coding - Theorie und Praxis Guide.pptx
Clean Coding - Theorie und Praxis Guide.pptxClean Coding - Theorie und Praxis Guide.pptx
Clean Coding - Theorie und Praxis Guide.pptxkaftanenko
 
Langlebige Softwarearchitekturen - Der Umgang mit technischen Schulden
Langlebige Softwarearchitekturen - Der Umgang mit technischen SchuldenLanglebige Softwarearchitekturen - Der Umgang mit technischen Schulden
Langlebige Softwarearchitekturen - Der Umgang mit technischen SchuldenCarola Lilienthal
 
Large-Scale Product Owner @ XPDays Germany (5.10.2023)
Large-Scale Product Owner @ XPDays Germany (5.10.2023)Large-Scale Product Owner @ XPDays Germany (5.10.2023)
Large-Scale Product Owner @ XPDays Germany (5.10.2023)Pierluigi Pugliese
 
Scrum days 2016_scrum_bei_festo_frank-m.hoyer_nadine.kärcher
Scrum days 2016_scrum_bei_festo_frank-m.hoyer_nadine.kärcherScrum days 2016_scrum_bei_festo_frank-m.hoyer_nadine.kärcher
Scrum days 2016_scrum_bei_festo_frank-m.hoyer_nadine.kärcherJuergen Hohnhold
 
JBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source Java
JBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source JavaJBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source Java
JBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source Javacamunda services GmbH
 
Webcast: Vorlagenmanagement - Best Practices 2015
Webcast: Vorlagenmanagement - Best Practices 2015Webcast: Vorlagenmanagement - Best Practices 2015
Webcast: Vorlagenmanagement - Best Practices 2015COC AG
 
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
 
C/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersC/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersUlrich Krause
 
system worx: Wie Open Source Software zur Optimierung von Geschäftsprozessen ...
system worx: Wie Open Source Software zur Optimierung von Geschäftsprozessen ...system worx: Wie Open Source Software zur Optimierung von Geschäftsprozessen ...
system worx: Wie Open Source Software zur Optimierung von Geschäftsprozessen ...AKJoom
 
InfoDay: Git DVCS & Requirements Management @ Intland Software
InfoDay: Git DVCS & Requirements Management @ Intland SoftwareInfoDay: Git DVCS & Requirements Management @ Intland Software
InfoDay: Git DVCS & Requirements Management @ Intland SoftwareIntland Software GmbH
 
Automatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit SeleniumAutomatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit SeleniumBenjamin Schmid
 
Mastering architecture, design- and code-quality
Mastering architecture, design- and code-qualityMastering architecture, design- and code-quality
Mastering architecture, design- and code-qualitySebastian Dietrich
 
Den PEP (Produktentwicklungsprozess) neu denken!
Den PEP (Produktentwicklungsprozess) neu denken!Den PEP (Produktentwicklungsprozess) neu denken!
Den PEP (Produktentwicklungsprozess) neu denken!Christoph Schmiedinger
 
Main Session Lotus Software
Main Session Lotus SoftwareMain Session Lotus Software
Main Session Lotus SoftwareAndreas Schulte
 
Erfahrungen mit agilen Festpreisen
Erfahrungen mit agilen FestpreisenErfahrungen mit agilen Festpreisen
Erfahrungen mit agilen FestpreisenJoachim Baumann
 
Lean Development = Überdrehter Motor in der Entwicklung?
Lean Development = Überdrehter Motor in der Entwicklung?Lean Development = Überdrehter Motor in der Entwicklung?
Lean Development = Überdrehter Motor in der Entwicklung?Matthias Bohlen
 

Similar a Vital und fit bis ins hohe Alter: Refactoring im Projekt (20)

Codeception VisualCeption
Codeception VisualCeptionCodeception VisualCeption
Codeception VisualCeption
 
Clean Coding - Theorie und Praxis Guide.pptx
Clean Coding - Theorie und Praxis Guide.pptxClean Coding - Theorie und Praxis Guide.pptx
Clean Coding - Theorie und Praxis Guide.pptx
 
Langlebige Softwarearchitekturen - Der Umgang mit technischen Schulden
Langlebige Softwarearchitekturen - Der Umgang mit technischen SchuldenLanglebige Softwarearchitekturen - Der Umgang mit technischen Schulden
Langlebige Softwarearchitekturen - Der Umgang mit technischen Schulden
 
Large-Scale Product Owner @ XPDays Germany (5.10.2023)
Large-Scale Product Owner @ XPDays Germany (5.10.2023)Large-Scale Product Owner @ XPDays Germany (5.10.2023)
Large-Scale Product Owner @ XPDays Germany (5.10.2023)
 
Scrum days 2016_scrum_bei_festo_frank-m.hoyer_nadine.kärcher
Scrum days 2016_scrum_bei_festo_frank-m.hoyer_nadine.kärcherScrum days 2016_scrum_bei_festo_frank-m.hoyer_nadine.kärcher
Scrum days 2016_scrum_bei_festo_frank-m.hoyer_nadine.kärcher
 
JBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source Java
JBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source JavaJBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source Java
JBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source Java
 
Webcast: Vorlagenmanagement - Best Practices 2015
Webcast: Vorlagenmanagement - Best Practices 2015Webcast: Vorlagenmanagement - Best Practices 2015
Webcast: Vorlagenmanagement - Best Practices 2015
 
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
 
Advanced Continuous Integration
Advanced Continuous IntegrationAdvanced Continuous Integration
Advanced Continuous Integration
 
Agile-Scrum Pulse 30min (2007)
Agile-Scrum Pulse 30min (2007)Agile-Scrum Pulse 30min (2007)
Agile-Scrum Pulse 30min (2007)
 
C/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersC/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino Developers
 
system worx: Wie Open Source Software zur Optimierung von Geschäftsprozessen ...
system worx: Wie Open Source Software zur Optimierung von Geschäftsprozessen ...system worx: Wie Open Source Software zur Optimierung von Geschäftsprozessen ...
system worx: Wie Open Source Software zur Optimierung von Geschäftsprozessen ...
 
InfoDay: Git DVCS & Requirements Management @ Intland Software
InfoDay: Git DVCS & Requirements Management @ Intland SoftwareInfoDay: Git DVCS & Requirements Management @ Intland Software
InfoDay: Git DVCS & Requirements Management @ Intland Software
 
Automatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit SeleniumAutomatisierte GUI-Tests mit Selenium
Automatisierte GUI-Tests mit Selenium
 
Mastering architecture, design- and code-quality
Mastering architecture, design- and code-qualityMastering architecture, design- and code-quality
Mastering architecture, design- and code-quality
 
Den PEP (Produktentwicklungsprozess) neu denken!
Den PEP (Produktentwicklungsprozess) neu denken!Den PEP (Produktentwicklungsprozess) neu denken!
Den PEP (Produktentwicklungsprozess) neu denken!
 
Main Session Lotus Software
Main Session Lotus SoftwareMain Session Lotus Software
Main Session Lotus Software
 
Everything's connected
Everything's connectedEverything's connected
Everything's connected
 
Erfahrungen mit agilen Festpreisen
Erfahrungen mit agilen FestpreisenErfahrungen mit agilen Festpreisen
Erfahrungen mit agilen Festpreisen
 
Lean Development = Überdrehter Motor in der Entwicklung?
Lean Development = Überdrehter Motor in der Entwicklung?Lean Development = Überdrehter Motor in der Entwicklung?
Lean Development = Überdrehter Motor in der Entwicklung?
 

Más de Benjamin Schmid

Power catch up - Everything Practical and Important in Java 9 to 13
Power catch up - Everything Practical and Important in Java 9 to 13Power catch up - Everything Practical and Important in Java 9 to 13
Power catch up - Everything Practical and Important in Java 9 to 13Benjamin Schmid
 
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEESchnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEEBenjamin Schmid
 
Komponentenorientierte Webanwendungen mit wingS 2.0
Komponentenorientierte Webanwendungen mit wingS 2.0 Komponentenorientierte Webanwendungen mit wingS 2.0
Komponentenorientierte Webanwendungen mit wingS 2.0 Benjamin Schmid
 
Der 10-Punkte Plan für den sicheren Weg zum nicht-wartbaren Code
Der 10-Punkte Plan für den sicheren Weg zum nicht-wartbaren CodeDer 10-Punkte Plan für den sicheren Weg zum nicht-wartbaren Code
Der 10-Punkte Plan für den sicheren Weg zum nicht-wartbaren CodeBenjamin Schmid
 
Auf dem Weg zu Unwartbarkeit - Die besten Strategien für den sicheren Erfolg!
Auf dem Weg zu Unwartbarkeit - Die besten Strategien für den sicheren Erfolg!Auf dem Weg zu Unwartbarkeit - Die besten Strategien für den sicheren Erfolg!
Auf dem Weg zu Unwartbarkeit - Die besten Strategien für den sicheren Erfolg!Benjamin Schmid
 
Datenbank-Refactoring mit LiquiBase
Datenbank-Refactoring mit LiquiBaseDatenbank-Refactoring mit LiquiBase
Datenbank-Refactoring mit LiquiBaseBenjamin Schmid
 
Vielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-Entwicklung
Vielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-EntwicklungVielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-Entwicklung
Vielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-EntwicklungBenjamin Schmid
 
Scharfe Anmerkungen für Java 6 mit Lombok
Scharfe Anmerkungen für Java 6 mit LombokScharfe Anmerkungen für Java 6 mit Lombok
Scharfe Anmerkungen für Java 6 mit LombokBenjamin Schmid
 
Das lustige Überlebenshandbuch für JavaScript
Das lustige Überlebenshandbuch für JavaScriptDas lustige Überlebenshandbuch für JavaScript
Das lustige Überlebenshandbuch für JavaScriptBenjamin Schmid
 
Trittsicher auf allen Mobilen Pfaden mit HTML5 & jQuery Mobile
Trittsicher auf allen Mobilen Pfaden mit HTML5 & jQuery MobileTrittsicher auf allen Mobilen Pfaden mit HTML5 & jQuery Mobile
Trittsicher auf allen Mobilen Pfaden mit HTML5 & jQuery MobileBenjamin Schmid
 
Hybride Schönheit - Das Java/JavaScript Webframeworks Echo
Hybride Schönheit - Das Java/JavaScript Webframeworks EchoHybride Schönheit - Das Java/JavaScript Webframeworks Echo
Hybride Schönheit - Das Java/JavaScript Webframeworks EchoBenjamin Schmid
 
Next Generation Java - Ceylon, Kotlin, Scala & Fantom im Überblick
Next Generation Java - Ceylon, Kotlin, Scala & Fantom im ÜberblickNext Generation Java - Ceylon, Kotlin, Scala & Fantom im Überblick
Next Generation Java - Ceylon, Kotlin, Scala & Fantom im ÜberblickBenjamin Schmid
 
'Git started' für Fortgeschrittene!
'Git started' für Fortgeschrittene!'Git started' für Fortgeschrittene!
'Git started' für Fortgeschrittene!Benjamin Schmid
 

Más de Benjamin Schmid (13)

Power catch up - Everything Practical and Important in Java 9 to 13
Power catch up - Everything Practical and Important in Java 9 to 13Power catch up - Everything Practical and Important in Java 9 to 13
Power catch up - Everything Practical and Important in Java 9 to 13
 
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEESchnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
Schnelle Winkel: 10x schnellere Webapps mit AngularJS und JEE
 
Komponentenorientierte Webanwendungen mit wingS 2.0
Komponentenorientierte Webanwendungen mit wingS 2.0 Komponentenorientierte Webanwendungen mit wingS 2.0
Komponentenorientierte Webanwendungen mit wingS 2.0
 
Der 10-Punkte Plan für den sicheren Weg zum nicht-wartbaren Code
Der 10-Punkte Plan für den sicheren Weg zum nicht-wartbaren CodeDer 10-Punkte Plan für den sicheren Weg zum nicht-wartbaren Code
Der 10-Punkte Plan für den sicheren Weg zum nicht-wartbaren Code
 
Auf dem Weg zu Unwartbarkeit - Die besten Strategien für den sicheren Erfolg!
Auf dem Weg zu Unwartbarkeit - Die besten Strategien für den sicheren Erfolg!Auf dem Weg zu Unwartbarkeit - Die besten Strategien für den sicheren Erfolg!
Auf dem Weg zu Unwartbarkeit - Die besten Strategien für den sicheren Erfolg!
 
Datenbank-Refactoring mit LiquiBase
Datenbank-Refactoring mit LiquiBaseDatenbank-Refactoring mit LiquiBase
Datenbank-Refactoring mit LiquiBase
 
Vielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-Entwicklung
Vielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-EntwicklungVielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-Entwicklung
Vielfalt vs. Abstraktion - Der Jakobsweg der modellbasierten GUI-Entwicklung
 
Scharfe Anmerkungen für Java 6 mit Lombok
Scharfe Anmerkungen für Java 6 mit LombokScharfe Anmerkungen für Java 6 mit Lombok
Scharfe Anmerkungen für Java 6 mit Lombok
 
Das lustige Überlebenshandbuch für JavaScript
Das lustige Überlebenshandbuch für JavaScriptDas lustige Überlebenshandbuch für JavaScript
Das lustige Überlebenshandbuch für JavaScript
 
Trittsicher auf allen Mobilen Pfaden mit HTML5 & jQuery Mobile
Trittsicher auf allen Mobilen Pfaden mit HTML5 & jQuery MobileTrittsicher auf allen Mobilen Pfaden mit HTML5 & jQuery Mobile
Trittsicher auf allen Mobilen Pfaden mit HTML5 & jQuery Mobile
 
Hybride Schönheit - Das Java/JavaScript Webframeworks Echo
Hybride Schönheit - Das Java/JavaScript Webframeworks EchoHybride Schönheit - Das Java/JavaScript Webframeworks Echo
Hybride Schönheit - Das Java/JavaScript Webframeworks Echo
 
Next Generation Java - Ceylon, Kotlin, Scala & Fantom im Überblick
Next Generation Java - Ceylon, Kotlin, Scala & Fantom im ÜberblickNext Generation Java - Ceylon, Kotlin, Scala & Fantom im Überblick
Next Generation Java - Ceylon, Kotlin, Scala & Fantom im Überblick
 
'Git started' für Fortgeschrittene!
'Git started' für Fortgeschrittene!'Git started' für Fortgeschrittene!
'Git started' für Fortgeschrittene!
 

Vital und fit bis ins hohe Alter: Refactoring im Projekt

  • 1. B.Schmid & O.Pehnke| eXXcellent solutions gmbh Vital und fit bis ins hohe Alter: Refactoring im Projekt
  • 2. Wie soll es sein – Entwurfsprinzipien der OO » Open-Closed Principle Software-Einheiten sollten offen für Erweiterungen, aber geschlossen gegenüber Modifikationen sein » Dependency Inversion Principle (DIP) Baue auf Abstraktionen, nicht konkreten Implementierungen » Law of Demeter (LoD) „Sprich nur zu deinen nächsten Freunden“ B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 3. Was ist Refactoring? “A change to the system that leaves its behavior unchanged, but enhances some nonfunctional quality – simplicity, flexibility, understandability, performance” Kent Beck, „Extreme Programming Explained“ S.179 2 +b) = (a 2 + 2ab + a b2 B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 4. Refactoring ist … eine Transformation in isolierten Einzelschritten welche » das äußere Verhalten der Software beibehält » die innere Struktur der Software verbessert Grundlagen: W. F. Opdyke., W.Cunningham, K.Beck (XP), M.Fowler Refactoring ist aber nicht: » Bugfixing » Änderung der Funktionalität „The Two Hats“ (Beck) B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 5. Ein einfaches Motivations-Beispiel F206: „Encapsulate Field“ (Fowler) » Symptom: Eine Klasse hat öffentliche Attribute » Änderung: private + Getter/Setter einführen B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 6. Ein einfaches Motivations-Beispiel Welche Verbesserungen bringt dieses Refactoring? Kapselung ist ein Grundpfeiler der OO: » begrenzt Kontrolle auf Objekt ( Zuständigkeit) » erlaubt isolierte Änderung von Internas ( Modularisierung) » Klar definierte Schnittstelle ( bessere Wartbarkeit) » Raum für zusätzliche Logik ( Erweiterbarkeit) B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 7. Charakteristik von Refactoring Refactoring bedeutet den Code » in einfachen und kleinen Schritten stufenweise fehlerarm zu ändern » ihn dabei besser verstehen zu lernen (Bugs!) » seine nicht-funktionale Aspekte zu verbessern » und damit seine Wartbarkeit zu begünstigen B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 8. Welche Refactorings gibt es? Kategorien & Refactorings nach Fowler » Composing Methods » Moving Features Between Objects » Organizing Data » Simplifying Conditional Expressions » Making Method Calls Simpler » Dealing with Generalization » Big Refactorings ( 9) ( 8) (16) ( 8) (15) (12) ( 4) 72 B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 9. Warum Refactoring? Die Theorie: Analyse Analyse Design Design Implementierung Implementierung Wachstum Wachstum Konsolidierung Konsolidierung Die Praxis: Mehr WiederMehr Wiederverw. verw. » Iterativ wachsendes Verständnis der Problem-Domäne » Gutes Design ist Neue Neue – im ersten Wurf extrem schwierig Anforderungen Anforderungen – erst durch die Implementierung verifiziert – Langfristige Entwicklung/Anforderungen oft unklar » Natürliche Alterungsprozesse B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 10. Warum Refactoring? “Grow, don’t build software” Fred Brooks, “No Silver Bullet“ „Using patterns to improve an existing design is better than using patterns early in a new design“ Joshua Kerievsky, “Refactoring to Patterns” “Refactoring may be the single most important technical factor in achieving agility” Jim Highsmith, „Agile Software Development“ B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 11. Welche Code refactoren? © osnews.com B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 12. Welche Code refactoren? Wunsch: Formale Indikatoren Praxis: Erfahrung und Intuition erforderlich „If it stinks, change it!“ Grandma Beck Wegweiser: » Beck/Fowler: 22 „Code Smells“ » Hotspots von Problemen & Bugs » Hohe Änderungsrate » Unklare Codeownership („Volle-Windel Effekt“) » Metriken & Bug Pattern Detectors B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 13. Wann refactoren? » Beim Hinzufügen von Funktionalität, wenn… – diese nur schwer integrierbar ist – Code wieder verwendet werden kann – Zukünftige Änderungen leichter werden » Beim Bug-Fixing wenn … – Code unklar oder schwer nachvollziehbar ist » Im Rahmen von Code-Reviews – Als Ergebnis der Design-Verifizierung – Als Plattform zum Know-How Austausch B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 14. Nun in die Praxis … Eclipse 3.3.2 (Europa) IntelliJ 7.0.3 B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 15. Vergleich: Automatische Refactorings der IDEs Refactoring-Kategorie Fowler Eclipse IntelliJ Composing Methods 9 5 5 Moving Features Between Objects 8 2 3 16 3 3 8 1 1 Making Method Calls Simpler 15 5 5 Dealing with Generalization 12 7 7 4 - - 6 11 Organizing Data Simplifying Conditional Expressions Big Refactorings Andere Refactorings » Viele, nicht direkt-unterstützte Refactorings lassen sich » über Zwischenschritte ebenfalls automatisiert erreichen! Eclipse & IntelliJ zahlenmäßig gleichauf; der Teufel steckt jedoch im Detail! B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 16. Vorbereitung Vor dem Refactoring: » Läuft der Code? » Welche Regression-Test vorhanden? » Was ist das Problem? Und dann: » Kleine Schritte, eins nach dem anderen » Nach jedem Schritt testen, um sicher zu stellen keinen Fehler (Defekt) eingebaut zu haben » Falls ein Fehler auftritt, gibt es nur einen kleinen Bereich in dem er liegen kann B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 17. Refactorings – Rename Method/Field/Class/… Code Smells: Block Comments, Speculative Generality, Alternative Classes with Different Interfaces Rename + + B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 18. Live Beispiel #1 » Refactoring in Eclipse: Marry Poppins – – – – Rename class Rename parameter Rename field including JavaDoc und Code links » Inklusive Unit-Tests! -> Validierung vorher/nachher B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 19. Code Smells und ihre Refactorings (1) Long Method Unpassende Dekomposition des Problems F110: Extract Method F120: Replace Temps with Query Live & in Farbe Live & in Farbe Block Comments Erklärungsbedürftiger, vermutlich schlechter Code F110: Extract Method F273: Rename Method Live & in Farbe F123: Introduce Explaining Variable Live & in Farbe B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 20. Refactorings - Extract & Inline Method Code Smells: Comments, Duplicated Code, Long Method, … Middle Man CardValidator CardValidator +matches(String card) +matches(String card) -isValidPrefix () -isValidChecksum() Extract Method + + Inline + + B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 21. Refactorings - Introduce & Inline Variable Code Smells: (n/a) [Codeduplikate, komplex. Logik] Extract Variable + + Inline + + B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 22. Live Beispiel #2 » Refactoring in Eclipse: StoreManager 1. „Extract Method“: Methode checkdigit 2. „Introduce Explaining Temp“: Variable prefix 3. „Decompose Conditional“: Methode checkprefix 4. Coment „Extract Method“: checkCardNumber 5. „Inline Temp“: checkDigit String checkDigit = Integer.toString(sum % 10); return checkDigit; 6. Manuelle Aufarbeitung B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 23. Code Smells und ihre Refactorings (2) Duplicated Code Fehlende Abbildung von Gemeinsamkeiten durch Vererbung oder fehlende Delegation an zuständiges Methode/Objekt F110 Extract Method F322 Pull up Method F336 Extract Superclass F149 Extract class Long Parameter List Parameterobjekt fehlend bzw. zu früh aufgelöst Live & in Farbe Live & in Farbe F288 Preserve Whole Object F295 Introduce Parameter Object B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 24. Refactoring – Add & Remove Parameter Code Smells: Data Clumps, Long Method, Long Parameter List, Primitive Obsession, … Speculative Generality Change Signature Safe delete + { } + + B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 25. Refactorings - Preserve Whole Object » Code Smells: Long Method, Long Parameter List, Data Clumps Kein direktes, automatisches Refactoring - aber über Zwischenschritte möglich! » 1. Übergeordnetes Objekt als neuer Parameter » 2. Referenzen austauschen (name -> person.getName()) » 3. Unnötige Parameter nun entfernen B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 26. Live Beispiel #3 » Refactoring in IntelliJ: Birthday-Greeter 1. „Change Method signature“ (neu: Person p) 2. Ändere Methodenimplementierung auf p 3. „Change Method signature“ / „Safe delete“ Entferne überflüssige Paramter B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 27. Code Smells und ihre Refactorings (3) Large Class / God Class Klasse vereint zu viele Verantwortlichkeiten F330 Extract Subclass F341 Extract Interface Liive & L ve & Liive & F149 Extract Class n Fa L ve & in iin Farrbe b in Farrbe Fa be e Data Clumps Zusammengehörende Daten sind nicht in einer gemeinsamen Klasse zusammengefasst F288 preserve whole object F149 Extract Class F295 introduce parameter object B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 28. Refactorings – Extract Superclass Code Smells: Large Class » Motivation: Abbilden von Gemeinsamkeiten (gleichem Code) in gemeinsamer Überklasse B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 29. Refactorings – Replace Inheritance with Delegation Code Smells: Middle Man, Inappropriate Intimacy, … B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 30. Extract Class Code Smells: Duplicated Code, Large Class, Primitive Obsession Divergent Change, … B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 31. Live Beispiel #4 » Refactoring in IntelliJ: Person » „Extract Class“ via – „Extract Superclass“ – „Replace Inheritance via Delegation“ – „Inline method“ B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 32. Weitere Code Smells » Shotgun Surgery Eine Erweiterung erfordert Änderungen an vielen, verschiedenen Klassen » Divergent Change Eine Klasse muss für aus unterschiedlichen Gründe immer wieder modifiziert werden » Primitive Obsession » Type Tests / Switch Statements Varianten werden nicht durch Polymorphie abgebildet » Feature Envy Eine Methode ist mehr an Elementen einer fremden Klasse, als an den eigenen interessiert … und weitere! Primitive Datentypen erfüllen Funktionen fachlicher Klassen B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 33. Die wertvollen Refactorings im Alltag oder: Was Großmutter noch wusste! » Renaming, Renaming, Renaming » Inline & Extract » Sichtbarkeit von Methoden & Attributen reduzieren (z.B. via ‚Search for Usage‘) » „final“ fields (Immutable Objects) B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 34. Grenzen von Refactoring » Veröffentlichte Schnittstellen ( API minimieren) » Datenbanken ( Tool: Liquibase) » FUBAR Code ( Neu gestalten) Grenzen autom. Refactorings: » MDSD / UML » XML (Struts, Spring, etc.) B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 35. Fazit » Refactoring = Way to go! – Heutzutage: Hervorragende Werkzeugunterstützung also: Nur Mut! – Wichtig: Unit Tests für autom. Regressionstests – Strenge Typisierung (OOD, Generics) hilft Defekte erkennen & vorbeugen „Nichts ist beständiger als der Wandel“ Heinrich Heine B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 36. Vielen Dank für Ihre Aufmerksamkeit! Besuchen Sie uns! Direkt am Eingang der Ausstellung http://www.exxcellent.de B.Schmid@exxcellent.de B.Schmid & O.Pehnke| eXXcellent solutions gmbh
  • 37. Referenzen » „Der 10-Punkte-Plan für den sicheren Weg zum nicht-wartbaren Code“, B.Schmid, O.Pehnke, 2007 http://www.exxcellent.de/download/WJAX07Der_10_Punkte_%20Plan.pdf » „Refactoring object-oriented frameworks“, W. F. Opdyke, 1992 http://www.laputan.org/pub/papers/opdyke-thesis.pdf » „Refactoring: Improving the Design of Existing Code“, M. Fowler et al., 1999 » “Refactoring to Patterns”, J. Kerievsky, 2004 » “Refactoring”, http://sourcemaking.com/refactoring Anonymous B.Schmid & O.Pehnke| eXXcellent solutions gmbh