Grananje kroz apstrakciju omogućava stalno spajanje izmena, čak i kada nisu gotove.

Obično kada pričamo o svakodnevnom spajanju izmena u glavnu granu (trunk ili stablo, main(line), master itd) dolazimo do niza praktičnih prepreka. Jedna od najčešćih su veće izmene za koje nam treba više od jednog dana da ih završimo. Ovaj problem se često formuliše u vidu sledećih pitanja:

  1. Kako da svakodnevno spajam ono na čemu sam radio u trunk kada mi za to treba više dana da završim?

  2. Zar nezavršen kod neće ugroziti stabilnost sistema i prouzrokovati probleme?

Jedno od mogućih rešenja za taj tip problema koje se pokazalo dobro u praksi je grananje kroz apstrakciju. Za razliku od grane koja živi danima i ne integriše se u trunk svakodnevno, grananje kroz apstrakciju omogućava redovno spajanje izmena, čak i više puta dnevno, uz osiguranu stabilnost sistema i nesmetanu isporuku, čak i kada izmene na kojima radimo nisu gotove. Iako zvuči previše dobro da bi bilo istinito, ova tehnika je jednostavna i radi u mnogim scenarijima.

Uzmimo da imamo staru implementaciju koju iz nekog razloga želimo da izmenimo:

branch-by-abstraction-old-implementation.png

Prvi korak ka zameni bi bio da između stare implementacije i koda koji se na nju oslanja napravimo sloj apstrakcije:

branch-by-abstraction-abs-added.png

Zahvaljujući ovom sloju, klijentski kod više ne komunicira direktno sa onim što želimo da menjamo, tako da možemo umetnuti novu implementaciju i logiku kojom apstrakcija odlučuje koju će implementaciju ponuditi klijentu:

branch-by-abstraction-old-and-new.png

Sada kada imamo apstrakciju, logiku kada se koristi koja implementacija i testove koji nam govore da nismo nešto pokvarili možemo redovno spajati izmene u trunk i puštati nove objave korisnicima bez bojazni da se nešto pokvari. U trenutku kada je nova implementacija gotova i stabilna, možemo prebaciti sistem u stanje da se ona uvek koristi, a staru obrisati:

branch-by-abstraction-remove-old.png

U nekim slućajevima možemo poželeti da obrišemo apstrakcioni sloj jer nam više ne treba:

Postoje slučajevi i kada možemo odlučiti i da zadržimo apstrakcioni sloj. To su obično situacije kada dodatna apstrakcija doprinosi modularnosti koda i olakšava testiranje.

Za koju opciju ćemo se opredeliti zavisi od slučaja do slučaja.

Reference

 

Paul Hammant, Branch by Abstraction.

Martin Fowler, Branch by Abstraction.

Fotografija: Ocramnaig_o1.