Po 6 latach praktykowania DDD, prowadzenia i uczestniczenia w licznych warsztatach i szkoleniach chyba wreszcie zrozumiałem o co chodzi w całym tym
Domain Driven Design...
Wszystko dzięki trafiającemu (jak zwykle) w sedno postowi Jarka Żelińskiego:
Czy aby na pewno zarządzamy procesami biznesowymi?
Wstęp
Patrząc na warstwową architekturę systemu opartego na DDD mamy:
UI
----------------------
Application (API)
----------------------
Domain Model
----------------------
Infrastructure
(możemy użyć również popularnej ostatnio metafory
Heksagonu - ale nie wpływa to na wywód)
W warstwach UI+APPlication możemy możemy mieć zamodelowany proces biznesowy. Ew. szczególnym klientem do API (również obok np apliakcji webowej) może być silnik procesów biznesowych.
W warstwie Domain rezyduje model bazowych reguł biznesu ("fizyki" biznesu) zamodelowany przy pomocy Building Blocks DDD, które chronią niezmienniki. Więcej o BB:
DDD krok po kroku.
Problem: Od czego zacząć modelowanie?
Od procesu czy od domeny? Innymi słowy: od ogółu czy od szczegółu?
W Domain Driven Design zaczynamy (niespodzianka) od modelowania warstwy Domain. API i proces to rzecz wtórna.
To zależy...
Jak w każdym nietrywialnym przypadku, odpowiedź na pytanie zależy od kontekstu.
W przytoczonym na wstępie artykule znajdziemy olśniewającą (przynajmniej dla mnie) wskazówkę:
- czy proces biznesowy wyłania się z reguł niższego rzędu - innymi słowy model domenowy nakłada ograniczania, które wyznaczają "trajektorię" procesu, który lawiruje pomiędzy nimi niczym strumień rzeki w jej korycie (posługując się metaforą Jarka)
- czy może to raczej proces narzuca kształt modelowi domenowemu?
W DDD podchodzimy do modelu w ten pierwszy sposób - zaczynamy od domeny, czyli fundamentalnych reguł i ograniczeń, w które wpasowuje się proces.
Trudne pytanie
Po czym poznać z którą sytuacją masz do czynienia? Najpewniej w dużym systemie mamy obie...
//===============================
To w sumie wydaje się oczywiste, ale sztuką jest tak ubrać myśl w słowa, aby (np przez porównanie dwóch podejść) ująć ideę w jednoznaczny sposób.