refaktorování - code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/oop/hajek-refactoring.pdf ·...
TRANSCRIPT
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
RefaktorováníCode refactoring
Lukáš Hájek
Objektově orientované programováníČVUT v Praze - Fakulta jaderná a fyzikálně inženýrská
8. října 2013
1 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Struktura prezentace
1 Co je refaktorování
2 Historie
3 Proč refaktorovat
4 Kdy refaktorovat
5 Jak refaktorovat
6 Code obfuscation
2 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Co je refaktorování?
Systematický proces provádění změn v kódu bez ovlivněnífunkčnostiPouze drobné změnyVylepšení / zpřehlednění kódu
3 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Historie
Na začátku 80. let mezi programátory jazyka Forth –pojem „factoring“Přelom 80. a 90. let – používání refaktorovacích technikprogramátory ve smalltalkuPočátek 90. let – první akademické práce o refaktorování(funckionální i procedurální)1999 – Fowler Martin, Refactoring: Improving the Designof Existing Code.
4 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Proč refaktorovat?
Zvýšení přehlednosti kóduPři psaní programu je jednodušší myslet pouze nafunkčnostZefektivnění kóduOdstranění repetetivityZbavení se zbytečných proměnnýchZlepšení vlastní reprezentace jakožto programátora
5 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Vyplatí se refaktorování?
6 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Kdy refaktorovat? 1/2
Již při vývoji kódu (průběžně) – nedílná součást vývojePokud po nás bude kód číst někdo jinýPokud se chci ke kódu po nějaké době vrátitChceme si ujasnit cizí kódKód je ve špatném stavu, málo flexibilní, chybnýNelze nalézt chybu v kódu
7 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
„The first time you do something, you just do it. The secondtime you do something similar, you wince at the duplication,but you do the duplicate thing anyway. The third time you dosomething similar, you refactor.“
Don Roberts
8 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Kdy refaktorovat? 2/2
Příliš mnoho publicMnoho komentářů (⇒ nejasný kód)Přílišné řetězeníDlouhé metodyVelké třídyŠpatná dědičnost
9 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Refaktorujte brzo, refaktorujte často
10 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Jak refaktorovat?
Opatrnost, nepřeceňování svých zkušenostíPro ladění rychlosti kódu – profilerPodrobný katalog na adresehttp://www.refactoring.com/catalog/
11 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Pozor!Refaktorování je riskantní!
Připravovat sady testůTestovat po co nejmenších krocích
12 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
13 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Martin Fowler – 22 „pachů“ kóduPro každý „pach“ jiná technika
by Kent Beck and Martin Fowler„If it stinks, change it.“
Grandma Beck, discussing child-rearing philosophy
14 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Duplicitní volání u podmínek
if (isSpecialDeal()) {total = price * 0.95;send();}
else {total = price * 0.98;send();}
Nahradit za:
if (isSpecialDeal())total = price * 0.95;
elsetotal = price * 0.98;
send();
15 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Duplicitní kódRodičovská třída
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 10
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Milk Beer
Drink
getName() getName()
16 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Duplicitní kódRodičovská třída — správný postup
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 10
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Milk Beer
Drink
getName()
17 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Vícenásobné podmínky
Původně:
double disabilityAmount() {if (_seniority < 2) return 0;if (_monthsDisabled > 12) return 0;if (_isPartTime) return 0;// compute the disability amount
Nahradit za:
double disabilityAmount() {if (isNotEligableForDisability()) return 0;// compute the disability amount
18 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Komplikované if-then-else
Původně:
if (date.before (SUMMER_START) ||date.after(SUMMER_END))
charge = quantity * _winterRate+ _winterServiceCharge;
else charge = quantity * _summerRate;
Nahradit za:
if (notSummer(date))charge = winterCharge(quantity);
else charge = summerCharge (quantity);
19 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Veřejné → soukromé
Původně:
public String _name
Nahradit za:
private String _name;public String getName() {return _name;}public void setName(String arg) {_name = arg;}
20 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
21 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Příliš dlouhá metoda nebo struktura
Duplicitní kódDříve – snaha o co nejmenší počet voláníDnes – přehlednost
22 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Vyjmutí metody
Původně:
void printOwing() {printBanner();
//print detailsSystem.out.println ("name: " + _name);System.out.println ("amount " + getOutstanding());}
23 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Vyjmutí metodyOprava
Nahradit za:
void printOwing() {printBanner();printDetails(getOutstanding());}
void printDetails (double outstanding) {System.out.println ("name: " + _name);System.out.println ("amount " + outstanding);}
24 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Příliš dlouhá metodaOdstranění nepotřebných proměnných
Původně:
double basePrice = anOrder.basePrice();return (basePrice > 1000)
Nahradit za:
return (anOrder.basePrice() > 1000)
25 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Dlouhý seznam parametrůPředávání celého objektu
Původně:
int min = dailyTemperature.getMin();int max = dailyTemperature.getMax();myStat = stat.range(min, max);
Nahradit za:
myStat = stat.range(&dailyTemperature);
26 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Komentáře
Špatně pojmenovaná funkce?Nejasný kód?Komentáře uvnitř metod – lepší vyjmout na samostatnémísto
Co, jak a proč metoda dělá
27 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Přiřazení
Původně:
int x;x = 7;
Nahradit za:
int x = 7;
Hodnota vždy nastavenáZpomalení (C++)
28 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Code obfuscation
Inverzní postup k refaktorování
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}
29 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Shrnutí
Refaktorování - co to jeKdy a proč refaktorovatTechniky refaktorování
30 / 31
Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí
Děkuji za pozornost!
Celá prezentace je dostupná nahttp://kfe.fjfi.cvut.cz/~hajeklu2/files/OOP/
31 / 31