You are on page 1of 8

INYNIERIA OPROGRAMOWANIA

Sawomir Sobtka

Domain Driven Design krok po kroku


Cz II: Zaawansowane modelowanie DDD
techniki strategiczne: konteksty i architektu-
ra zdarzeniowa
Modele nietrywialnych domen wymagaj struktury. Struktury, ktra pomaga nam
okiezna chaos. W zestawie technik DDD znajduj si podejcia strukturyzacji sys-
temu na kadym poziomie abstrakcji. Techniki DDD stanowi rwnie rusztowania
mentalne, ktre prowadz procesy mylowe modelarza w kierunku bardziej ade-
kwatnych modeli. W artykule zostan przedstawione techniki destylacji domen, wy-
dzielania kontekstw, komunikacji pomidzy kontekstami, porzdkowania zoonych
kontekstw oraz na poziomie mikro efektywnego modelowania Agregatw.

Plan serii w struktur, ktra separuje elementy modelu wg ich po-


datnoci na zmiany.
Niniejszy tekst jest drugim z serii artykuw majcych na celu Na zakoczenie naszych rozwaa powrcimy do oma-
szczegowe przedstawienie kompletnego zestawu technik wianych w poprzedniej czci Agregatw i zastanowimy
modelowania oraz nakrelenie kompletnej architektury apli- si nad ich granicami. Poznamy techniki efektywnego
kacji wspierajcej DDD. modelowania granic Agregatw oraz typowe bdy.
Cz 1: Podstawowe Building Blocks DDD;
Cz 2: Zaawansowane modelowanie DDD techniki stra- DESTYLACJA CORE DOMAIN - KIEDY
tegiczne: konteksty i architektura zdarzeniowa; NIE STOSUJEMY DDD
Cz 3: Szczegy implementacji aplikacji wykorzystujcej
DDD na platformie Java (dwa podejcia: Spring i EJB 3.1 oraz Stosowanie technik DDD wnosi pewien narzut w procesie
JPA); tworzenia oprogramowania. Narzut ten jest inwestycj,
Cz 4: Skalowalne systemu w kontekcie DDD - architek- ktra jednak nie zwraca si w kadym przypadku. Dla-
tura CqRS; tego na wstpie modelowania DDD okrelamy miejsca w
Cz 5: Kompleksowe testowanie aplikacji opartej o DDD; systemie, w ktrych stosujemy techniki DDD, oraz miej-
Cz 6: Behavior Driven Development - Agile drugiej ge- sca, w ktrych ich nie stosujemy.
neracji
Supporting Domain wiadomy dug techniczny

STRATEGICZNA STRUKTURYZACJA Relatywnie proste domeny nie wymagaj technik DDD


RNE SKALE, JEDEN CEL ich modelowanie z definicji nie wymaga zoonego proce-
su mentalnego. Moemy je z powodzeniem zaimplemen-
Wszystko jest na miejscu i wszystko ma swoje miejsce towa w uproszczonej (1,2 warstwowej) architekturze.
- cytat Benjamina Franklina jest chyba najlepszym pod- Zwykle okazuje si, e nad prostymi domenami wykonu-
sumowaniem strategicznych technik DDD. jemy jedynie operacje CRUD (Create, Read, Update, De-
Pierwsz decyzj, jak podejmujemy podczas modelo- lete), zatem warto skorzysta z mnogoci wyboru frame-
wania z wykorzystaniem DDD, jest okrelenie tych miej- work'w pozwalajcych generowa niemal automatycznie
sce w caej rozcigoci systemu, w ktrych bdziemy aplikacje klasy przegldarka do bazy danych.
stosowa techniki DDD. Te relatywnie proste domeny nazywamy Supporting
Kolejnym poziomem strukturyzacji jest wydzielenie ja- Domain. W tych miejscach systemu decydujemy si na
snych granic Bounded Context kontekstw, w ktrych kompromisy jakociowe (jako modelu, jako kodu)
obowizuj osobne modele. wiadomie zacigamy dug techniczny.
Separacja modeli jest ze wszech miar poyteczna, jed- Przykadowo w naszym systemie moemy zdecydowa
nak zwykle rodzi problem: domeny musz ze sob wsp- si na wprowadzenie systemu komentarzy. Zakadajc,
pracowa. Zatem zastanowimy si, jak technicznie doko- e jego dziaanie nie jest krytyczne dla powodzenia cae-
na mapowania kontekstw. Poszczeglne modele mog go przedsiwzicia biznesowego, klasyfikujemy ten pod-
by wci zoone, dlatego nadamy im gbsz - warstwo- system jako Supporting Domain. Warto zwrci uwag,

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.

GRANICE BOUNDED CONTEXT Techniki uwsplniania modeli


GRANICE WSPLNEGO JZYKA
Cz poj jest wsplna dla wszystkich Bounded Con-
Drugim poziomem strukturyzacji modelu jest wydzielanie text. Przykadowo klasa Money z poprzedniego artykuu
Bounded Context kontekstw, do ktrych jest przypisa- modeluje pojcie, co do ktrego wszyscy Eksperci Dome-
ny Ubiquitous Language. Przypomnijmy w tym miejscu: nowi zgadzaj si w kadym szczegle. Wsplne pojcia
istnienie wsplnego jzyka, ktrym posuguj si wszy- umieszczamy w tak zwanym Shared Kernel.
scy uczestnicy projektu od Eksperta Domenowego po Inn technik uwsplniania modeli jest podejcie na-
Developerw - jest jednym z gwnych zaoe DDD. zywane w DDD: Conformist. Polega na tym, e jeden

/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.

Rysunek 1. Podejcia architektoniczne do wsppracy pomidzy Bounded Context

24 /1 . 2012 . (1) /
DOMAIN DRIVEN DESIGN KROK PO KROKU

Wsppraca poprzez operacje kontrakt na poziomie implementacji technicznej musi-


my posuy si transakcyjnym silnikiem zdarze, ktry
Innym przypadkiem wsppracy BC jest wywoanie API zagwarantuje nam, e zdarzenie zostanie propagowane
w celu wykonania pewnych operacji. Czyli nie operujemy dopiero wwczas, gdy transakcja, w ktrej go wygenero-
wprost na modelu domenowym innego BC, a wywoujemy wano, powioda si. Przykadem standardu wspierajcego
zbudowane nad nim API. Jest to klasyczna praktyka, ale komunikaty transakcyjne jest Java Message Service.
wspominamy o niej dla zachowania kompletnoci.
Listing 2. Listener zdarzenia w Bounded Context Sales
Wsppraca poprzez sygnay Zdarzenia listener znajduje si na poziomie aplikacji
biznesowe
@EventListeners
public class CustomerStatusChangedListener{
Wywoywanie serwisw z innych BC wprowadza silny Co-
upling. W przypadku wikszej iloci wsppracujcych ze @EventListener(asynchronous=true)
public void handle(CustomerStatusChangedEvent
sob moduw skoczymy z Architektur o strukturze
event) {
klasycznego Spaghetti. if (event.getStatus() == CustomerStatus.VIP){
Klasyczn technik Decouplingu jest wprowadzenie calculateReabteForAllDraftOrders(
event.getCustomerId(), 10);
modelu zdarze. Zdarzenia s jedn z technik Inversion
}
of Control obok Dependency Injection i Aaspect Orien- }
ted Programming. Musimy pamita jednak, e odwra-
cajc kontrol, jednoczenie j tracimy. Zatem zdarze private void calculateReabteForAllDraftOrders(
Long customerId, int i) {
uywamy wwczas, gdy chcemy modelowa wspprac, // TODO Auto-generated method stub
gdzie nie zaley nam na kontroli kolejnoci, czasu ani re- }
zultatu wykonania. }
W DDD przy pomocy zdarze modelujemy istotne z
biznesowego punktu widzenia fakty, ktre zaszy w cyklu Listing 2 przedstawia kod jednego z Listenerw naszego
ycia Agregatu. przykadowego zdarzenia. Listener ten wprowadza nast-
pujc funkcjonalno: jeeli w module CRM klient stanie
Listing 1. Zgoszenie zdarzenia w Bounded Context CRM w si VIPem, wwczas w module Sales nadajemy mu 10%
Agregacie Customer rabatu na wszystkie niezatwierdzone zamwienia.
Warto zwrci uwag na fakt, i nasz przykadowy Li-
@Entity
public class Customer extends BaseAggregateRoot{ stener posiada jedynie logik filtrowania zdarze, nato-
miast ca prac deleguje do Serwisu Aplikacyjnego (API)
public enum CustomerStatus{ swojego moduu. Jest to zatem jedynie kod klejcy.
STANDARD, VIP, PLATINUM
Jak widzimy na Rysunku 1, nasz przykadowy Listener
}
jest klientem do API na takim samym poziomie jak np.
@Enumerated(EnumType.STRING) klienty GUI. Jest to zatem jeden z wielu aktorw, ktrzy
private CustomerStatus status; mog uruchamia API. Przykadowo rabaty na zamwie-

public void changeStatus(CustomerStatus status){ nia mog by naliczane nie tylko automatycznie podczas
if (status.equals(this.status)) promowania klienta do statusu VIP, ale rwnie rcznie,
return; poprzez GUI np. panelu administracyjnego.
this.status = status;
eventPublisher.publish( Zdarzenia wprowadzamy do architektury systemu z
new CustomerStatusChangedEvent( kilku powodw:
getEntityId(), status));
}
decoupling modeli opisany przykad
}
asynchroniczne wykonanie dodatkowych operacji
przykadowo w module CRM moemy wysya maile do
Listing 1 ilustruje przykad zgoszenia zdarzenia przez klientw, ktrych statusy zmieniono; wysyka maili to
Agregat Customer w momencie zmiany jego statusu. czynno z jednej strony dodatkowa, a z drugiej poten-
Klasa CustomerStatusChangedEvent jest nonikiem in- cjalnie dugotrwaa
formacji o tym, ktry klient (ID) zmieni status. Mode- otwarcie architektury na pluginy wpinanie kolej-
lujc zdarzenia, musimy podj decyzj o tym, jakie in- nych listenerw mona potraktowa jako dodawanie
formacje umieszczamy w klasach zdarze w naszym pluginw
przykadzie jest to techniczne ID by moe lepsz de- rejestrowanie zdarze w celu ich przetwarzania i analizy
cyzj byoby przeniesienie informacji o biznesowym nu- - np. z wykorzystaniem silnikw CEP (Complex Events
merze klienta... Processing) pozwalajcych na deklarowanie kwerend
Zdarzenie modeluje fakt, ktry mia miejsce i nie mo- filtrujcych okrelone wzorce zdarze w czasie
na go zawetowa moemy co najwyej zareagowa w skadowanie zdarze jako modelu danych alternatyw-
dodatkowy sposb na zaistniay fakt. Aby osign taki nego dla bazy relacyjnej Event Sourcing

/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.

Listing 3. Saga modelujca przepyw zamwienia

@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();
}

private void completeIfPossible() {


if (data.getOrderId() != null
&& data.getShipmentId() != null
&& data.getShipmentReceived()) {
Order shippedOrder = orderRepository.load(data.getOrderId());
shippedOrder.archive();
orderRepository.save(shippedOrder);
markAsCompleted();
}
}
}

26 /1 . 2012 . (1) /
DOMAIN DRIVEN DESIGN KROK PO KROKU

Rne czci modelu charakteryzuj si rn podat- Rozwarstwienie logiki to dopiero pocztek


noci na zmiany. Czytelnicy zaznajomieni z Archetypa-
mi Modeli Biznesowych znaj pojcie dwch poziomw W poprzedniej czci dokonalimy rozwarstwienia logiki
modelu: Operational Level i Knowledge Level. Natomiast na warstw aplikacji i warstw logiki domenowej. War-
w DDD nadajemy modelowi jeszcze gbsz struktur i stwa aplikacji modelu (czylu Use Case/User Story/Serwi-
wyaniamy w nim a cztery poziomy... sy SAO) jest odpowiedzialna za:

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

PODSUMOWANIE O CZYM NIE efektywne pobieranie danych Lazy Loading rozwizu-


POWIEDZIELIMY je jedynie cz z nich
rwnolegym dostpem do danych im wicej danych
Omwilimy kolejne poziomy strategicznego modelowa- w agregacie, tym wiksze prawdopodobiestwo, e
nia domeny, poczwszy od Destylacji Core Domen, czyli wielu uytkownikw bdzie miao interes w jego rw-
miejsca, gdzie stosujemy techniki DDD, poprzez wya- nolegej modyfikacji; Optimistic Locking jedynie chroni
nianie na podstawie Ubiquitous Language granic mode- nas przed konsekwencjami, nie rozwizujc problemu
lu Bounded Context, a po granice poszczeglnych skalowanie jestemy zmuszeni, aby cay Agregat
Agregatw. persystowa w tym samym modelu danych oraz na tej
Poruszylimy rwnie zagadnienie struktury wielko- samej maszynie (zakadajc, e rozproszone transak-
skalowej modelu, gdzie separujemy potencja modelu cje s bdem w sztuce projektowania skalowalnych
od konkretnych operacji i modeli wspierajcych decyzje systemw)
oraz dostrajajcych je polityk. Kluczem nadawania tej
struktury jest zakres odpowiedzialnoci oraz podatno Zainteresowanych t tematyk odsyam do pierwszej
na zmiany. pozycji w ramce w sieci.
Warto zawrci uwag, i zbyt chciwie zakrelone
Agregaty powoduj nastpujce problemy:

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

Sawomir Sobtka slawomir.sobotka@bottega.com.pl

Programujcy architekt aplikacji specjalizujcy si w technologiach Java i efektyw-


nym wykorzystaniu zdobyczy inynierii oprogramowania. Trener i doradca w firmie
Bottega IT Solutions. W wolnych chwilach dziaa w community jako: prezes Stowar-
zyszenia Software Engineering Professionals Polska (http://ssepp.pl), publicysta w
prasie branowej i blogger (http://art-of-software.blogspot.com).

/www.programistamag.pl/ 29

You might also like