Bezpečný refaktoring s AI
Přejít na sekci
Proč se všichni bojí sáhnout na legacy kód
Znáte to: něco opravíte na jednom místě a rozbije se to na třech dalších. Legacy kód je křehký, protože nemá testy, nemá jasné rozhraní a často obsahuje skryté závislosti, které se projevi až v produkci. Proto ho nikdo nechce měnit. Proto roste technický dluh. A proto se problém každým měsícem zhoršuje.
AI mění tuto dynamiku zásadním způsobem. Ne protože by refaktoring udělal za vás (to je nebezpečná iluze), ale protože vám pomůže vytvořit bezpečnostní síť, díky které můžete měnit kód s důvěrou, že zlomené věci odhalíte dřív, než se dostanou do produkce.
Pravidlo číslo jedna: nikdy nerefaktorujte bez testů. A pokud testy neexistují, vaším prvním krokem je nechat AI je vygenerovat — ne refaktorovat.
Characterization testy: zachyťte aktuální chování
Characterization testy (někdy nazývané 'golden master' testy) nezkoušejí, jestli kód dělá to, co má. Zkoušejí, jestli kód dělá to, co dělá teď. To je zásadní rozdíl. U legacy kódu často nevíte, co je 'správné' chování. Víte ale, co kód aktuálně dělá — a to chcete zachytit před jakoukoli změnou.
Zadejte AI: 'Vygeneruj characterization testy pro tuto funkci. Pro každý test použij reálné vstupy a zachyť aktuální výstupy jako očekávané hodnoty. Zahrň edge cases, které odvodíš z kódu.' AI přečte kód, identifikuje větve a hraniční případy a vygeneruje testy, které zachycují současné chování.
Strategie refaktoringu: malé kroky, časté kontroly
Nikdy nerefaktorujte velké kusy kódu najednou. Rozdělte refaktoring na malé kroky, kde každý krok mění jednu věc a testy po něm projídou. AI vám pomůže navrhnout tuto sekvenci: 'Potřebuji refaktorovat třídu OrderProcessor. Navrhni sekvenci malých, bezpečných kroků, kde každý krok je samostatně testovalný a reverzibní.'
Typická sekvence vypadá takto: nejdřív přejmenujte proměnné a metody na srozumitelné názvy. Pak extrahujte opakující se bloky do vlastních metod. Poté oddělte side effecty od čisté logiky. Každý krok commitněte zvlášť. Pokud se něco rozbije, vrátíte právě jeden commit, ne celý den práce.
Nechte AI generovat každou změnu jako diff. Můžete si přesně prověřit, co se mění, a teprve pak aplikovat. Nikdy neslepě akceptujte velké AI-generované změny.
Seam points: kam vložit testovací body
Michael Feathers v knize 'Working Effectively with Legacy Code' používá pojem 'seams' — místa v kódu, kde můžete změnit chování bez změny kódu samotného. Například rozhraní, která můžete nahradit mock implementací. AI dokáže tyto seam points identifikovat: 'Najdi místa v tomto kódu, kde mohu vložit abstrakci nebo rozhraní, abych mohl/a část logiky testovat izolovaně.'
Důležité je, že vytváření seams je samo o sobě refaktoring — a proto potřebujete characterization testy JEŠTĚ PŘED tímto krokem. Nejdřív testy, které zachytí chování. Pak seams, které umožní lepší testování. Pak další testy na nižší úrovni. A pak teprve skutečný refaktoring.
Kdy AI refaktoring selhává
AI je špatný v refaktoringu, který vyžaduje hluboké porozumění domény. Pokud obchodní logika vyžaduje, aby určité operace probíhaly v přesném pořadí kvůli regulačním důvodům, AI to nemůže vědět z kódu. Stejně tak u performance-kritických sekcí, kde specifické optimalizace existují z dobrého důvodu, i když vypadají jako špatný kód. Vždy se ptejte: 'Existuje důvod, proč to vypadá takhle?'
Commity při refaktoringu by měly být co nejmenší. Ideální commit mění jednu věc: přejmenování, extrakce metody, přesun souboru. Pokud se něco rozbije, vrátíte jeden commit, ne celý den práce.
Vyberte jednu komplexní funkci z vašeho legacy projektu. 1) Nechte AI vygenerovat characterization testy (alespoň 5). 2) Spusťte testy a ověřte, že všechny projídou. 3) Nechte AI navrhnout sekvenci 3-5 refaktoring kroků. 4) Proveďte první krok a ověřte, že testy stále procházejí. 5) Commitněte a pokračujte dalším krokem.
Nápověda
Pokud testy po refaktoringu selhávají, vraťte změnu a zeptejte se AI, proč se chování změnilo. Často odkryjete skrytý side effect.
Vyberte jednu funkci v legacy kódu, která potřebuje refactoring. Postup: 1) Nechte AI napsat testy pro současné chování, 2) Spusťte testy — všechny musí projít, 3) Nechte AI navrhnout refactoring (s vysvětlením proč), 4) Implementujte refactoring, 5) Spusťte testy znovu — musí stále procházet. Testy slouží jako safety net — pokud neprojdou, refactoring změnil chování.
Nápověda
Zdokumentujte svůj postup a výsledky — poslouží jako reference pro budoucí podobné úkoly.
Vyberte komplexní třídu z legacy kódu. Zadejte AI: 'Najdi seam points v této třídě — místa, kde mohu vložit rozhraní nebo abstrakci pro izolované testování. Pro každý seam point uveď: 1) Kde se nachází, 2) Jaké rozhraní navrhuješ, 3) Jak to umožní lepší testování, 4) Jaké jsou rizika této změny.' Implementujte jeden seam point a napište test, který ho využívá.
Nápověda
Typické seam points: databázová volání (nahradíte za repository interface), HTTP klienty (nahradíte za abstrakci), systémový čas (nahradíte za clock interface).
- Nikdy nerefaktorujte bez testů — nechte AI vygenerovat characterization testy jako první krok
- Rozdělte refaktoring na malé kroky, každý samostatně testovatelný a reverzibní
- AI identifikuje seam points, kde můžete vložit testovací body
- AI nechápe doménový kontext — vždy se ptejte, zda kód nevypadá divně z dobrého důvodu
V příští lekci se ponoříme do AI-generované testy pro netestovaný kód — technika, která vám dá jasnou převahu. Odemkněte celý kurz a pokračujte hned.
2/6 hotovo — pokračujte!