legacy code meistern in x einfachen schritten · refactoring legacy code code smells temporary...
TRANSCRIPT
1
Orientation in Objects GmbH
Weinheimer Str. 6868309 Mannheim
Legacy Code meistern in x einfachen
Schritten
1.0
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH
Über mich
2
Falk Sippach (@sippsack)
Trainer, Berater, Entwickler
SchwerpunkteArchitektur
Agile SoftwareentwicklungCodequalitätCo-Organisator
2
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH
Java, XML und Open Source seit 1998
) Competence Center)) Object Rangers )
• Schulungen , Coaching , Weiterbildungsberatung , Train & Solve-Programme
• Methoden , Standards und Tools für die Entwicklung von offenen, unternehmens-weiten Systemen
• Unterstützung laufenderJava Projekte
• Perfect Match• Rent-a-team• Coaching on the project• Inhouse Outsourcing
• Schlüsselfertige Realisierungvon Java Software
• Individualsoftware• Pilot- und Migrationsprojekte• Sanierung von Software• Software Wartung
) Software Factory )
3
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH
Legacy Code meistern in
x einfachen Schritten
4
12345678Nur heute,
nicht 1, nicht 2,
…
Nur heute,nicht 1, nicht 2,
…
3
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH
Legacy Code meistern in x einfachen Schritten
5
In einer idealen Welt würden wir nur "neuen" Code schreiben, dernatürlich perfekt und wunderschön ist. Wir müssten nie wieder unserenCode anschauen, geschweige denn 10 Jahre alte Projekte warten. Endedes Tagtraums ... Leider ist unsere Welt nicht so ideal, unser Code vongestern ist heute schon Legacy. Diesen im Nachhinein zu verstehen, zuerweitern oder darin Fehler zu beheben, ist immer eine Herausforderung,insbesondere wenn Tests fehlen.
Trotzdem gibt es einfache Möglichkeiten, wie man die Qualität vonLegacy-Code verbessern kann. Das Wichtigste ist das Einziehen vonFangnetzen, sodass man trotz fehlender Tests guten GewissensÄnderungen durchführen kann. Wer Golden Master, Subclass to Test undExtract Pure Functions an konkreten Beispielen kennenlernen möchte,ist in dieser Session genau richtig.
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 6
Refactoring Legacy CodeRefactoring Legacy Code
Unser Thema heute:Unser Thema heute:
Disclaimer: KEIN ProjekterfahrungsberichtDisclaimer: KEIN Projekterfahrungsbericht
4
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 7
Legacy CodeLegacy Code
Jeder kennt ihn …Jeder kennt ihn …
Keiner mag ihn …Keiner mag ihn …
Somebody else's codeSomebody else's code
Was ist mit unseremeigenen Code?
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 8
Refactoring Legacy CodeRefactoring Legacy Code
VerstehenVerstehen
ErweiternErweitern
BugfixingBugfixing
Warum?Warum?
Grafik von ClkerFreeVectorImages: https://pixabay.com/de/vitamine-tabletten-pillen-medizin-26622/ (CC0 Public Domain Lizenz)
OptimierungOptimierung
5
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH
Refactoring Legacy Code
9
Refactoring Legacy Code
Es gibt automatisierte Tests …
Quellcode ist schon testbar …
Annahmen
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 10
https://twitter.com/petecheslock/status/646507209413775360/photo/1
Code CommentsCode Comments
Refactoring Legacy CodeRefactoring Legacy Code
Code SmellsCode Smells
Temporary FieldTemporary Field
Long MethodLong Method
Feature EnvyFeature Envy…
6
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 11
https://twitter.com/old_sound/status/650490638308409344
Duplicated CodeDuplicated Code
"Gimme Google, Stack Overflow, and this keyboard, and I'll program you anything. "
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 12
Refactoring Legacy Code
Code without
tests
“
7
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 13
Foto von smpcas, CC0 Public Domain Lizenz, https://pixabay.com/de/pula-kroatien-amphitheater-erbe-827909/
VermächtnisVermächtnis
ErbeErbe
AltlastAltlast
HinterlassenschaftHinterlassenschaft
LEGACYLEGACY
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 14
Legacy code is valuable codethat we feel afraid to change .
J. B. Rainsberger
Foto von PublicDomainPictures, CC0 Public Domain Lizenz, https://pixabay.com/de/menschen-abdeckung-schrei-314481/
“
8
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 15
Code without tests is bad code .
Michael Feathers
“
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 16
Es ist egal, wie …Es ist egal, wie …
… gut geschrieben der Code ist… gut geschrieben der Code ist
… schön der Code ist… schön der Code ist
… objektorientiert der Code ist… objektorientiert der Code ist
… entkoppelt der Code ist… entkoppelt der Code ist
Testslassen unser Verhalten schnell und verifizierbar ändern
Testslassen unser Verhalten schnell und verifizierbar ändern
Ohne Testswissen wir nicht, ob der Code besser oder schlechter wird
Ohne Testswissen wir nicht, ob der Code besser oder schlechter wird
9
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 17
Die gute Nachricht …Die gute Nachricht …
Keine WissenschaftKeine Wissenschaft
Gesunder MenschenverstandGesunder MenschenverstandFoto von Engel62: https://pixabay.com/de/daniel-d%C3%BCsentrieb-helferlein-123206/ (CC0 Public Domain Lizenz)
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 18
Hello World vs. 50.000++ LOCHello World vs. 50.000++ LOC
Disziplin (kleine Schritte, …)Disziplin (kleine Schritte, …)
Aussagekräftige TestabdeckungAussagekräftige Testabdeckung
Was macht es dann schwierig?Was macht es dann schwierig?
10
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 19
Clean Code ist NICHT das ZielClean Code ist NICHT das Ziel
Hauptfokus: testbarer CodeHauptfokus: testbarer Code
Legacy zu Clean Code?Legacy zu Clean Code?
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 20
viel zu teuerviel zu teuer
Code meist kaum/nicht testbarstarke Kopplung, geringe Kohäsion
Code meist kaum/nicht testbarstarke Kopplung, geringe Kohäsion
Dann schreiben wir halt Tests …Dann schreiben wir halt Tests …
11
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 21
refactoren bräuchte man Tests, Tests würden helfen, Code zuverstehen, um Code zu verstehen könnte man Code refactoren, umCode zu refactoren bräuchte man Tests, Tests würden helfen, Code zuverstehen, um Code zu verstehen könnte man Code refactoren, umCode zu refactoren bräuchte man Tests, Tests würden helfen, Code zuverstehen, um Code zu verstehen könnte man Code refactoren, umCode zu refactoren bräuchte man Tests, Tests würden helfen, Code zuverstehen, um Code zu verstehen könnte man Code refactoren, umCode zu refactoren bräuchte man Tests, Tests würden helfen, Code zuverstehen, um Code zu verstehen könnte man Code refactoren, umCode zu refactoren bräuchte man Tests,Tests würden helfen, Code zuverstehen, um Code zu verstehen könnte man Code refactoren, umCode zu refactoren bräuchte man Tests,Tests würden helfen, Codezu verstehen, um Code zu verstehen könnte man Code refactoren, umCode zu refactoren bräuchte man Tests, Tests würden helfen, Code zuverstehen, um Code zu verstehen könnte man Code refactoren, umCode zu refactoren bräuchte man Tests, Tests würden helfen, Code zu
Henne-Ei-Problem
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 22
um Tests zu schreiben muß der Code testbar sein, um testbaren Codezu erhalten müßte man refactoren, um zu refactoren könnte man Testsschreiben, um Tests zu schreiben muß der Code testbar sein, umtestbaren Code zu erhalten müßte man refactoren, um zu refactorenkönnte man Tests schreiben,um Tests zu schreiben muß der Codetestbar sein, um testbaren Code zu erhalten müßte man refactoren,um zu refactoren könnte man Tests schreiben, um Tests zuschreiben muß der Code testbar sein, um testbaren Code zu erhaltenmüßte man refactoren, um zu refactoren könnte man Tests schreiben,um Tests zu schreiben muß der Code testbar sein, um testbaren Codezu erhalten müßte man refactoren, um zu refactoren könnte man Testsschreiben, um Tests zu schreiben muß der Code testbar sein, umtestbaren Code zu erhalten müßte man refactoren, um zu refactorenkönnte man Tests schreiben, um Tests zu schreiben muß der Codetestbar sein, um testbaren Code zu erhalten müßte man refactoren, umzu refactoren könnte man Tests schreiben, um Tests zu schreiben mußder Code testbar sein, um testbaren Code zu erhalten müßte man refact
Die Katze beißt sich in den Schwanz!
Die Katze beißt sich in den Schwanz!
12
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH
Vorgehen
1. Identify what to change2. Identify what to test3. Break dependencies4. Write the tests5. Modify and refactoring
23
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 24
Foto von stevepb: https://pixabay.com/de/kugel-patrone-munition-kriminalit%C3%A4t-408636/ (CC0 Public Domain Lizenz)
No Silver BulletNo Silver Bullet
Jedes Projekt individuellJedes Projekt individuell
Vorsicht beim Beheben von offensichtlichen FehlernVorsicht beim Beheben von offensichtlichen Fehlern
13
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 25
Dann mal her mit den
x einfachen Schritten!
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 26
A
Foto von bella67: https://pixabay.com/de/spinnennetz-mit-wasserperlen-netz-921039/ (CC0 Public Domain Lizenz)
Sicherheitsnetz+ TestsSicherheitsnetz+ Tests
14
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 27
Foto von KlausHausmann: https://pixabay.com/de/bauarbeiter-bau-bauen-bohrhammer-921224/ (CC0 Public Domain Lizenz)
BSanierungSanierung
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 28
Foto von istara: https://pixabay.com/de/gold-bar-goldbarren-reich-geld-296115/ (CC0 Public Domain Lizenz)
Golden MasterGolden Master1
15
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 29
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 30
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
Live-CodingLive-Coding
16
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 31
Golden MasterGolden Master1Vorsicht bei ZufallsgeneratorenVorsicht bei Zufallsgeneratoren
Festlegen von Seeds(Pseudo-Random)Festlegen von Seeds(Pseudo-Random)
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 32
Foto von chrisli8020: https://pixabay.com/de/auto-maschine-spielzeug-786315/ (CC0 Public Domain Lizenz)
Subclass To TestSubclass To Test2
17
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 33
Subclass To TestSubclass To Test2
Seam (Nahtstelle)Ein Seam ist eine Stelle, an der man das Verhalten editieren kann, ohne direkt an dieser Stelle zu ändern.
Aufbrechen stark gekoppelter Abhängigkeiten aka Extract and Override
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 34
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
Live-CodingLive-Coding
18
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 35
Foto von PublicDomainPictures: https://pixabay.com/de/wasser-tropfen-tr%C3%B6pfchen-grau-72879/ (CC0 Public Domain Lizenz)
3 Extract Pure FunctionsExtract Pure Functions
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 36
"It's a classic, we call it a Klassiker"
3 Extract Pure FunctionsExtract Pure Functions
seiteneffektfrei
keine Statusänderung
19
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 37
3 Extract Pure FunctionsExtract Pure Functions
"pure function".substring(5);
UrlEncoder.encode("pure function");
Math.max(x, y);
System.out.println("unpure");
list.add(3);
Collections.sort(list);
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 38
3 Extract Pure FunctionsExtract Pure Functions
ZieleZiele
Codestellen isolierenCodestellen isolieren
Separat testbarSeparat testbar
Duplikation reduzierenDuplikation reduzieren
20
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 39
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
Live-CodingLive-Coding
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 40
Foto von AdinaVoicu: https://pixabay.com/de/zwilling-schwestern-liebe-m%C3%A4dchen-948713/ (CC0 Public Domain Lizenz)
Remove DuplicationRemove Duplication4
Don't Repeat YourselfDon't Repeat Yourself
Beachte: Rule of ThreeBeachte: Rule of Three
21
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 41
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
Live-CodingLive-Coding
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 42
Foto von blickpixel: https://pixabay.com/de/weihnachtsdekoration-pakete-geschenk-570797/ (CC0 Public Domain Lizenz)
Extract ClassExtract Class5
Large classLarge class
SRP verletztSRP verletzt
Unabhängiges Testen einzelner TeileUnabhängiges Testen einzelner Teile
ZieleZiele
Sauberes OO-DesignSauberes OO-Design
22
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 43
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
Live-CodingLive-Coding
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 44
Dependency InversionDependency Inversion6 Dependency InversionDependency Inversion
Dependency InversionDependency InversionTest non-public memberTest non-public member7
Dependency InversionDependency Inversion8 Mocking FrameworkMocking Framework
23
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 45
Zusammenfassung
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 46
Golden MasterGolden Master
Subclass To TestSubclass To Test
Extract Pure FunctionsExtract Pure Functions
Remove DuplicationRemove Duplication
Extract ClassExtract Class
Dependency InversionDependency Inversion6
5
4
3
2
1
Test non-public memberTest non-public member7
Mocking FrameworkMocking Framework8
24
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 47
Golden MasterGolden Master1
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 48
Subclass To TestSubclass To Test
Extract Pure FunctionsExtract Pure Functions
Extract ClassExtract Class
Dependency InversionDependency Inversion6
5
3
2
Test non-public memberTest non-public member7
Mocking FrameworkMocking Framework8
25
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 49
Extract Pure FunctionsExtract Pure Functions
Remove DuplicationRemove Duplication
Extract ClassExtract Class5
4
3
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH
Tools
50
Code CoverageCode Coverage
Approval TestsApproval Tests
InfinitestInfinitest
Eclipse MetricsEclipse Metrics
26
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 51
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)
https://github.com/jbrains/trivia
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH
Links
• Code-Beispiel der Live-Demo– https://github.com/sippsack/BadTelefon-Refactoring-Legacy-Code
• anderes Code-Beispiel für Legacy Code– https://github.com/jbrains/trivia
• Blog: Techniken zu Legacy Code-Retreat– http://blog.adrianbolboaca.ro/2014/04/legacy-coderetreat/
52
27
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH
Literaturhinweise
53
• Refactoring– Sprache: Englisch
Gebunden - 464 Seiten - Addison WeselyErscheinungsdatum: 1. Juni 1999ISBN: 0201485672
• Working Effectively with Legacy Code– Sprache: Englisch– Gebunden
Orientation in Objects GmbH
Weinheimer Str. 6868309 Mannheim
??
? ?
????
Fragen ?
28
Orientation in Objects GmbH
Weinheimer Str. 6868309 Mannheim
Vielen Dank für ihre Aufmerksamkeit !
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH
Zusatzmaterial
56
Dependency InversionDependency Inversion6 Dependency InversionDependency Inversion
Dependency InversionDependency InversionTest non-public memberTest non-public member7
Dependency InversionDependency Inversion8 Mocking FrameworkMocking Framework
29
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 57
Foto von tatlin: https://pixabay.com/de/zigarette-rauch-tabak-106610/ (CC0 Public Domain Lizenz)
6
Entkoppelndurch explizitesSetzen der Abhängigkeiten
Entkoppelndurch explizitesSetzen der Abhängigkeiten
Dependency InversionDependency Inversion
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 58
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
Live-CodingLive-Coding
30
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 59
Foto von Guian Bolisay: https://www.flickr.com/photos/instantvantage/5151841152/ (CC BY-SA 2.0)
7
Wirklich?Wirklich?
Test non-public memberTest non-public member
Gute Alternative bei Legacy Code!Gute Alternative bei Legacy Code!
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 60
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
Live-CodingLive-Coding
31
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 61
Foto von tatlin: https://pixabay.com/de/zigarette-rauch-tabak-106610/ (CC0 Public Domain Lizenz)
8
Subclass To Test on Steorids! Subclass To Test on Steorids!
MockingMocking
Interaktion mitUmgebung testenInteraktion mitUmgebung testen
Erwartete Parameter und AufrufreihenfolgeErwartete Parameter und Aufrufreihenfolge
Legacy Code meistern in x einfachen Schritten© 2016 Orientation in Objects GmbH 62
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
Live-CodingLive-Coding