Refaktorování

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledá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 zdrojový kód po někom jiném.

Vznik[editovat | editovat zdroj]

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 | editovat zdroj]

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 | editovat zdroj]

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 | editovat zdroj]

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 | editovat zdroj]

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 | editovat zdroj]

Zde se uvádí výčet technik refaktoringu, které jsou detailně popsané v knize Refaktoring.

Úpravy metod[editovat | editovat zdroj]

  • 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 | editovat zdroj]

  • 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 | editovat zdroj]

  • 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 | editovat zdroj]

  • 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 | editovat zdroj]

  • 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 | editovat zdroj]

  • roztrhnout dědičnost
  • převést procedurální návrh do objektů
  • vyjmout hierarchii
  • oddělit datový model od prezentace

Ostatní techniky[editovat | editovat zdroj]

  • 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 | editovat zdroj]

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 | editovat zdroj]

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á.

Odkazy[editovat | editovat zdroj]

Literatura[editovat | editovat zdroj]

  • FOWLER, Martin. Refaktoring : Zlepšení existujícího kódu. Překlad Vladimír Lahoda. Praha : Grada, 2003. ISBN 80-247-0299-1.  

Externí odkazy[editovat | editovat zdroj]