Professional Documents
Culture Documents
Sawomir Sobtka
22 /1 . 2012 . (1) /
DOMAIN DRIVEN DESIGN KROK PO KROKU
e w innym kontekcie podsystem komentarzy moe by Modele odseparowane przez Bounded Context nie
krytyczny (poniewa np. buduje zaufania) wwczas mog odnosi si do siebie wprost. S to niezalene byty,
traktujemy go jako Core Domain. ktre mog by rozwijane przez osobne zespoy. Oma-
wiane w dalszej czci Wzorce Architektoniczne pozwa-
Generic domain modele domen bazowych laj na hermetyzacj modeli, ktra redukuje problemy
zwizane ze zmianami i pozwala na niezalene rozwijanie
Pewne domeny s generyczne w stosunku do naszej modeli przez zespoy, ktre nie wchodz sobie w drog.
gwnej domeny. Przykadowo tworzc system sucy do Projekt referencyjny (link w ramce w sieci) zawiera
handlu zawartoci multimedialn, nie bdziemy skupia 3 przykadowe Bounded Context: Sales, CRM, Shipping.
wysiku mentalnego, pracujc nad moduem fakturowa- W przypadku tego projektu BC odpowiadaj moduom
nia. Fakturowanie jest krytyczne (zaley nam na jakoci systemu.
tego moduu), ale a) nie stanowi ono gwnej wartoci,
oraz b) tego typu systemy istniej na rynku (zarwno Granice kompetencji Ekspertw domenowych
Open Source, jak i komercyjnym). Dlatego przykadowe
fakturowanie moemy potraktowa jako Generic Domain. W systemach o wikszej skali mamy czsto do czynienia z
Z podsystemami zaliczanymi do Generic Domains inte- sytuacj, gdzie korzystamy z wiedzy wielu Ekspertw Do-
grujemy si w taki sposb, aby ich modele nie przecie- menowych. Eksperci ci specjalizuj si w hermetycznych
kay do naszego gwnego modelu. domenach (sferach) wiedzy. Moliwo komunikacji mery-
Innym przykadem Generic Domain moe by biblio- torycznej pomidzy ekspertami jest mocno ograniczona.
teka do operowania na Grafach. By moe bdziemy j Przykadowo w kontekcie naszego przykadowego
wykorzystywa w Module Magazynowym, aby sugerowa modelu: Pojcie produktu w Module Sprzeday oznacza
najkrtsze cieki, jakimi naley si porusza pomidzy co, co ma charakterystyk handlow, pewne atrybuty
regaami w magazynach, aby jak najszybciej skomple- promocyjne, by moe jest powizane z profilami beha-
towa zamwienie. W tym przypadku nadbudowujemy wioralnymi klientw.
domen Magazynu (regay, pki, korytarze) nad gene- Natomiast w Module Magazynowym jest to przedmiot,
ryczn domen grafw (wzy, cieki, algorytmy wyszu- ktrego gwn cech jest przykadowo to, e zajmuje
kiwania cieek). okrelon przestrze na regaach i by moe wymaga
specjalnego traktowania podczas transportu.
Core Domain miejsce dla DDD Jedynie ubstwo naszego jzyka powoduje, e eksper-
ci domenowi socjalizujcy si w sprzeday i eksperci spe-
Omwilimy rodzaje domen, dla ktrych nie stosujemy cjalizujcy si w domenie magazynw uywaj podobnej
technik DDD. Techniki DDD maj zastosowanie (jako in- fali akustycznej, ktra brzmi produkt. Jednak na pozio-
westycja) w Core Domain. Core Domain to sfera logiki mie znaczenia to brzmienie budzi zupenie rne skoja-
biznesowej, ktra jest gwnym powodem, dla ktrego rzenia skojarzenia z pojciami pojawiajce si w umy-
system powstaje. By moe model z Core Domain sta- le jednego eksperta s w ogle niedostpne dla umysu
nowi przewag systemu (klienta zamawiajcego system) innego eksperta.
nad konkurencj. W Core Domain inwestujemy czas na- Zatem prba uoglnienia i zsumowania kilku mode-
szych najlepszych ludzi Developerw oraz Ekspertw li wynikajcych z wiedzy osb o rozcznych kompeten-
Domenowych. W DDD zakadamy, e modelowanie Core cjach jest zajciem karkoomnym. W DDD takie podejcie
Domain stanowi najwiksze wyzwanie w cyklu produk- jest zaliczane do anty-wzorcw i nazywa si Corporate
cji systemu. Zakadamy rwnie, e saby model stanowi Model Anti-Pattern.
wysokie ryzyko niepowodzenia przedsiwzicia. Jeeli eksperci domenowi znajcy na wskro swe spe-
Podstawow technik destylacji Core Domain jest cjalizacje nie s w stanie si porozumie, to w jaki sposb
spisanie Dokumentu Wizji. Dokument ten powinien by moemy sobie wyobrazi sytuacj, w ktrej developerzy
krtki (np. 1/2 A4), dziki temu skoni jego twrc do nie znajcy zwykle adnej z tych domen mog by w
skupienia si na gwnych (Core) zaoeniach, ktre zwy- stanie stworzy wsplny model kilku domen...?
kle dokadnie mapuj si na czynniki przewagi, czyli Core Granice sownictwa Ekspertw Domenowych z Ubiquitous
Domain. Language wyznaczaj granice modeli - Bounded Context.
/www.programistamag.pl/ 23
INYNIERIA OPROGRAMOWANIA
model jest zalenoci do drugiego. Czyli zmiany w jed- Wsppraca poprzez dane
nym modelu powoduj katastrof w drugim. Z tego
wzgldu jest to podejcie, ktrego rozwaenie zaleca W najbardziej podstawowym przypadku jeden BC po-
si w przypadkw projektw wspieranych przez zespoy trzebuje pewnych danych z innego BC. W takim wypadku
outsourcingowe. komunikacj moemy modelowa poprzez Repozytoria.
Implementacja repozytorium w BC1 wywouje Serwis
WSPPRACA KONTEKSTW Aplikacyjny (de facto API) BC2. Innymi sowy API BC2
W KIERUNKU ARCHITEKTURY staje si rdem danych w BC1. Pamitajmy, e z za-
ZDARZENIOWEJ oenia model domenowy nie wycieka ponad warstw
Serwisw Aplikacyjnych. Zatem komunikacja musi nast-
Modele domen wyznaczone przez Bounded Context s powa poprzez Obiekty Transferowe.
hermetyczne oznacza to, e pojcia z jednego modelu Dziki takiemu podejciu uzyskujemy hermetyza-
nie wyciekaj do innych modeli. Jednak systemy maj cj modeli. Model domeny BC2 nie jest znany w do-
to do siebie, e ich skadowe musz wsppracowa. menie BC1. Zesp pracujcy nad BC2, publikujc API,
W poprzedniej czci wprowadzilimy wstpny szkic podpisuje kontrakt ze wiatem zewntrznym i od
warstwowej architektury aplikacji. Nad warstw logiki do- tej pory szczegem implementacyjnym jest sposb, w
menowej umieszczamy logik aplikacji, modelujc Use jaki kontrakt ten jest speniony. Dziki temu model do-
Case/Sser Story/Serwisy SAO. Poniej domeny umiesz- meny BC2 moe rozwija si niezalenie i we wasnym
czamy warstw infrastruktury, ktra zawiera midzy in- tempie.
nymi implementacje repozytoriw. Podejcie to rni si w zasadniczy sposb od popular-
Zobaczmy, jak na bazie tych zaoe moemy podej nego podejcia, w ktrym moduy gmeraj sobie nawza-
do komunikacji pomidzy Bounded Contexts. jem w modelach danych.
24 /1 . 2012 . (1) /
DOMAIN DRIVEN DESIGN KROK PO KROKU
/www.programistamag.pl/ 25
INYNIERIA OPROGRAMOWANIA
Saga model czasu w procesie biznesowym Kada metoda nasuchujca konkretnego zdarzenia w
Sadze modyfikuje jej wewntrzny stan (wzorzec projek-
Rozszerzeniem modelu zdarze jest Saga biznesowa. towy Memento) oraz sprawdza, czy warunki biznesowe
Technicznie saga jest persystentnym multi-listenerem. potrzebne do zakoczenia Sagi zostay spenione.
Oznacza to, e obiekty Sagi nasuchuj wielu zdarze Wicej o Sagach na stronie projektu Levan oraz na
oraz ich stan jest utrwalany pomidzy kolejnymi zdarze- stronie szyny NServiceBus, ktra wspiera model Sag po-
niami z uwagi na potencjalnie dugi czas upywajcy przez API silnika.
pomidzy kolejnymi zdarzeniami.
Natomiast na poziomie koncepcyjnym Saga modeluje POZIOMY MODELU OKIEZNA
de facto czas. CHAOS
Listing 3 zawiera przykadowy kod Sagi, ktra mode-
luje przepyw zamwienia. Saga reaguje na zdarzenia: Majc do czynienia ze zoonymi modelami, moemy potrze-
stworzenia zamwienia, zatwierdzenia zamwienia, na- bowa dodatkowego rusztowania rozpinajcego struktur
stpienia wysyki oraz dostarczenia zamwienia. Zakada- modelu. Z czasem, gdy nasze rozumienie modelu pogbia
my, e nie moemy przewidzie kolejnoci pojawienia si si, zauwaamy, e pewne jego elementy s oglnym fun-
tych zdarze, oraz czas pomidzy ich wystpieniem moe damentem, na ktrym opieraj si specyficzne czynnoci.
siga miesicy. Specyficzne czynnoci maj znowu swe wariacje.
@Saga
public class OrderShipmentStatusTrackerSaga extends
SagaInstance<OrderShipmentStatusTrackerData> {
@Inject
private OrderRepository orderRepository;
@SagaAction
public void handleOrderCreated(OrderCreatedEvent event) {
data.setOrderId(event.getOrderId());
completeIfPossible();
}
@SagaAction
public void handleOrderSubmitted(OrderSubmittedEvent event) {
data.setOrderId(event.getOrderId());
// do some business
completeIfPossible();
}
@SagaAction
public void orderShipped(OrderShippedEvent event) {
data.setOrderId(event.getOrderId());
data.setShipmentId(event.getShipmentId());
completeIfPossible();
}
@SagaAction
public void shipmentDelivered(ShipmentDeliveredEvent event) {
data.setShipmentId(event.getShipmentId());
data.setShipmentReceived(true);
completeIfPossible();
}
26 /1 . 2012 . (1) /
DOMAIN DRIVEN DESIGN KROK PO KROKU
Rysunek 2. Poziomy modelu domenowego (wraz z mapowaniem na Archetypowe Operational i Knowlege Level)
/www.programistamag.pl/ 27
INYNIERIA OPROGRAMOWANIA
orkiestracj domeny scenariusz sterowania obiekta- ku sugestie na postawie analizy behawioralnej klien-
mi domenowymi ta, jego znajomych lub wszystkich klientw (polityka!).
dodatkow logik typow dla tej konkretnej aplikacji Innym przykadem jest model dobierania rabatu (jeeli
technikalia takie jak transakcje i bezpieczestwo klientowi przysuguje wiele rabatw, np z uwagi na: po-
zycj zamwienia, zawarto caego zamwienia, histori
Warstwa logiki domenowej to miejsce, w ktrym mode- zamwie klienta oraz dodatkowe rabaty: dla VIPw, z
lujemy przy pomocy Building Blocks logik ograniczon okazji zimy itd.). Model dobierania rabatw moe by do-
przez Bounded Context. strojony (policy!) tak, aby dziaa na korzy klienta lub
W tym rozdziale zajmiemy si dalsz strukturyzacj waciciela systemu...
zoonych modeli w warstwie logiki domenowej.
GRANICE AGREGATW
Capability MODELUJEMY NIEZMIENNIKI
Poziom Capability zawiera klasy modelujce potencjalne Na zakoczenie omawiania zaawansowanego modelowa-
moliwoci, jakie oferuje nasz system. W naszym przy- nia DDD poruszymy zagadnienie okrelania granicy Agre-
kadowym systemie umiecimy tutaj agregaty Product gatw. Jest to najwaniejszy aspekt modelowania DDD,
i Client oraz Value Object Money. Posiadajc produkty, ktry decyduje o powodzeniu lub klsce modelowania.
uytkownikw i pienidze, moemy potencjalnie dalej Nieodpowiednio zakrelone granice Agregatw powo-
modelowa: handel, usugi, reklamacje itd. Na tym po- duj powstanie modeli sabo podatnych na zmiany oraz
ziomie zmiany s relatywnie niezbyt czste. nieefektywnych z wydajnociowego punktu widzenia.
W czci pierwszej przyjlimy dosy intuicyjne grani-
Operations ce naszych Agregatw, natomiast teraz zastanowimy si
bardziej wiadomie nad ich modelem.
Poziom Operations zawiera klasy modelujce konkretne Czytelnicy dowiadczeni w modelowaniu DDD mogli
operacje, jakie aktualnie wspiera nasz system. W na- zwrci uwag na przykadowy Agregat Order, ktrego
szym przykadowym systemie umiecimy tutaj agregaty granica bya zakrelona dosy chciwie, co mogo poten-
Order, Invoice oraz Serwis Biznesowy BookKeeper. Ska- cjalnie powodowa problemy z utrzymaniem i wydajno-
danie zamwie oraz wystawianie na ich podstawie przez ci modelu.
ksigowego faktur to konkretne operacje, jakie zbudowa- Agregat w definicji DDD jest spjn jednostk zmiany
limy nad modelem potencjau (produktami, klientami i (pracy). Od strony praktycznej Agregat powinien modelo-
pienidzmi). Ten poziom jest rednio podatny na zmiany. wa i enkapsulowa w swym wntrzu niezmienniki. Przy-
kadowo, jeeli model domenowy zakada, e zawsze:
Policy
a+b=c
Poziom polityk niejako dostraja poziom Operacji. Przy-
kadowo Ksigowy (Serwis Domenowy BookKeeper) z to wwczas Agregat powinien enkapsulowa a, b, c oraz
poziomu Operacji nalicza podatki na rne sposoby zapewnia, e po wywoaniu kadej metody Agregatu nie-
w zalenoci od wdroenia systemu w rnych krajach zmiennik jest zachowany. W naszym przykadowym Agre-
lub w zalenoci od tego, kto jest klientem na fakturze. gacie Order modelujemy niezmienniki: 1) dodatnie/usu-
Zwrmy uwag, e sposb wybrania polityki (konfigura- nicie produktu powoduje przeliczenie ceny po rabatach,
cja wdroenia bd decyzja w runtime) to funkcjonalno 2) dodatnie produktu ju istniejcego nie powoduje poja-
aplikacji. wienia si nowej pozycji zamwienia, a jedynie zwiksze-
Obiekty na poziomie polityk modeluj wariacje operacji nie iloci na ju istniejcej pozycji.
biznesowych. Model ten jest mocno podatny na zmiany.
Warto zauway, e polityki na poziomie technicz- Technika analizy przypadkw uycia
nym to technicznie rzecz biorc domknicia Operacji.
Domknicia w sensie popularnych od pewnego czasu j- Dosy atwo moemy doprowadzi do nieodpowiednie-
zykw funkcyjnych. Natomiast w starszych jzykach im- go modelowania granicy Agregatw, jeeli zastosujemy
plementujemy je poprzez Wzorzec Projektowy Strategii klasyczne podejcie polegajce na grupowaniu rzeczow-
(zob. cz I). nikw w worki. Przykadowo, jeeli odnajdziemy w
modelu rzeczownik Zamwienie, to wrzucamy do nie-
Decission Support go kolejne, mniejsze rzeczowniki, tworzc zbyt duy
agregat.
Niektre systemy posiadaj rodzaj sztucznej inteli- Technik, ktra sprawdza si lepiej w DDD, jest po-
gencji - mniej lub bardziej wyrafinowane mechaniczny wstrzymanie si od wstpnego grupowania poj w tego
analityczne wspierajce lub wrcz podejmujce decyzje. typu worki do momentu analizy przypadkw uycia/
W naszym przykadowym systemie mgby by to mo- operacji domenowych i grupowania ich pod ktem spj-
del sugerowania zamiennikw produktw w razie ich bra- nych jednostek zmiany.
28 /1 . 2012 . (1) /
DOMAIN DRIVEN DESIGN KROK PO KROKU
W SIECI:
PP strategiczne modelowanie agregatw: http://dddcommunity.org/library/vernon_2011
PP oficjalna strona DDD http://domaindrivendesign.org
PP wstpny artyku powicony DDD http://bottega.com.pl/pdf/materialy/sdj-ddd.pdf
PP przykadowy projekt: http://code.google.com/p/ddd-cqrs-sample/
PP sagi w NServiceBus http://www.nservicebus.com/sagas.aspx
/www.programistamag.pl/ 29