+ All Categories
Home > Documents > Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf ·...

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

Date post: 26-May-2020
Category:
Upload: others
View: 18 times
Download: 0 times
Share this document with a friend
31
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”enrskÆ 8. jna 2013 1 / 31
Transcript
Page 1: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 2: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 3: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 4: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 5: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 6: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí

Vyplatí se refaktorování?

6 / 31

Page 7: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 8: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 9: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 10: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí

Refaktorujte brzo, refaktorujte často

10 / 31

Page 11: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 12: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 13: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí

13 / 31

Page 14: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 15: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 16: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 17: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 18: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 19: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 20: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 21: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

Co je refaktorování Historie Proč refaktorovat Kdy refaktorovat Jak refaktorovat Code obfuscation Shrnutí

21 / 31

Page 22: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 23: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 24: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 25: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 26: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 27: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 28: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 29: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 30: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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

Page 31: Refaktorování - Code refactoringkfe.fjfi.cvut.cz/~hajeklu2/files/OOP/Hajek-Refactoring.pdf · 2013-10-08 · Refaktorování - Code refactoring Author: Luká Hájek Created Date:

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


Recommended