Refaktorovat je IT slangový termín označující změnu vnitřní struktury kódu bez změny jeho vnějšího chování. Cílem refaktorování je učinit kód čistším, srozumitelnějším a snadněji udržovatelným. Podle Martina Fowlera v knize „Refactoring: Improving the Design of Existing Code” (Addison-Wesley, 2019) je refaktorování povinnou praxí udržování zdraví kódové základny a jeho pravidelné používání snižuje celkové náklady na vlastnictví projektu o 20-30%.
Hlavní body
Refaktorovat — je proces změny vnitřní struktury programového kódu s cílem zlepšit jeho kvalitativní charakteristiky beze změny pozorovatelného chování. Termín zavedl do širšího povědomí Martin Fowler v roce 1999 a samotná praxe se stala jedním ze základů agilního vývoje a extrémního programování.
Klíčovou charakteristikou refaktorování — je zachování funkčnosti. Po refaktorování musí program provádět přesně stejné akce a vracet stejné výsledky jako před změnami. Zárukou toho jsou automatizované testy, které se spouštějí po každém mikrokroku refaktorování. Pokud jsou testy zelené — chování je zachováno. Pokud jsou červené — refaktorování bylo provedeno nesprávně nebo změnilo chování, což znamená, že se již nejedná o refaktorování, ale o modifikaci funkčnosti.
V průmyslu přetrvává mylná představa: každá oprava kódu je nazývána refaktorováním. Ve skutečnosti je přepisování kódu se změnou chování „rewrite” nebo „rework”, nikoli refaktorování. Rozdíl je zásadní: refaktorování je kontrolovaný, bezpečný proces, zatímco přepisování se změnou logiky je plnohodnotný nový vývoj se všemi souvisejícími riziky.
Kapitalizace znalostí o refaktorování v českém jazykovém prostředí probíhá stejnými mechanismy jako u jiných IT termínů: převzetí anglického refactor s přidáním české přípony. Vzdělávací programy softwarového inženýrství a překlady knih upevnily tento termín v profesionálním lexikonu.
Je důležité rozlišovat refaktorování od úplného přepisování kódu (rewrite). Refaktorování — je série malých, bezpečných transformací, z nichž každá zachovává chování. Přepisování — vytváření nové implementace od nuly, často se změnou architektury, technologií a chování. Výzkum Standish Group (2023) ukazuje, že projekty, které zvolí úplný rewrite, selhávají ve 40% případů, zatímco projekty pravidelně refaktorující mají o 25% nižší úroveň technického dluhu.
Refaktorování řeší několik klíčových úkolů, z nichž každý přímo ovlivňuje rychlost a náklady vývoje. Pochopení těchto cílů pomáhá týmu správně stanovit priority a ospravedlnit čas věnovaný refaktorování před zainteresovanými stranami.
Kód se píše jednou, ale čte se desítky a stokrát. Pokud vývojář stráví 30 minut pochopením toho, co funkce dělá — to je přímá ztráta produktivity. Čitelný kód snižuje kognitivní zátěž a urychluje zaškolování nových členů týmu. Techniky jako Rename Method, Extract Variable a Introduce Explaining Variable jsou zaměřeny právě na zvýšení srozumitelnosti kódu. Podle výzkumu Developer Productivity (Microsoft Research, 2023) tráví vývojáři až 60% času čtením kódu, nikoli jeho psaním, což činí čitelnost jedním z hlavních faktorů produktivity.
Princip DRY (Don’t Repeat Yourself) — jeden ze základních v programování. Duplicita kódu vede k tomu, že stejná změna musí být provedena na více místech, což zvyšuje riziko chyb a zapomenutých oprav. Refaktorování technikami Extract Method a Pull Up Method umožňuje odstranit duplicitu a centralizovat logiku.
Metriky cyklomatické složitosti a hloubky vnoření přímo korelují s počtem defektů v kódu. Pokud má funkce cyklomatickou složitost vyšší než 10-15, je obtížné ji testovat a snadno se rozbije. Refaktorování pomocí Replace Conditional with Polymorphism, Decompose Conditional a Extract Method umožňuje snížit složitost na kontrolovatelnou úroveň. Výzkum NIST (2024) ukazuje, že moduly s vysokou složitostí obsahují 2-3krát více defektů na tisíc řádků kódu.
Jedním z hlavních důvodů refaktorování — je potřeba přidat novou funkčnost. Pokud současná struktura kódu neumožňuje provést změnu bez porušení stávajícího chování, refaktorování pomáhá připravit půdu. „Pravidlo kempování” (nech kód čistší, než jsi ho našel) — jedno z doporučení Martina Fowlera, které mění refaktorování z epizodické aktivity v trvalou praxi.
Data analýzy 500 open-source projektů na GitHubu (IEEE Transactions on Software Engineering, 2024) ukazují, že projekty s pravidelným refaktorováním mají o 30% méně „zápachů kódu” (code smells) a o 15% nižší ukazatel technického dluhu ve srovnání s projekty, kde se refaktorování provádí jen příležitostně.
Martin Fowler ve své knize katalogizoval více než 70 technik refaktorování. V praxi většina týmů pravidelně používá 10-15 z nich. Podívejme se na klíčové techniky, které by měl znát každý vývojář.
Nejčastěji používaná technika. Pokud lze část kódu smysluplně vydělit do samostatné funkce — je to třeba udělat. Extract Method zlepšuje čitelnost, umožňuje pojmenovat operaci a zjednodušuje testování. Pravidlo: pokud vidíte komentář vysvětlující, co blok kódu dělá — tento blok lze vydělit do samostatné metody.
// Před refaktorováním
double total = amount * price;
double discounted = total * (1 - discountRate);
double tax = discounted * taxRate;
// Po refaktorování
double total = calculateTotal(amount, price);
double finalPrice = applyDiscountAndTax(total);
Název by měl odrážet podstatu. Pokud název proměnné nebo metody neodpovídá na otázku „co se zde ukládá/dělá” — je třeba jej přejmenovat. Moderní IDE činí tuto operaci triviální. Čisté názvy — nejlevnější a nejefektivnější způsob, jak zlepšit kód.
Když podmíněná logika příliš narostla a zamotala se, polymorfismus nabízí čistší alternativu. Místo switch-case podle typu — vytvořte hierarchii tříd s přepsanou metodou. Polymorfismus činí kód rozšiřitelným: přidání nového typu nevyžaduje změnu stávajících podmínek, pouze vytvoření nové podtřídy.
// Před refaktorováním (podmínky)
if (type.equals("email")) {
sendEmail(message);
} else if (type.equals("sms")) {
sendSms(message);
}
// Po refaktorování (polymorfismus)
Notifier notifier = new EmailNotifier();
notifier.send(message);
Když funkce přijímá příliš mnoho parametrů (více než 3-4), jsou obtížně čitelné a předávatelné. Seskupení souvisejících parametrů do parametrického objektu zkracuje signaturu, zlepšuje čitelnost a usnadňuje další změny.
| Technika | Účel | Kdy použít |
|---|---|---|
| Extract Method | Vydělení logiky do samostatné funkce | Blok kódu lze popsat jednou větou |
| Rename Variable | Upřesnění názvu proměnné/metody | Název neodráží podstatu |
| Replace Conditional | Nahrazení switch-case polymorfismem | Podmínky podle typu objektu |
| Extract Interface | Vydělení kontraktu z třídy | Je potřeba slabá provázanost |
Rozhodnutí refaktorovat — není technické, ale manažerské. Vyžaduje rovnováhu mezi současnou produktivitou a dlouhodobým zdravím kódové základny. Podívejme se na typické situace, kdy je refaktorování oprávněné a kdy je lepší se zdržet.
První situace — nerozumíte kódu, který potřebujete změnit. Pokud porozumění stávajícímu kódu trvá déle než implementace nové funkčnosti — to je signál, že je třeba nejprve refaktorovat. Druhá situace — našli jste duplicitu, která zpomaluje vývoj a zvyšuje riziko chyb. Třetí — přidání nové funkčnosti je nemožné bez porušení stávající struktury.
Také stojí za to refaktorovat, když kódová základna obsahuje „zápachy” (code smells): dlouhé metody, velké třídy, nadbytečné komentáře, řetězce volání, paralelní hierarchie dědičnosti. Katalog code smells z Fowlerovy knihy obsahuje více než 20 typických indikátorů problémů, každý s odpovídající technikou refaktorování.
Refaktorování není nutné, pokud kód funguje stabilně a neplánuje se jeho změna. Princip „funguje — nešahej na to” (if it ain’t broke, don’t fix it) je zvláště aktuální pro kód, který se mění zřídka. Refaktorování pro refaktorování — jedna z forem inženýrského perfekcionismu, která přináší více škody než užitku.
Také nerefaktorujte kód, který bude v blízké budoucnosti zcela nahrazen. Pokud tým plánuje přepsat modul v jiném jazyce nebo architektuře, refaktorování současné verze je ztráta času. A konečně, refaktorování bez testů — dobrodružství, zvláště pokud je kódová základna velká a složitá. Výjimka — jednoduché transformace pomocí IDE, které lze vrátit zpět.
Bezpečné refaktorování — je disciplína. Existuje několik zásad, jejichž dodržování minimalizuje rizika a činí proces předvídatelným. První a nejdůležitější — refaktorování pouze pod testy. Pokud nemáte testy pokrývající měněný kód — nejprve je napište.
Druhá zásada — malé kroky. Každá operace refaktorování by měla být minimální: přejmenování jedné proměnné, vydělení jedné metody, izolování jedné třídy. Po každém kroku — zkompilujte a spusťte testy. Rozdělení na mikrokroky umožňuje okamžitě odhalit chybu a vrátit poslední změnu. Podle Martina Fowlera činí mikrokroky refaktorování 3-4krát bezpečnějším než velké změny.
Třetí zásada — používání nástrojů. Moderní IDE (IntelliJ IDEA, VS Code, Eclipse) poskytují automatizovaná refaktorování: rename, extract method, extract variable, move class a desítky dalších. Nástrojová refaktorování zaručují správnost transformace a nevyžadují ruční vyhledávání všech míst, kde je třeba kód změnit.
Čtvrtá zásada — nemíchejte refaktorování se změnou funkčnosti. Pokud současně refaktorujete a přidáváte novou logiku, nelze určit, která změna způsobila chybu. Oddělení commitů na „refaktorování” a „funkci” — průmyslový standard, který zjednodušuje code review a vracení změn. Doporučená struktura: nejprve commit s refaktorováním (pouze strukturální změny, chování zachováno), poté commit s novou funkčností.
Git-flow pro refaktorování: vytvořte samostatnou větev, proveďte refaktorování, dosáhněte zelených testů, commitněte, poté ve stejné větvi přidejte novou funkčnost. Pokud se něco pokazí — změny refaktorování lze vždy vrátit pomocí git revert.
# Mikrokroky refaktorování v Gitu
git checkout -b refactor/extract-payment
# Krok 1: extrahujte výpočetní metodu
# ...změny... → kompilace → testy
git commit -m "refactor: extract calculatePayment method"
# Krok 2: přejmenujte proměnné
# ...změny... → kompilace → testy
git commit -m "refactor: rename amount to grossAmount"
Často kladené otázky
Ne, jsou to různé procesy. Refaktorovat — vylepšovat stávající kód bez změny jeho chování. Přepisovat (rewrite) — vytvářet novou implementaci od nuly, často se změnou architektury a technologií. Refaktorování je bezpečnější, levnější a předvídatelnější.
Doporučené pravidlo — 20% času sprintu na technická vylepšení a refaktorování. To umožňuje udržovat technický dluh na přijatelné úrovni bez zpomalení dodávky obchodní funkčnosti.
Lze, ale je to riskantní. Pro jednoduché transformace přes IDE (přejmenování, vydělení konstanty) testy nejsou povinné. Pro složité změny — testy jsou povinné. Pokud testy nejsou — nejprve napište charakteristické testy zaznamenávající současné chování.
Argumentujte prostřednictvím nákladů na změny. Pokud přidání jednoduché funkce trvá týden kvůli zamotanému kódu — ukažte, že refaktorování zkrátí čas budoucích změn. Používejte metriky: čas CR, počet chyb, cyklomatickou složitost.
Vraťte poslední změnu. Pokud používáte Git — git revert posledního commitu. Pokud byly mikrokroky dostatečně malé, objem ztracených změn bude minimální. Proto se velké refaktorování vždy dělí na sérii mikrokroků.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také