Čo je to Refactoring? Desiaty víkend s Linuxom Marec 2004 Richard Virgo Richter richter@bgs.sk
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