Legacy Code meistern in x einfachen Schritten

Legacy Code meistern
in x einfachen
Schritten
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
Version: 1.0
www.oio.de
[email protected]
Java Forum Nord Hannover, 06.10.2015
Über mich
Falk Sippach (@sippsack)
Trainer, Berater, Entwickler
Co-Organisator
© 2015 Orientation in Objects GmbH
Schwerpunkte
Architektur
Agile Softwareentwicklung
Codequalität
Legacy Code meistern in x einfachen Schritten
2
Java, XML und Open Source seit 1998
) Software Factory )
) Object Rangers )
• Schlüsselfertige Realisierung
von Java Software
• Unterstützung laufender
• Individualsoftware
• Pilot- und Migrationsprojekte
• Sanierung von Software
• Software Wartung
• Perfect Match
• Rent-a-team
• Coaching on the project
• Inhouse Outsourcing
© 2015 Orientation in Objects GmbH
Java Projekte
) Competence Center)
• Schulungen, Coaching,
Weiterbildungsberatung,
Train & Solve-Programme
• Methoden, Standards und
Tools für die Entwicklung
von offenen, unternehmensweiten Systemen
Legacy Code meistern in x einfachen Schritten
3
Legacy Code meistern in
5
6
2
4
3
1
x einfachen Schritten
Nur heute,
nicht 1,
nicht 2,
…
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
4
Legacy Code meistern
in x einfachen Schritten
In einer idealen Welt würden wir nur "neuen" Code schreiben, der
natürlich perfekt und wunderschön ist. Wir müssten nie wieder unseren
Code anschauen, geschweige denn 10 Jahre alte Projekte warten. Ende
des Tagtraums ... Leider ist unsere Welt nicht so ideal, unser Code von
gestern ist heute schon Legacy. Diesen im Nachhinein zu verstehen, zu
erweitern oder darin Fehler zu beheben, ist immer eine Herausforderung,
insbesondere wenn Tests fehlen.
Trotzdem gibt es einfache Möglichkeiten, wie man die Qualität von
Legacy-Code verbessern kann. Das Wichtigste ist das Einziehen von
Fangnetzen, sodass man trotz fehlender Tests guten Gewissens
Änderungen durchführen kann. Wer Golden Master, Subclass to Test und
Extract Pure Functions an konkreten Beispielen kenne nlernen möchte,
ist in dieser Session genau richtig.
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
5
Unser Thema heute:
Refactoring Legacy Code
Disclaimer: KEIN Projekterfahrungsbericht
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
6
Legacy Code
Somebody
else's code
Jeder kennt ihn …
Was ist mit unserem
eigenen Code?
Keiner mag ihn …
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
7
Refactoring Legacy Code
Warum?
Verstehen
Erweitern
Bugfixing
Optimierung
Grafik von ClkerFreeVectorImages: https://pixabay.com/de/vitamine-tabletten-pillen-medizin-26622/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
8
Refactoring Legacy Code
Annahmen
Es gibt automatisierte Tests …
Quellcode ist schon testbar …
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
9
Refactoring Legacy Code
Code Smells
Temporary Field
Long Method
Feature Envy
…
Code Comments
https://twitter.com/petecheslock/status/646507209413775360/photo/1
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
10
"Gimme Google, Stack Overflow, and this keyboard,
and I'll program you anything. "
Duplicated Code
https://twitter.com/old_sound/status/650490638308409344
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
11
Refactoring Legacy Code
"Code
without
tests"
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
12
LEGACY
Vermächtnis
Erbe
Altlast
Hinterlassenschaft
Foto von smpcas, CC0 Public Domain Lizenz, https://pixabay.com/de/pula-kroatien-amphitheater-erbe-827909/
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
13
J. B. Rainsberger
Legacy code is
valuable code
that we feel afraid
to change.
Foto von PublicDomainPictures, CC0 Public Domain Lizenz, https://pixabay.com/de/menschen-abdeckung-schrei-314481/
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
14
"Code without
tests is bad
code."
Michael Feathers
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
15
Es ist egal, wie …
… gut geschrieben der Code ist
… schön der Code ist
… objektorientiert der Code ist
… entkoppelt der Code ist
Tests
lassen unser Verhalten schnell und verifizierbar ändern
Ohne Tests
wissen wir nicht, ob der Code besser oder schlechter wird
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
16
Die gute Nachricht …
Keine Wissenschaft
Gesunder Menschenverstand
Foto von Engel62: https://pixabay.com/de/daniel-d%C3%BCsentrieb-helferlein-123206/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
17
Was macht es dann schwierig?
Hello World vs. 50.000++ LOC
Disziplin (kleine Schritte, …)
Aussagekräftige Testabdeckung
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
18
Legacy zu Clean Code?
Clean Code ist NICHT das Ziel
Hauptfokus: testbarer Code
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
19
Dann schreiben wir halt Tests …
viel zu teuer
Code meist kaum/nicht testbar
starke Kopplung, geringe Kohäsion
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
20
refactoren bräuchte man Tests, Tests bräuchte man, um Code zu
verstehen könnte man Code refactoren, um Code zu refactoren
bräuchte man Tests, Tests bräuchte man, um Code zu verstehen könnte
man Code refactoren, um Code zu refactoren bräuchte man Tests, Tests
bräuchte man, um Code zu verstehen könnte man Code refactoren, um
Code zu refactoren bräuchte man Tests, Tests bräuchte man, um Code
Henne-Ei-Problem
zu verstehen könnte man Code
refactoren, um Code zu refactoren
bräuchte man Tests, Tests bräuchte man, um Code zu verstehen könnte
man Code refactoren, um Code zu refactoren bräuchte man Tests, Tests
bräuchte man, um Code zu verstehen könnte man Code refactoren, um
Code zu refactoren bräuchte man Tests, Tests bräuchte man, um Code
zu verstehen könnte man Code refactoren, um Code zu refactoren
bräuchte man Tests, Tests bräuchte man, um Code zu verstehen
könnte man Code refactoren, um Code zu refactoren bräuchte man
Tests, Tests bräuchte man, um Code zu verstehen könnte man Code
refactoren, um Code zu refactoren bräuchte man Tests, Tests bräuchte
man, um Code zu verstehen könnte man Code refactoren, um Code zu
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
21
um Tests zu schreiben muß der Code testbar sein, um testbaren Code
zu erhalten müßte man refactoren, um zu refactoren könnte man Tests
schreiben, um Tests zu schreiben muß der Code testbar sein, um
testbaren Code zu erhalten müßte man refactoren, um zu refactoren
könnte man Tests schreiben, um Tests zu schreiben muß der Code
testbar sein, um testbaren Code zu erhalten müßte man refactoren,
um zu refactoren könnte man Tests schreiben, um Tests zu
schreiben muß der Code testbar sein, um testbaren Code zu erhalten
müßte man refactoren, um zu refactoren könnte man Tests schreiben,
um Tests zu schreiben muß der Code testbar sein, um testbaren Code
zu erhalten
müßte beißt
man refactoren,
um zu refactoren könnte man Tests
Die Katze
sich
schreiben,in um
zu schreiben muß der Code testbar sein, um
denTests
Schwanz!
testbaren Code zu erhalten müßte man refactoren, um zu refactoren
könnte man Tests schreiben, um Tests zu schreiben muß der Code
testbar sein, um testbaren Code zu erhalten müßte man refactoren, um
zu refactoren könnte man Tests schreiben, um Tests zu schreiben muß
der Code testbar sein, um testbaren Code zu erhalten müßte man refact
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
22
Vorgehen
• Identify what to change
• Identify what to test
• Break dependencies
• Write the tests
• Modify and refactoring
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
23
No Silver Bullet
Jedes Projekt individuell
Vorsicht beim Beheben von offensichtlichen Fehlern
Foto von stevepb: https://pixabay.com/de/kugel-patrone-munition-kriminalit%C3%A4t-408636/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
24
A
Sicherheitsnetz
Foto von bella67: https://pixabay.com/de/spinnennetz-mit-wasserperlen-netz-921039/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
25
B
Sanierung
Foto von KlausHausmann: https://pixabay.com/de/bauarbeiter-bau-bauen-bohrhammer-921224/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
26
1
Golden Master
Foto von istara: https://pixabay.com/de/gold-bar-goldbarren-reich-geld-296115/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
27
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
28
Live-Coding
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
29
1
Golden Master
Vorsicht bei Zufallsgeneratoren
Festlegen von Seeds
(Pseudo-Random)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
30
2
Subclass To Test
Foto von chrisli8020: https://pixabay.com/de/auto-maschine-spielzeug-786315/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
31
2
Subclass To Test
Seam
A seam is a place where you can alter behavior in your program without editing in
that place.
Aufbrechen stark gekoppelter Abhängigkeiten
aka Extract and Override
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
32
Live-Coding
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
33
3
Extract Pure Functions
Foto von PublicDomainPictures: https://pixabay.com/de/wasser-tropfen-tr%C3%B6pfchen-grau-72879/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
34
3
Extract Pure Functions
seiteneffektfrei
keine Statusänderung
IDEMPOTENT!
© 2015 Orientation in Objects GmbH
"It's a classic,
we call it a Klassiker"
Legacy Code meistern in x einfachen Schritten
35
3
Extract Pure Functions
"pure function".substring(5);
UrlEncoder.encode("pure function");
Math.max(x, y);
System.out.println("unpure");
list.add(3);
Object.hashcode()
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
36
3
Extract Pure Functions
Ziele
Codestellen isolieren
Separat testen
Duplikation reduzieren
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
37
Live-Coding
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
38
4
Remove Duplication
DRY
Aber: Rule of three
Foto von AdinaVoicu: https://pixabay.com/de/zwilling-schwestern-liebe-m%C3%A4dchen-948713/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
39
Live-Coding
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
40
5
Extract Class
Large class
SRP verletzt
Unabhängiges
Testen einzelner Teile
Foto von blickpixel: https://pixabay.com/de/weihnachtsdekoration-pakete-geschenk-570797/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
41
Live-Coding
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
42
6
Dependency Inversion
Entkoppeln
durch explizite
Abhängigkeiten
Foto von tatlin: https://pixabay.com/de/zigarette-rauch-tabak-106610/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
43
Live-Coding
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
44
1 Golden Master
2 Subclass To Test
3 Extract Pure Functions
4 Remove Duplication
5 Extract Class
6 Dependency Inversion
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
45
Tools
Code Coverage
Approval Tests
Infinitest
Eclipse Metrics
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
46
Legacy Code Retreat
Foto von Jmabel: https://commons.wikimedia.org/wiki/File:Seattle_-_Budokan_Dojo_judo_demo_04.jpg?uselang=de (CC BY-SA 3.0 Lizenz)
© 2015 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
47
? ? ?
?
?
Fragen ?
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
[email protected]
Vielen Dank für ihre
Aufmerksamkeit !
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
[email protected]