Refaktorování
Refaktorování je disciplinovaný proces provádění změn v softwarovém systému takovým způsobem, že nemají vliv na vnější chování kódu, ale vylepšují jeho vnitřní strukturu s minimálním rizikem vnášení chyb. Při refaktoringu provádíme malé až primitivní změny, ale celkový efekt je velký a to v podobě čistšího, průhlednějšího a čitelnějšího kódu, kód se také lépe udržuje a rozšiřuje. Zlepšuje se také celková kvalita kódu a architektura, snižuje se počet chyb a tím i zvyšuje rychlost vývoje programu. Refaktoring nám pomáhá pochopit a více si ujasnit kód, což je vhodné zejména, pokud upravujeme kód po někom jiném.
Obsah |
Vznik[editovat]
Refaktoring se začal používat mezi programátory ve Smalltalku, což je čistě objektový programovací jazyk, kde existoval první nástroj na refaktoring. Později, když byl již refaktoring v povědomí některých programátorů a metody refaktorování jimi byly dostatečně prověřeny, napsal Martin Fowler za velké pomoci těchto zkušených programátorů knihu Refactoring: Improving the Design of Existing Code, která je dodnes využívána jako základní příručka k poznání a naučení se správného refaktorování. Refaktoring je dnes již neodmyslitelnou součástí moderního programování.
Jak správně refaktorovat[editovat]
Pokud refaktoring zcela neovládáme, může být velice riskantní, jelikož upravujeme funkční kód a touto úpravou si do kódu můžeme zavést velice záludné chyby a program již nemusí být funkční. Proto mezi hlavní zásadu patří mít před samotným refaktorováním připravenou dobrou sadu testů, kterou spustíme po každé změně.
Další důležitá zásada je refaktorovat po malých krocích a to neustále a ihned testovat, zda nám někde nevznikla chyba. Většina programátorů provádí refaktoring, aniž by o něm věděla, jelikož jedna z nejdůležitějších zásad programátora je, aby ve svém kódu neměl duplicity. Když nějakou duplicitu objeví, snaží se jí zbavit a to většinou nevědomky refaktoringem a to konkrétně postupem vyjmout metodu.
Kdy refaktorovat[editovat]
Martin Fowler ve své knize Refaktoring uvádí 22 takzvaných pachů v kódu, které jsou zvěstí toho, že bychom kód měli začít refaktorovat a zároveň uvádí, jaké techniky jsou pro ten který pach třeba. To ale neznamená, že to tak musí vždy být, samozřejmě vždy závisí na konkrétní situaci. Zde jsou nastíněny pouze některé pachy v kódu, ty nejzákladnější a většinou i nejčastější. Pro podrobnější informace vizte knihy v části Literatura.
- Duplicitní kód – pokud najdeme v kódu na více místech stejnou strukturu
- Dlouhá metoda – záleží na každém, kolik řádků už je pro něj dlouhá metoda, pokud takovou najdeme, většinou se v takové metodě řeší více problémů najednou a měli bychom jí rozdělit na metody menší, které řeší právě jeden problém, poté je kód čitelnější
- Velká třída – pokud se třída snaží dělat více věcí najednou, není to z pohledu objektově orientovaného programování dobře, jelikož každá třída by správně měla řešit právě jeden problém, tudíž řešením je rozdělit třídu na více tříd
- Dlouhý seznam parametrů – metody s dlouhým počtem parametrů jsou většinou nesrozumitelné, pokud tyto předávané parametry obsahuje nějaký objekt, je řešením předat jako parametr tento objekt
- Příkaz switch – měli bychom ho řešit pomocí polymorfie a vyčlenit ho do samostatné metody
- Komentáře – pokud máme tendenci komentovat uvnitř metody náš kód je většinou lepší tento kód vyčlenit do samostatné metody a pomocí vhodného názvu této metody nám odpadne nutnost komentáře
Další důvody, kdy začít s refaktoringem: pokud máme v programu složité struktury podmínek, měli bychom refaktorovat, stejně tak jako bychom měli refaktorovat vždy před přidáním nějaké nové funkcionality. Pokud nemůžeme najít chybu v kódu, je to další důvod, proč bychom měli refaktorovat. A v neposlední řadě je tu zásada tří - refaktorovat místo třetího opakovaní - pravidlo Dona Robertse.
Zásady refaktoringu[editovat]
Při refaktorování nikdy nesmíme zapomenout na metaforu dvou klobouků od Kenta Becka: v jednom klobouku přidáváme funkcionalitu a neměníme strukturu, v druhém klobouku měníme strukturu a nepřidáváme funkcionalitu. Můžeme je měnit klidně každých 5 minut, ale vždy musíme vědět, co děláme, tedy jaký klobouk máme na hlavě a nemíchat přidávání funkcionality s refaktoringem.
Refaktoring a vedoucí projektu[editovat]
Obecně refaktoring nemají rádi vedoucí projektů, protože může trvat velice dlouho, projekt zbrzdit a nepřinést na první pohled žádný viditelný výsledek. Pokud je i váš vedoucí projektu proti refaktoringu, je třeba vyzdvihnout především jeho pozitiva mimo jiné i to, že náklady na budoucí provoz se sníží, stejně tak jako doba potřebná k přidání nové funkčnosti a těmito argumenty se ho snažit přesvědčit.
Techniky refaktoringu[editovat]
Zde se uvádí výčet technik refaktoringu, které jsou detailně popsané v knize Refaktoring.
Úpravy metod[editovat]
- nahradit algoritmus
- nahradit dočasnou proměnnou dotazem
- nahradit metodu metodou objektu
- odstranit přiřazení parametrům
- přejmenovat metodu a přejmenovat položku – změna názvu na lepší a výstižnější
- rozdělit dočasnou proměnnou
- vložit metodu
- vložit dočasnou proměnnou
- vyjmout metodu – z dlouhé metody vyjmeme část kódu, který dáme do nové metody
- zavést vysvětlující proměnnou
Přesouvání prvků mezi objekty[editovat]
- odstranit prostředníka
- přesunout metodu a přesunout položku – přesun do vhodné třídy
- skrýt delegáta
- vyjmout třídu – vyjmeme část kódu třídy a vložíme ho do třídy nové
- vložit třídu
- zavést cizí metodu
- zavést místní rozšíření
Organizace dat[editovat]
- nahradit datovou položku objektem
- nahradit pole objektem
- zapouzdřit soukromou položku – k přístupu k proměnné použít gettery a settery
- změnit hodnotu na odkaz
- změnit odkaz na hodnotu
- zavést objekt null
- zavést předpoklad
Generalizace[editovat]
- nahradit dědičnost delegováním
- nahradit delegování dědičností
- přesunout metodu výš, přesunout položku výš – přesun do předka
- přesunout metodu níž, přesunout položku níž – přesun do potomka
- přesunout tělo konstruktoru výš – přesun do předka
- vyjmout podtřídu
- vyjmout rodičovskou třídu – vyjmu předka
- vyjmout rozhraní – vyjmu rozhraní
- vytvořit šablonovou metodu
- zrušit hierarchii
Zjednodušení volání metod[editovat]
- nahradit chybový kód výjimkou
- nahradit konstruktor tovární metodou
- nahradit parametr explicitními metodami
- nahradit parametr metodou
- nahradit výjimku testem
- oddělit odkaz a modifikátor
- odstranit parametr
- odstranit přístupovou metodu pro zápis
- parametrizovat metodu
- přejmenovat metodu a přejmenovat položku – změna názvu na lepší a výstižnější
- přidat parametr
- skrýt metodu
- zachovat celý objekt
- zapouzdřit přetypování na potomka
- zavést objekt pro parametry
Velké programování[editovat]
- roztrhnout dědičnost
- převést procedurální návrh do objektů
- vyjmout hierarchii
- oddělit datový model od prezentace
Ostatní techniky[editovat]
- duplikovat sledovaná data
- nahradit kód typu podtřídami
- nahradit kód typu třídou
- nahradit magické číslo symbolickou konstantou
- nahradit podtřídu položkami
- nahradit vnořenou podmínku varovnými klausulemi
- nahradit podmínku polymorfismem
- nahradit kód typu stavem nebo strategií
- odstranit příznak
- zachovat celý objekt
Refaktoring a návrhové vzory[editovat]
Existuje zde vazba mezi refaktoringem a návrhovými vzory a to taková, že vzory vlastně popisují definovaný cíl a naopak refaktorování popisuje způsob jak se k tomuto cíli dostat. Pokud se podíváte na jednotlivé techniky, poznáte již z jejich jména, že mají co dočinění s návrhovými vzory, viz vytvořit šablonovou metodu, zavést objekt null, nahradit konstruktor tovární metodou nebo nahradit kód typu stavem nebo strategií.
Podpora refaktoringu[editovat]
Některé postupy při refaktorování je možné přesně definovat a zcela automatizovat a dnes je již v moderních vývojových prostředích jako je Eclipse a další nabízena podpora při refaktoringu. Technika vyjmout metodu z dlouhé metody již tedy není vůbec složitá a prakticky u něj nemusíte ani moc přemýšlet, udělá jej za vás program. Někteří si při psaní kódu ani neuvědomují, že např. změna názvu proměnné je také refaktoring, který za nás provede program, avšak dříve tato změna byla velmi náročná.
Literatura[editovat]
- Refaktoring: zlepšení existujícího kódu - Martin Fowler, nakladatelství Grada, rok vydání 2003, ISBN: 80-247-0299-1
Externí odkazy[editovat]
- (anglicky) Stránka Martina Fowlera o refaktoringu