Previazanosť kódu (code coupling) opisuje, ako silno sa jedna časť systému spolieha na štruktúru, dáta, časovanie alebo správanie inej časti. Závislosti má každý fungujúci systém. Previazanosť sa stáva problémom údržby vtedy, keď sa komponenty nedajú pochopiť, otestovať, nasadiť ani zmeniť bez toho, aby ste museli koordinovať prácu naprieč niekoľkými ďalšími komponentmi.
Kde sa previazanosť objavuje
Priame importy a volania funkcií sú viditeľnou formou previazanosti. Legacy systémy obsahujú aj menej zjavné formy: moduly, ktoré čítajú tie isté databázové tabuľky, úlohy závislé od konkrétneho formátu súboru, služby, ktoré predpokladajú určité poradie volaní, a obrazovky, ktoré znovu implementujú biznis pravidlá uložené inde.
Rozhranie medzi dvoma komponentmi určuje, koľko toho musí každá strana vedieť. Úzke a stabilné rozhranie dokáže obmedziť dosah vnútorných zmien. Zdieľané interné dátové štruktúry alebo zduplikované predpoklady odhaľujú viac implementačných detailov a zväčšujú plochu, ktorej sa zmena dotkne.
| Forma previazanosti | Príklad | Čo overuje audit |
|---|---|---|
| Závislosť v kóde | Jeden modul importuje druhý | Ktoré rozhrania sa používajú? |
| Dátová previazanosť | Komponenty zdieľajú tabuľky alebo súbory | Kto vlastní schému? |
| Časová previazanosť | Operácie musia bežať v danom poradí | Čo sa stane, keď sa zmení časovanie? |
| Previazanosť správaním | Komponent predpokladá vnútorné pravidlo iného komponentu | Kde je to pravidlo zdokumentované? |
Prečo je legacy previazanosť ťažko viditeľná
Vzťahy sa nabaľujú tak, ako systém rastie. Z rýchlej integrácie sa stane trvalá dátová cesta. Zdieľaná pomocná trieda postupne prevezme aj nesúvisiace zodpovednosti. Prevádzkové postupy vytvoria závislosti, ktoré sa v zdrojovom kóde neobjavia vôbec.
Audit legacy codebase sa pozerá ďalej než na importy. Porovnáva vzťahy v zdrojovom kóde s tokmi dát, konfiguráciou nasadenia, plánovanými úlohami a reálnym správaním v produkcii. Práve tak sa dá overiť, či hranica viditeľná v repozitári existuje aj za behu.
Čo previazanosť znamená pre refactoring
Silná previazanosť rozširuje rozsah zmeny. Nahradenie jedného komponentu si môže vyžiadať úpravy volajúcich častí, zdieľaných dát, testov aj poradia nasadenia. Neznamená to automaticky, že návrh je zlý. Znamená to, že migračný plán musí s týmito vzťahmi počítať.
Refactoring zvyčajne postupuje takto:
- Identifikujte kontrakt. Zaznamenajte správanie, na ktoré sa spoliehajú konzumenti.
- Oddeľte zdieľané dáta. Určite, kto ktorú štruktúru číta, zapisuje a vlastní.
- Zaveďte hranicu. Interakciu veďte cez stabilné rozhranie.
- Presúvajte jedného konzumenta po druhom. Pred odstránením starej cesty overte správanie.
Ako audit určuje priority
Samotná previazanosť neurčuje, čo treba opraviť ako prvé. Silne prepojený komponent, ktorý sa mení len zriedka, môže zostať stabilný. Menší komponent pod neustálym tlakom zmien môže spôsobovať vyššie okamžité náklady. Chýbajúci kontext dodá história zmien, incidenty, testy a biznis plány.
Keď sa previazanosť prekrýva s technickým dlhom, dokáže rozptýliť opravnú prácu naprieč celým systémom. Zmapovanie tohto prekryvu pomáha definovať realistické pracovné balíky pre migráciu legacy codebase. Odhady tak zostanú naviazané na skutočnú plochu zmeny, nie na veľkosť nahrádzaného komponentu.