Branch by Abstraction umožňuje nahradiť komponent bez dlhodobej izolácie zmien v samostatnej Git vetve. „Vetva“ vzniká priamo v návrhu kódu: volajúci používajú jedno spoločné rozhranie, za ktorým počas migrácie funguje stará aj nová implementácia.
Postupnosť techniky
Prvá zmena zavádza abstrakciu, ktorá predstavuje to, čo volajúci potrebujú od existujúceho komponentu. Volajúci potom prejdú na túto abstrakciu bez zmeny správania. Až potom, čo je tento krok stabilný, začína sa preberať implementácia náhrady.
| Krok | Aktívna implementácia | Hlavná zmena | Overovacie zameranie |
|---|---|---|---|
| Predstaviť | Iba legacy implementácia | Pridať abstrakciu | Existujúce správanie zostáva stabilné |
| Presmerovať volajúcich | Iba legacy implementácia | Smerovať hovory cez abstrakciu | V rozsahu nezostávajú žiadni priami volajúci |
| Pridať náhradu | Legacy aj nová implementácia | Implementovať rovnakú zmluvu | Výstupy a vedľajšie účinky možno porovnávať |
| Prepnutie | Nová ako predvolená | Zmeniť výber implementácie | Správanie za behu zostáva v rámci zmluvy |
| Odstrániť | Len nová | Odstrániť starý kód a dočasné prepínače | Nezostáva žiadna skrytá závislosť |
Feature flags, konfigurácia alebo dependency injection môžu vybrať aktívnu implementáciu. Výberový mechanizmus je dočasná migračná infraštruktúra a potrebuje vlastnú podmienku vyradenia.
Prečo je v starom kóde dôležitá abstrakcia
Legacy volajúci často závisia od implementačných detailov namiesto definovanej zmluvy. Môžu priamo vytvárať inštanciu knižnice, čítať jej tabuľky alebo sa spoliehať na jej chybové hlásenia a načasovanie. Audit legacy codebase identifikuje tieto závislosti predtým, než sa rozhranie vyhlási za stabilné.
Vytvorenie tohto rozhrania je refaktoring, pretože mení vnútornú štruktúru pri zachovaní pozorovateľného správania. Práca môže odhaliť predpoklady, ktoré boli predtým rozptýlené medzi volajúcimi. Tieto predpoklady sa musia stať súčasťou zmluvy alebo sa musia zámerne odstrániť.
Porovnanie starých a nových implementácií
Súbežná prevádzka umožňuje spustiť obe implementácie s rovnakými kontrolovanými vstupmi. Test aktuálneho správania zachytí výsledky starej cesty ešte pred overením náhrady. Pri operáciách iba na čítanie môže tím priamo porovnať výsledky. Operácie s vedľajšími účinkami vyžadujú izoláciu, pretože rovnaký príkaz odoslaný dvakrát môže zdvojiť zápisy, správy alebo externé akcie.
Bezpečný plán porovnávania zaznamenáva:
- Vstupy. Požiadavky a údaje, ktoré každá implementácia dostane.
- Výstupy. Vrátené hodnoty, chyby a externe viditeľné odpovede.
- Vedľajšie účinky. Zmeny databázy, správy, súbory a sieťové hovory.
- Akceptované rozdiely. Zmeny, ktoré sú zámerné a kontrolované, nie náhodné.
Po dokončení migrácie
Prepnutie nie je dokončené len preto, že väčšina prevádzky používa novú implementáciu. Priame staršie volania, záložné cesty, prevádzkové skripty a vlastníctvo údajov môžu udržať starý komponent pri živote.
Dokončenie znamená, že nová implementácia plní dohodnutú zmluvu, monitoring pokrýva novú cestu a žiadny potrebný proces nezávisí od starej implementácie. Abstrakcia môže zostať, ak predstavuje užitočnú doménovú hranicu. Ak existuje iba kvôli prechodu, jej odstránenie môže zjednodušiť konečný návrh. Táto technika tak umožňuje preberať neznámy kód po etapách a udržať systém medzi zmenami nasaditeľný.