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 refaktorování se provádí 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. Refaktorování pomáhá pochopit a více si ujasnit kód, což je vhodné zejména upravování zdrojového kódu po někom jiném.

Refaktorování se začalo používat mezi programátory ve Smalltalku, což je čistě objektový programovací jazyk, kde existoval první na tuto činnost vhodný nástroj. Později, když již bylo refaktorování 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í. Refaktorování je dnes již neodmyslitelnou součástí moderního programování.

Jak správně refaktorovat

editovat

Při nedostatečné znalosti může být refaktorování velice riskantní, jelikož se upravuje funkční kód a touto úpravou mohou být do kódu zavedeny 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ů, které se spustí 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ěkde nevznikla chyba. Většina programátorů provádí refaktorování, 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 refaktorováním, a to konkrétně postupem vyjmout metodu.

Kdy by se mělo refaktorovat

editovat

Martin Fowler ve své knize Refaktorování uvádí 22 „pachů v kódu, které jsou známkou toho, že by kód měl být refaktorován 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, 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ší:

  • Duplicitní kód – pokud je v kódu na více místech stejná struktura
  • Dlouhá metoda – záleží na každém, kolik řádků už je pro něj dlouhá metoda, pokud se taková objeví, většinou se v takové metodě řeší více problémů najednou a měla by být rozdělena na metody menší, které řeší právě jeden problém. Pak je kód i č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ěl by být řešen pomocí polymorfismu a vyčleněn do samostatné metody
  • Komentáře – pokud má programátor tendenci komentovat uvnitř metody svůj kód, je většinou lepší tento kód vyčlenit do samostatné metody, a pomocí vhodného názvu této metody odpadne nutnost komentáře

Další důvody proč a kdy začít s refaktorováním:

  • v kódu jsou složité struktury podmínek,
  • před přidáním nové funkcionality,
  • nedaří se najít chybu v kódu, opět pro čitelnost a sebepopisnost kódu.

A v neposlední řadě je tu „kritérium tří“: refaktorovat místo třetího opakovaní – pravidlo Dona Robertse.

Zásady refaktorování

editovat

Při refaktorování nelze zapomenout na metaforu dvou klobouků od Kenta Becka: v jednom klobouku se přidává funkcionalita a nemění struktura, v druhém klobouku se mění struktura a nepřidává funkcionalita. Lze je měnit klidně každých 5 minut, ale vždy je třeba vědět, co je prováděno, tedy jaký klobouk je na hlavě a nemíchat přidávání funkcionality s refaktorováním.

Refaktorování a vedoucí projektu

editovat

Obecně refaktorování 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 vedoucí projektu proti refaktorování, 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 refaktorování, které jsou detailně popsané v knize Refaktorování.

Úpravy metod

editovat
  • nahradit algoritmus
  • nahradit dočasnou proměnnou dotazem (metodou, která spočítá její hodnotu)
  • 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 se vyjme část kódu, který je vložen 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 – vyjme se část kódu třídy a vloží 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 – vyjmutí předka
  • vyjmout rozhraní – vyjmutí 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 dotaz 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

Refaktorování a návrhové vzory

editovat

Existuje vazba mezi refaktorováním a návrhovými vzory, a to taková, že vzory popisují definovaný cíl a naopak refaktorování popisuje způsob, jak se k tomuto cíli dostat.

Podpora refaktorování

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 nabízena podpora při refaktorování. Technika vyjmout metodu z dlouhé metody již tedy není složitá a prakticky u něj není ani potřeba více přemýšlet, udělá jej program. Někteří si při psaní kódu ani neuvědomují, že například změna názvu proměnné je také refaktorování, které provede program, avšak dříve tato změna byla velmi náročná.

Literatura

editovat
  • FOWLER, Martin. Refaktoring : Zlepšení existujícího kódu (původním názvem: Refactoring: Improving the Design of Existing Code). Překlad Vladimír Lahoda. Praha: Grada, 2003. ISBN 80-247-0299-1. 

Související články

editovat

Externí odkazy

editovat