Kiedy pojawia się tego typu "nowa" terminologia jako branża zawsze zastanawiamy się nad tym co ten nowy buzzword znowu chce nam powiedzieć i gdzie można tego użyć. Oczywiście są dość powszechne próby podejść naiwnie czerpiące wszystkie technologiczne rozwiązania nawet bez rozpoznania "terenu" i tego jaką korzyść w konkretnej sytuacji dają nam konkretne rozwiązania. Wtedy pojawia się trend spadku popularności i nazywanie koncepcji "buzzwordem", próby powrotu do starych "dobrych" praktyk. Każda taka ideologia sprawdza się jednak w określonych sytuacjach i pomimo, że proponuje komplementarne rozwiązania niczym filozofia XIX wieku próbująca opisać cały świat w jednym spójnym ujęciu ideologicznym. Filozofia XIX wieku doprowadziła do totalitaryzmu i dziś tego typu architektoniczne Nazi jednostki są dość powszechne. Jednak żyjemy w XXI wieku i teraz wiemy już to czego nauczył nas wiek XX czyli wiemy, że ideologie sprawdzają się w określonych kontekstach i tam są one dobre głównie do potrzeb archiwistycznych, porządkujących w tymczasowym paradygmacie informacje które są bogatsze niż to do czego potrzebuje ich domena. Myśląc jednak o przeznaczeniu, o celu jaki chcemy osiągać i kontekście domenowym redukujemy złożoność do modularnych domen.
Kluczowe koncepcje DDD i połączone z tym pojęcia:
- wspólny język (zawsze stanowiło to dla mnie problem w zastanych systemach kiedy spotykałem projekty w których wszędobylskie było słowotwórstwo i synonimy tworzone po to by oddzielić detale implementacyjne i np. obiekty obiekty transmisyjne od encji za pomocą innych słów, a biznes operował w tym czasie zupełnie innymi pojęciami).
- eksperci domenowi (jedynie pracując w firmach posiadających własny in-house team programistów pracowało się dobrze, bo tam programista był człowiekiem rozwiązującym problemy innych, a nie źródłem problemów z czasem wymaganym na definiowanie wymagań) definiujący funkcjonalności za pomocą zdarzeń systemowych (zdarzenia wyeliminowały potrzebę określania funkcjonalności za pomocą nieprecyzyjnego opisu wymagającego wiedzy z jednej dziedziny od eksperta z innej kiedy proces dotyka kilku domen).
- konteksty powiązań i agregaty (o relacyjnych bazach danych, bałaganie i problemach jakie się z tym łączą dobrze opowiada drugi z załączonych filmów) łączące encje i obiektowe właściwości w jeden kontekst transakcji, która będzie zakończona w izolacji od zachowania innych części systemu a w przypadku kiedy inna domena zgłasza wyjątek będzie kompensowana osobnym zdarzeniem odwracającym skutki.
- CQRS i event sourcing (zdarzenia nie transmitują stanu ale są poleceniami zmiany i nie operują na pełnym kontekście stanu obiektu, co umożliwia kompensowanie zdarzenia bez zamrażania stanu. Słowem "dodaj jeden" jest odwracalne, a "ustaw wartość na dwa" nie jest odwracalne. Ciąg zdarzeń doprowadza do odtworzenia stanu obiektu niczym w systemie opartym na blockchain, a stan jest zachowywany jedynie jako "read model" i nie wykonuje się na nim innych operacji niż zwrócenie stanu do innego systemu, np. UI)
Chciałbym byście zwrócili uwagę na główne cechy DDD i to w jaki sposób możemy je zaaplikować osobno, bez wchodzenia w cały bardzo złożony model który wyłania się z czerpania pełni zakresu jaki ujmuje ta koncepcja, oraz byśmy zwrócili uwagę na to jak różne jest ujęcie domenowe od ujęcia heksagonalnego w kontekście budowania wyseparowanych modułów odzwierciedlających architekturę warstwową. Także na to ile z ujęcia technologicznego rzeczywiście jest w stanie wpłynąć na domenę, a na ile ujęcie technologicznego podziału domeny realizowane jest już przez frameworki jest wyabstrahowane z kodu który tworzymy.
Comments
Post a Comment