Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf ·...

Post on 26-May-2020

18 views 0 download

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