Realizacja nowej funkcjonalno艣ci biznesowej cz臋sto wykracza poza ramy jednego Modu艂u Monolitu. Jako 偶e musz膮 si臋 ze sob膮 komunikowa膰 m.in. w celu oddelegowania zada艅 dalej - warto przeanalizowa膰 sobie rodzaje komunikacji jakie mo偶emy zaimplementowa膰.
馃攲 Wariant #1: Fasada
Modu艂 B jest ca艂kowicie zale偶ny od modu艂u A |
W tym przypadku modu艂 bie偶膮cy (B) w kt贸rym piszemy zlecon膮 nam funkcjonalno艣膰 musi oddelegowa膰 cz臋艣膰 prac do innego zewn臋trznego modu艂u (A). Delegowanie pracy w praktyce polega na wywo艂aniu void'owskiej metody (Command) Fasady le偶膮cej w zewn臋trznym module.
W opisywanym przypadku modu艂 bie偶膮cy jest tym znajduj膮cym si臋 w dole strumienia. Ca艂kowicie musi si臋 on podda膰 kontraktowi komunikacji ustanowionego przez upstream'owy modu艂 zewn臋trzny. Modu艂 A wie jakich sk艂adnik贸w b臋dzie potrzebowa艂 do wykonania swojego zadania, dlatego stanowi膮 one parametry metody Fasady. W gestii modu艂u downstream'owego le偶y to by takowe parametry dostarczy膰 - warto si臋 zastanowi膰 czy posiadanie przez niego takich informacji jest w og贸le poprawne.
Warto podkre艣li膰, 偶e modu艂 A nie wie nic o swoich klientach - udostepnia API (Interfejs Fasady) do komunikacji z innymi modu艂ami i nie dba o to czy jest ich pi臋ciu czy nie ma ani jednego. W tym przypadku to modu艂 zewn臋trzny A jest niezale偶ny od innych modu艂贸w. Id膮c tym tropem: odpowiedzmy sobie najpierw na pytanie dlaczego modu艂 bie偶膮cy B do wykonania w pe艂ni swojej funkcjonalno艣ci musi oddelegowa膰 cz臋艣膰 pracy do zewn臋trznego modu艂u - czy granice zosta艂y poprawnie wytyczone?
Modu艂 B z kolei wie dok艂adnie o istnieniu innego modu艂u A i jak si臋 z nim komunikowa膰 (API Fasady). Jest to wi臋c jawna deklaracja komunikacji jednostronnej:
- wiem co chc臋 zrobi膰,
- wiem kto to zrobi,
- wiem dok艂adnie jak zmusi膰 tego kogo艣 do wykonania tej czynno艣ci.
馃摠 Wariant #2: Event'y
W tym wypadku modu艂 bie偶膮cy (A) w kt贸rym dodajemy funkcjonalno艣膰, informuje inne bli偶ej nieokre艣lone modu艂y o zaistnieniu pewnego zdarzenia wewn膮trz swoich granic. Robi to emituj膮c Event Aplikacyjny (Sync/Async) - nie troszcz膮c si臋 o to kiedy i przez kogo zostanie on obs艂u偶ony.
Modu艂y B i C s膮 ca艂kowicie zale偶ne od Modu艂u A |
Zaimplementowanie Event'u w Warstwie Aplikacji wychodz膮cego poza granic臋 bie偶膮cego modu艂u jest swego rodzaju zdefiniowaniem kontraktu komunikacji.
Modu艂 bie偶膮cy (A) nie dba o to czy Event'y zostan膮 obs艂u偶one, istotne jest to tylko dla zewn臋trznych modu艂贸w (downstream'owych) kt贸re decyduj膮 si臋 na nas艂uchiwanie na tego typu zdarzenia.
Downstream'owe modu艂y B i C musz膮 dostosowa膰 si臋 do kontraktu ustalonego przez modu艂 A. Musz膮 one by膰 w stanie wykona膰 swoj膮 prac臋 na postawie danych znajduj膮cych si臋 w Event'cie.
W tym wypadku, nie mo偶emy powiedzie膰 偶e modu艂 A chce oddelegowa膰 cz臋艣膰 pracy do innych modu艂贸w. Jedynie daje im zna膰, 偶e co艣 si臋 u niego zdarzy艂o.
Jest to wi臋c ca艂kowicie inna sytuacja ni偶 gdyby mia艂 on skorzysta膰 z Fasad modu艂贸w B & C wywo艂uj膮c ich metody void'owskie.
Mo偶naby ponownie wypisa膰 stwierdzenia jak w przypadku poprzedniej sekcji - Stan bie偶膮cego modu艂u uleg艂 zmianie:
- nie wiem kogo to interesuje,
- nie wiem czy b臋dzie mia艂o to jakiekolwiek konsekwencje.
馃攷 Por贸wnanie
W przypadku korzystania z Fasady niejawnie zak艂adamy, 偶e co艣 musi si臋 zadzia膰 i nie mo偶emy obej艣膰 si臋 bez tej funkcjonalno艣ci z zewn臋trznego modu艂u. Wydaje si臋, 偶e wybieraj膮c takie rozwi膮zanie funkcjonalno艣膰 wykonywana za Fasad膮 (upstream) jest naprawd臋 wa偶na.
W przypadku emitowania Event'贸w przez modu艂 bie偶膮cy - nie dbamy o to jaki klient/klienty obs艂u偶膮 to zdarzenie. Zastanawiam si臋 czy z takim podej艣ciem, obs艂uguj膮ce to zdarzenie modu艂y downstreamo'we wykonuj膮 funkcjonalno艣ci drugorz臋dne... tak - ale tylko z perspektywy bie偶膮cego modu艂u.
Bie偶膮cy modu艂 | komunikacja z Fasad膮 | emitowanie Event’贸w |
---|---|---|
Hierarchia | downstream | upstream |
Czy tworzy kontrakt | nie | tak |
Czy wie kto b臋dzie wykonywa艂 czynno艣膰 | tak | nie |
Czy mamy pewno艣膰 wykonania zleconych prac | tak | nie |
Czy konsekwencje prac s膮 znane | tak | nie |
Spos贸b komunikacji | Sync | Sync/Async |