Refaktoring starého JavaScriptu, který ničí čitelnost i výkon
Dech po ránu nebo po kávě se nedá vysvětlit jen tím, co jste snědli. Většinu zápachu mají na svědomí bakterie v ústech, které rozkládají bílkoviny a produkují těkavé sloučeniny síry. Komerční ústní vody často pracují s alkoholem a aromaty, která problém na hodinu přikryjí. Domácí voda z máty a hřebíčku působí jinak: máta osvěží sliznici a hřebíček obsahuje eugenol, který má mírně antiseptické účinky. Nezabije všechny bakterie, ale dokáže snížit jejich množství a hlavně nepálí jako alkoholová voda.
Vnější závislosti a vedlejší efekty řešte postupně po malých krocích. Po každé úpravě spusťte testy nebo alespoň ručně projděte kritické scénáře. Pokud testy nemáte, napište je před refaktoringem pro současné chování — i když je kód špatný, musíte vědět, co má po změně dělat. Teprve pak můžete bezpečně měnit strukturu. Velké přepisy najednou obvykle skončí tak, že se vrátíte k původní verzi a nadšení vyprchá.
Prohmatejte hřad – pokud je mokrý nebo špinavý od trusu, ptáci na něm sedí celou noc a šíří si infekci. Typická chyba: lidé dezinfikují celý kurník jednou za měsíc, ale hřad nechávají roky bez kontroly. Přitom právě hřad je místo s největším kontaktem.
Častou chybou je příliš hustá výsadba. Když rostliny rostou těsně u sebe, spodní části jsou ve stínu a listy odumírají. Pravidelně prořezávejte a rozsazujte trsy. Stejně důležitá je cirkulace vody. V místech, kde voda stojí, se hromadí organický odpad, který spotřebovává kyslík a blokuje příjem živin. Přidejte malé čerpadlo nebo upravte výtok filtru tak, aby voda jemně proudila i u dna. Vyhněte se ale silnému proudu, který by rostliny vytrhával.
Pozor na tichý vznik globálních proměnných. Chybějící var, let nebo const přiřadí hodnotu do globálního prostoru a chyba se projeví až jinde. Před refaktoringem proto projděte kód a všechny proměnné deklarujte. Zároveň odstraňte mrtvý kód, ale až poté, co ověříte, že se skutečně nikde nevolá. Zbytečné funkce často drží při životě jiné části a jejich smazáním se rozbije něco, co jste nečekali.
Druhý častý omyl je podcenit větrání. Matrace dýchá a vlhkost musí odejít spodem. Rošt s plnou deskou bez děr nebo s příliš hustými lamelami vlhkost uzavře a do roka se objeví plíseň a zápach. Mezi rošt a matraci nikdy nedávejte igelit, fólii ani plachtu z neprodyšného materiálu. Stejně tak nepřipevňujte rošt ke dnu napevno, pokud výrobce neurčil jinak — potřebujete možnost ho vyndat a vyčistit.
Před samotným zabalením zkontrolujte hrany a rohy. I malý štípanec se při přepravě rozšíří. Pokud najdete poškození, přelepte ho samolepicí páskou, která zabrání dalšímu odlupování. Nikdy nelepíte pásku přímo na čistou plochu zrcadla – lepidlo by se při změnách teploty zatáhlo do skla a zanechalo stopy. Pásku veďte vždy jen po hraně nebo po rubové straně.
Starý JavaScript málokdy vzniká jako chaos úmyslně. Většinou jde o vrstvení oprav: někdo přidá podmínku, další obalí funkci try/catch, třetí přidá globální proměnnou. Po dvou letech máte soubor s tisíci řádky, kde se nedá dohledat, co vlastně která část dělá. Refaktoring nezačíná přepisováním, ale měřením. Než sáhnete na kód, zjistěte, které funkce se volají odkud a které naopak nikdo nepoužívá. Pomůže prostý výpis volání nebo dočasné logování. Teprve pak má smysl cokoli měnit.
Nakonec zvažte, zda má smysl starý kód vůbec zachraňovat. Pokud jde o izolovanou část, kterou lze nahradit několika řádky, je přepis rychlejší než lepení. Refaktoring se vyplatí tam, kde logika zůstává a jen potřebuje zprůhlednit. Rozhodujte podle toho, kolik času ušetříte příště, ne podle toho, jak elegantní kód dnes vypadá.
Rozdělte kód podle odpovědnosti, ne podle pořadí vzniku Nejčastější chyba je rozdělovat soubor mechanicky na půl, aby nebyl tak dlouhý. Tím vzniknou dvě nesourodé části, které spolu stále sdílejí stav přes globální proměnné. Správný postup je opačný: najděte ucelené činnosti — načtení dat, validaci, vykreslení — a ty přesuňte do samostatných funkcí s jasnými vstupy a výstupy. Funkce, která mění globální stav nebo sahá na vzdálené objekty, se testuje jen obtížně. Snažte se, aby každá funkce dělala jednu věc a výsledek vracela, ne aby ho zapisovala někam bokem.