Top Banner
Refactoring C# Legacy Code Stefan Lieser @StefanLieser http://refactoring-legacy-code.net
95

Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Aug 12, 2019

Download

Documents

trinhphuc
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Refactoring C#Legacy Code

Stefan Lieser @StefanLieser

http://refactoring-legacy-code.net

Page 2: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Houston, we’ve had a problem.

http://er.jsc.nasa.gov/seh/13index.jpg

Page 3: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Wandelbarkeit

https://pixabay.com/de/chamäleon-hautnah-exotische-grün-1414084/

Page 4: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Investitionsschutz = Wandelbarkeit

Nicht-funktionale Anforderungen

Funktionale Anforderungen

Page 5: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Das Problem besteht aus drei Teilen:

• Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komplexe Refactorings sind notwendig

Page 6: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Das Dilemma:

• Um Tests zu ergänzen, => muss refactored werden.

• Um zu refactoren, => müssen Tests ergänzt werden.

Page 7: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

KISS - Keep It Simple Stupid• „Einfach“ in Bezug auf

• Schreiben / Erstellen? • Lesen / Modifizieren !

Page 8: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Ein Sicherheitsnetz spannen:• Versionskontrolle • Continuous Integration • Code Reviews • Automatisierte Tests

Page 9: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Begründung für Refactorings:

• NICHT: Clean Code Developer, Prinzipien,Werte, Craftsmen, …

• Sondern Kundennutzen: • Neues Feature • Bugfix

Page 10: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Es gibt zwei Artenvon Refactorings:

einfache und

komplexe.

Page 11: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Einfache RefactoringsRename Extract Method Introduce VariableIntroduce Parameter etc.

Vollständig werkzeuggestützt durchführbar

Page 12: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Komplexe RefactoringsNicht mehr ausschließlich

werkzeuggestützt durchführbar

Page 13: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Einfache RefactoringsLesbarkeit herstellen.

Erkenntnisse über den Code im Code sichern.

Page 14: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

publicdoubleEndpreis(intanzahl,doublenetto){ varnettoPreis=anzahl*netto;returnnettoPreis*1.19;}

publicdoubleEndpreis(intanzahl,doublenetto){ return(anzahl*netto)*1.19;}

publicdoubleEndpreis(intanzahl,doublenetto){ varnettoPreis=anzahl*netto;varbruttoPreis=nettoPreis*1.19;returnbruttoPreis;}

Introduce Variable

Introduce Variable

Page 15: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

publicdoubleEndpreis(intanzahl,doublenetto){constdoublemwSt=0.19;varnettoPreis=anzahl*netto;varsteuer=nettoPreis*mwSt;varbruttoPreis=nettoPreis+steuer;returnbruttoPreis;}

publicdoubleEndpreis(intanzahl,doublenetto){ varnettoPreis=anzahl*netto;varbruttoPreis=nettoPreis*1.19;returnbruttoPreis;} Nicht mehr nur

toolgestützt!

Page 16: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

publicIDictionary<string,string>ToDictionary(stringconfiguration){returnInsertIntoDictionary(SplitIntoKeyValuePairs(SplitIntoSettings(configuration)));}

"a=1;b=2;c=3"=>{{"a","1"},{"b","2"},{"c","3"}}

Page 17: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

publicIDictionary<string,string>ToDictionary(stringconfiguration){varsettings=SplitIntoSettings(configuration);varpairs=SplitIntoKeyValuePairs(settings);varresult=InsertIntoDictionary(pairs);

returnresult;}

publicIDictionary<string,string>ToDictionary(stringconfiguration){returnInsertIntoDictionary(SplitIntoKeyValuePairs(SplitIntoSettings(configuration)));}

Introduce Variable

Page 18: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

publicIDictionary<string,string>ToDictionary(stringconfiguration){//Splitconfigurationintosettingsvarsettings=configuration.Split(';');

//Splitsettingsintokey/valuepairsvarpairs=newList<KeyValuePair<string,string>>();foreach(varsettinginsettings){varkeyAndValue=setting.Split('=');pairs.Add(newKeyValuePair<string,string>(keyAndValue[0],keyAndValue[1]));}

//Insertpairsintodictionaryvarresult=newDictionary<string,string>();foreach(varpairinpairs){result.Add(pair.Key,pair.Value);}

returnresult;}

Extract Method

Page 19: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

publicIDictionary<string,string>ToDictionary(stringconfiguration){varsettings=SplitIntoSettings(configuration);varpairs=SplitIntoPairs(settings);varresult=InsertIntoDictionary(pairs);returnresult;}

Page 20: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

foreach(varsettinginsettings){varkey_and_value=setting.Split('=');result.Add(key_and_value[0],key_and_value[1]);}

Extract Method

foreach(varsettinginsettings){AddSettingToResult(setting,result);}

privatestaticvoidAddSettingToResult(stringsetting,Dictionary<string,string>result){varkey_and_value=setting.Split('=');result.Add(key_and_value[0],key_and_value[1]);}

Page 21: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

if(DateTime.Now>=weckZeit){using(varsoundPlayer=newSoundPlayer(@"chimes.wav")){soundPlayer.Play();}timer.Stopp();}

Extract Method

if(WeckzeitErreicht()){using(varsoundPlayer=newSoundPlayer(@"chimes.wav")){soundPlayer.Play();}timer.Stopp();}

privateboolWeckzeitErreicht(){returnDateTime.Now>=weckZeit;}

Page 22: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

if(WeckzeitErreicht()){using(varsoundPlayer=newSoundPlayer(@"chimes.wav")){soundPlayer.Play();}timer.Stopp();}

privateboolWeckzeitErreicht(){returnDateTime.Now>=weckZeit;}

Extract Method

if(WeckzeitErreicht()){Wecken();}

Page 23: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

publicstringFormat(stringvorname,stringnachname,stringstrasse,stringhn,stringplz,stringort){return$"{vorname}{nachname},{strasse}{hn},{plz}{ort}";}

publicstringFormat(Adresseadresse,stringvorname,stringnachname){return$"{vorname}{nachname},{adresse.Strasse}{adresse.Hn},{adresse.Plz}{adresse.Ort}";}

Extract Class from Parameters

Page 24: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

publicclassAdresse{privatestringstrasse;privatestringhn;privatestringplz;privatestringort;

publicAdresse(stringstrasse,stringhn,stringplz,stringort){this.strasse=strasse;this.hn=hn;this.plz=plz;this.ort=ort;}

publicstringStrasse{get{returnstrasse;}}...}

Page 25: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

publicstring[]CsvTabellieren(string[]csvZeilen){_csvZeilen=csvZeilen;

RecordsErstellen();int[]breiten=SpaltenbreitenErmitteln();TabelleErstellen(breiten);

return_tabelle;}

publicstring[]CsvTabellieren(string[]csvZeilen){varrecords=RecordsErstellen(csvZeilen);int[]breiten=SpaltenbreitenErmitteln(records);vartabelle=TabelleErstellen(breiten,records);

returntabelle;}

Page 26: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Automatisierte Tests ergänzen

Page 27: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Herausforderungen beim Ergänzen von Tests:• Abhängigkeiten • Aspekte nicht getrennt • Ressourcenzugriffe • Sichtbarkeit • Globaler Zustand

Page 28: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Lösungen:• Zunächst vermehrt Integrationstests,

dann Refactoring und Unit Tests ergänzen. • Mock Frameworks wie

TypeMock Isolator oder Telerik JustMock einsetzen.

Page 29: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Wenige Integrationstests

Viele Unittests

Viele Integrationstests

Wenige Unittests

Page 30: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

usingSystem.Collections.Generic;usingSystem.IO;

namespaceressourcen{publicclassCsvReader{publicIEnumerable<string[]>Read(stringfilename){varlines=File.ReadAllLines(filename);foreach(varlineinlines){varfields=line.Split(';');yieldreturnfields;}}}}

Integrierter Ressourcenzugriff

Page 31: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

[Test,Isolated]publicvoidIsolated_logic_test(){varsut=newCsvReader();Isolate.WhenCalled(()=>File.ReadAllLines("")).WillReturn(new[]{"a;b;c","1;2;3"});

varrecords=sut.Read("egal.csv").ToArray();

Assert.That(records[0],Is.EqualTo(new[]{"a","b","c"}));Assert.That(records[1],Is.EqualTo(new[]{"1","2","3"}));}

Verhalten der Attrappe beschreiben

Page 32: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

publicclassPrivatesZeugs{privatevoidSaveToDatabase(stringdata){Console.WriteLine("Ressourcenzugriff..."+data);thrownewException();}

publicvoidDoSomething(){Console.WriteLine("DoSomething...");SaveToDatabase("datendatendaten...");}}

Page 33: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

[TestFixture]publicclassPrivateMethoden{[Test]publicvoidPrivate_Methode_nicht_ausführen(){varsut=newPrivatesZeugs();Isolate.NonPublic.WhenCalled(sut,"SaveToDatabase").IgnoreCall();

sut.DoSomething();}}

Verhalten der Attrappe beschreiben

Page 34: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Komplexe RefactoringsMikado Methode

Page 35: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 36: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 37: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 38: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 39: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 40: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 41: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 42: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 43: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 44: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Hm… ist das wirklich clever?

Page 45: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 46: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Cha

Page 47: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Cha

Page 48: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

B

Cha

Page 49: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Revert!

Change

B

Cha

Page 50: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

B

Cha

Page 51: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

B

D

Cha

C

Page 52: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Revert!

Change

B

D

Cha

C

Page 53: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

B

D

Cha

C

Page 54: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

B

D

Cha

C

Page 55: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

B

D

Cha

C

E

Page 56: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Revert!

Change

B

D

Cha

C

E

Page 57: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

B

D

Cha

C

E

Page 58: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

B

D

Cha

C

E

Page 59: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

B

D

F

Cha

C

E

Page 60: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Revert!

Change

B

D

F

Cha

C

E

Page 61: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

B

D

F

Cha

C

E

Page 62: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

B

D

F

Cha

C

E

Page 63: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

B

D

F

A

Cha

C

E

Page 64: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Revert!

Change

B

D

F

A

Cha

C

E

Page 65: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 66: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 67: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 68: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 69: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 70: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 71: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 72: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 73: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 74: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 75: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 76: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Change

Page 77: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

✓Change

Page 78: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

✓Change

Page 79: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Hurra!

Page 80: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

B

D

F

A

Change

C

E

Page 81: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

B

D

F

A

Change

C

E

Ana l

y s e

Re f a c t o r i ng

Page 82: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

NachLösungensuchen

DasMikadoZielnotieren

DasZielbzw.dieaktuelleVorbedingungnaivimplementieren

GibteseinProblem?

IstdasMikadoZielerreicht?

Nein CommitderÄnderungenindieVersionskontrolle

Ja

ErgibtdieÄnderungSinn?

Ja

Fertig!

Nein

Nein

NächsteVorbedingungauswählen,umdamitzuarbeiten

DieLösungenalsVorbedingungenimMikadoGraphnotieren

VerwerfenallerÄnderungenmitHilfederVersionskontrolle

Start

Ja

Page 83: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

• Änderung naiv ausführen.

•Herausfinden, was kaputt gegangen ist.Dies sind die Vorbedingungen für die Änderung.

•Visualisieren: zum Mikado Graph hinzufügen

• REVERT !!!

•Wiederholen, bis nichts mehr kaputt geht.

Page 84: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Demo

Page 85: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Uhrzeit wird fortlaufend angezeigt

Page 86: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Uhrzeit wird fortlaufend angezeigt

Eigene Timerklasseerstellen

Page 87: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Uhrzeit wird fortlaufend angezeigt

Eigene Timerklasse integrieren

Eigene Timerklasseerstellen

Page 88: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Uhrzeit wird fortlaufend angezeigt

Anzeigen der Uhrzeit auf eigenem Event

Eigene Timerklasse integrieren

Eigene Timerklasseerstellen

Page 89: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Uhrzeit wird fortlaufend angezeigt

Anzeigen von Uhrzeit und REstzeit trennen

Anzeigen der Uhrzeit auf eigenem Event

Eigene Timerklasse integrieren

Eigene Timerklasseerstellen

Page 90: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Ziel

UnterzielUnterziel

Unterziel

Unterziel

Unterziel

Unterziel

Unterziel

Analyse

Refactoring

Page 91: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Vorteile der Mikado Methode

• Immer auslieferbar • Nur auf dem Trunk, kein Branching • Fokus auf das Ziel; nur das Nötigste tun • Visualisierung

Page 92: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Fazit

• Einfache Refactorings: Lesbarkeit • Automatisierte Tests: Korrektheit • Komplexe Refactorings: Wandelbarkeit

Page 93: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Onlinekurs „Automatisiertes Testen von .NET Anwendungen“

• zur Zeit kostenlos • http://stefanlieser.teachable.com

Page 94: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

Fragen?

Page 95: Refactoring C# Legacy Code - entwicklertag.de · Das Problem besteht aus drei Teilen: • Lesbarkeit/Verständlichkeit ist nicht gegeben • Automatisierte Tests fehlen • Komple

http://refactoring-legacy-code.net

http://linkedin.com/in/stefanlieser

https://twitter.com/StefanLieser

http://xing.com/profile/stefan_lieser