Refaktoring starého JavaScriptu: od legacy funkcí k modernímu kódu
Starý JavaScript v produkci bývá past, do které se dá snadno spadnout. Typicky jde o funkce z let 2012 až 2016, které používají var, ruční indexování v cyklech, callbacks místo promises a globální stav rozesetý po celém souboru. První krok není přepisovat všechno, ale zastavit krvácení: pokrýt kritické funkce testy, i kdyby měly být jen charakterové. Bez testů nemá smysl refaktorovat, protože nepoznáte, kdy jste něco rozbili. Napsat pár testů proti současnému chování je otrava, ale je to nejlevnější pojistka, kterou můžete udělat.
Samotný přepis se dělá po malých kouscích, ne jedním velkým commitem. Začněte u funkcí, které mají jasný vstup a výstup, a nahraďte var za const a let. Callbacky převeďte na promises a pak na async/await. Destrukturalizace a spread operátor zkrátí kód, ale pozor na kopírování objektů do hloubky, kde spread jen mělce zkopíruje referenci. Pokud si nejste jistí, jak psát čistý kód v JavaScriptu bez zbytečných vedlejších efektů, je lepší se u jedné funkce zastavit a pochopit ji, než přepsat celý modul a doufat, že to projde.
Moderní syntaxe sama o sobě kvalitu nezvedne. Nahradit for cyklus za map a filter je kosmetika, pokud funkce dál mutuje vnější stav. Skutečný refaktoring znamená odstranit skryté závislosti, předat data parametrem a vrátit novou hodnotu místo přepisu původní. Když narazíte na funkci, která dělá pět věcí najednou, rozdělte ji na menší celky s jednoznačným názvem. Každá taková změna sice vypadá jako práce navíc, ale při další opravě chyby ušetří hodiny hledání v kódu, kterému nerozumí ani jeho autor.
Na konci projděte výsledek statickou analýzou. ESLint s rozumnou konfigurací odhalí nepoužité proměnné, chybějící await a nekonzistentní návratové hodnoty. Prettier sjednotí formátování, což zní banálně, ale snižuje šum v code review. A hlavně: refaktoring není jednorázová akce, ale návyk. Pokud si po každé změně řeknete, že úklid přijde později, vrátíte se do stejného stavu za půl roku. Lepší je přepsat jednu funkci pořádně než deset napůl.