Čo je to Refactoring?
Desiaty víkend s Linuxom Marec 2004 Richard „Virgo“ Richter
[email protected]
Agenda
●
Čo to je refaktoring?
●
Kedy a prečo refaktorovať?
●
Aký je vzťah návrhu (dizajnu) a refaktorovania? –
Koľko navrhovať a koľko nechať na neskôr?
●
Katalóg refaktoringov
●
Refaktoring naživo (snáď to výde :-))
Refaktoring
●
Refaktoring = zmena štruktúry/návrhu programu bez zmeny jeho chovania
●
Ciele refaktoringu: –
čistejší kód, lepší návrh
–
čitateľnejší kód, ľahšia ďalšia údržba
Refaktoring – prvý príkladík (1) ●
Vyňať metódu (Extract method)
...výpisy // vypocet sumy vsetkych poloziek int suma = 0; for (Iterator i = l.iterator(); i.hasNext();) { suma += ((Polozka) i.next()).cena(); } System.out.println(“Suma: “ + suma);
Refaktoring – prvý príkladík (2) ●
Vyňať metódu (Extract method)
...výpisy System.out.println(“Suma: “ + vyratatSumu(l));
private int vyratatSumu(List polozky) { int suma = 0; for (Iterator i=polozky.iterator(); i.hasNext();){ suma += ((Polozka) i.next()).cena(); } return suma; }
Refaktoring – nemeniť chovanie!
●
V zásade by človek buď mal pridávať fukncionalitu alebo refaktorovať – nie oboje naraz
●
Proces reštrukturalizácie kódu postupuje po malých krôčikoch (po jednotivých refaktoringoch)
●
–
predíde sa tak zmene chovania, ktorá nie je žiadúca
–
zamedzí sa tak aj “implementácii” nových chýb :-)
Testovať (unit testy, ...)
Refaktoring – čo to teda je?
●
Technika na vylepšenie už existujúceho kódu bez zmeny jeho chovania
●
Označenie pre jednoduchý krok (transformáciu), akúsi minimálnu jednotku v sérii úprav vedúcich k požadovanému zlepšeniu –
●
niektoré refaktoringy používajú iné – menšie a jednoduchšie
Po každej zmene (kroku refaktorovania) je projekt plne funkčný (teda... tak ako bol pred úpravou :-))
Kedy refaktorovať? ●
Univerzálna rada – kedykoľvek :-)))
●
Akonáhle hrozí, že sa ku kódu niekedy vrátite
●
Pred pridaním novej funkcie, pri hľadaní chýb, pri revízii
●
Vyžaduje refaktorovanie čas navyše? –
áno, ale s veľkou pravdepodobnosťou je to rýchlo návratná investícia, ak sa nepoužíva bezhlavo
●
Refaktorujte, keď cítite potrebu –
odkaz XP: nerobte, čo nebudete potrebovať
Aké kazy kódu má riešiť refaktoring?
●
Duplicitný kód
●
Dlhá metóda, veľká trieda
●
Dlhý zoznam parametrov
●
Zložité switche (hlavne založené na údajoch z inej triedy)
●
Zbytočná prešpekulovaná všeobecnosť
●
Potreba napísať komentár v kóde (nie k metóde či triede)
Prečo refaktorovať? ●
Hlavnou motiváciou je: –
lepšia štruktúra (návrh) kódu
–
lepšia čitateľnosť, a teda ľahšia údržba
●
Postupnými krokmi refaktoringu je možné “opraviť” aj dizajn
●
Refaktoring typicky vedie k čistejšiemu kódu –
zväčša narastá počet tried a metód
–
zmenšuje sa však veľkosť tried (aj počet metód v triede)
–
vznikajú tak menšie, jednoduchšie, znovupoužiteľnejšie kusy kódu
Rozprávka o úrovniach abstrakcie/zložitosti všeobecné
refaktoring
konkrétne-detaily
Návrh, implementácia a refaktoring
refaktoring
Návrh
kód implementácia
Refaktoring nie je mágia
●
Refaktoring je len systematický prístup k tomu, čo občas robíme tak či tak – reštrukturalizáciu kódu
●
Tomu zodpovedajú názvy refaktoringov –
vyňať (extract) metódu, triedu
–
včleniť/vložiť (inline) metódu, triedu
–
presunúť, premenovať, zmeniť signatúru, ...
Refaktoring – katalóg
●
Úpravy metód (nahradiť metódu objektom metódy)
●
Presúvanie prvkov medzi objektami/triedami (presunúť položku/metódu, delegovanie, vyňať triedu, ...)
●
Organizácia dát (zapúzdrenia, zmeniť hodnotu na odkaz, ...)
●
Zjednodušovanie podmienených výrazov (polymorfizmus)
●
Zjednodušovanie volania metód
●
Generalizácia (presuny vyššie/nižšie, vyňať podtriedu)
Príklad
●
Oprava implementácie príkazu ltell (last tell)
Záver ●
Refaktoring je systematický prístup k reštrukturalizácii kódu –
●
nemení sa chovanie programu, len štruktúra kódu
Cieľom refaktoringu je: –
dodatočná “oprava” návrhu, zvýšenie kvality kódu
–
zlepšenie čitateľnosti a zjednodušenie údržby kódu
●
http://www.refactoring.com
●
Refactoring: Improving the design of existing code od Martina Fowlera