Domain-Driven Design: kiedy warto użyć DDD, a kiedy tylko skomplikuje projekt
Domain-Driven Design często pojawia się w rozmowach o architekturze jako synonim „dobrze zaprojektowanego backendu”. To zbyt duże uproszczenie. DDD nie jest frameworkiem, gotową strukturą katalogów ani obowiązkowym krokiem przed napisaniem aplikacji.
To sposób projektowania oprogramowania wokół wiedzy o biznesie, jego języka oraz reguł, które odróżniają firmę od prostego zestawu formularzy i tabel.
DDD może znacząco ułatwić rozwój złożonego systemu. Zastosowane bez realnej potrzeby dodaje jednak nowe pojęcia, warstwy i koszt utrzymania. Najważniejsze pytanie nie brzmi więc „czy DDD jest dobre?”, lecz „czy problem biznesowy jest na tyle złożony, że ten sposób modelowania się opłaci?”.
Jeśli oceniasz szerszy zakres projektu, zacznij od odpowiedzialności, jaką ma przejąć backend i API aplikacji, a dopiero potem wybieraj wzorce modelowania.
Jaki problem rozwiązuje Domain-Driven Design?
W prostym systemie operacje są łatwe do opisania: dodaj rekord, zmień status, wyświetl listę. W bardziej złożonym biznesie sama baza danych nie wyjaśnia jednak, dlaczego dana operacja jest dozwolona.
Przykładowo zamówienie może zostać anulowane tylko na określonym etapie, rabat może zależeć od kilku warunków, a zmiana terminu może wymagać ponownej rezerwacji zasobu. Te zasady tworzą model biznesowy. Gdy są rozproszone między kontrolerami, formularzami, zadaniami w tle i integracjami, każda zmiana staje się ryzykowna.
DDD pomaga:
- nazwać najważniejsze pojęcia w sposób zrozumiały dla biznesu i programistów,
- umieścić reguły blisko modelu, którego dotyczą,
- wyznaczyć granice między różnymi częściami działalności,
- chronić ważne zasady przed przypadkowym ominięciem,
- łatwiej ocenić wpływ zmiany na pozostałe elementy systemu.
DDD strategiczne i taktyczne to nie to samo
Domain-Driven Design można podzielić na dwa poziomy.
DDD strategiczne pomaga zrozumieć biznes i podzielić system na logiczne obszary. Wprowadza między innymi wspólny język oraz ograniczone konteksty, czyli granice, wewnątrz których dane pojęcie ma jedno konkretne znaczenie.
DDD taktyczne dotyczy sposobu modelowania kodu. Obejmuje encje, obiekty wartości, agregaty, zdarzenia domenowe i repozytoria.
Projekt może odnieść dużą korzyść z poziomu strategicznego bez wdrażania wszystkich wzorców taktycznych. Często właśnie takie lekkie podejście daje najlepszy stosunek wartości do złożoności.
Kiedy warto zastosować DDD?
1. Reguły biznesowe są złożone i często się zmieniają
DDD ma sens, gdy system nie tylko zapisuje dane, ale podejmuje decyzje na podstawie wielu zależnych warunków. Im więcej wyjątków, stanów procesu i konsekwencji jednej operacji, tym bardziej przydaje się jawny model domeny.
Dobrym sygnałem są zdania typu:
- „to zależy od rodzaju klienta i etapu procesu”,
- „tego statusu nie można zmienić po rozliczeniu”,
- „wyjątek obowiązuje tylko dla tego kanału sprzedaży”,
- „ta wartość wynika z kilku innych parametrów”.
Jeżeli podobne zasady stanowią główną wartość systemu, nie powinny być ukryte w przypadkowych fragmentach kodu.
2. Biznes i zespół techniczny używają różnych słów
Gdy jedno pojęcie ma kilka nazw albo ta sama nazwa oznacza różne rzeczy, błędy zaczynają się jeszcze przed implementacją. DDD wymaga budowania wspólnego języka używanego w rozmowach, dokumentacji, testach i kodzie.
Nie chodzi o stworzenie słownika dla samego słownika. Celem jest ograniczenie sytuacji, w których poprawnie napisany kod realizuje błędnie zrozumianą regułę.
3. System ma być rozwijany przez lata
Koszt modelowania zwraca się podczas kolejnych zmian. Jeśli aplikacja ma obsługiwać ważny proces przez długi czas, czytelne granice i reguły ułatwiają dodawanie funkcji bez naruszania istniejącego zachowania.
Dla jednorazowego narzędzia korzyść może być zbyt mała. Dla produktu, który będzie regularnie rozwijany, staje się znacznie ważniejsza.
4. Kilka obszarów biznesowych zaczyna się mieszać
Sprzedaż, rozliczenia, realizacja zamówień i obsługa klienta mogą używać podobnych danych, ale mają inne cele oraz reguły. Próba stworzenia jednego uniwersalnego modelu dla wszystkich obszarów często prowadzi do silnych zależności.
Ograniczone konteksty pozwalają zachować osobne modele i jasno określić sposób wymiany informacji między nimi. Nie oznacza to automatycznie osobnych aplikacji lub mikroserwisów. Granice mogą istnieć również w dobrze zaprojektowanym monolicie.
5. Błąd reguły biznesowej jest kosztowny
Jeśli nieprawidłowa decyzja może prowadzić do błędnego rozliczenia, naruszenia umowy, utraty danych lub zatrzymania procesu, reguły wymagają szczególnej ochrony i dobrych testów.
Model domenowy pozwala wyrazić warunki w jednym miejscu i utrudnia wykonanie operacji, która łamie ważne założenia.
Kiedy DDD prawdopodobnie nie jest potrzebne?
Prosta aplikacja typu CRUD
Jeśli system głównie tworzy, wyświetla i edytuje dane, rozbudowany model domenowy może tylko zwiększyć liczbę plików i pojęć. Prosta, modułowa architektura będzie łatwiejsza do zbudowania oraz utrzymania.
Wczesny prototyp lub małe MVP
Gdy celem jest szybkie sprawdzenie pomysłu, a reguły jeszcze nie są znane, pełne DDD może utrwalić założenia, które za chwilę się zmienią. Warto zadbać o czytelny kod i język biznesowy, ale bardziej zaawansowane wzorce mogą poczekać.
Jeśli dopiero oceniasz, czy własny produkt jest właściwym kierunkiem, pomocne będzie wcześniejsze porównanie dedykowanego oprogramowania z gotowym SaaS-em.
System jest głównie warstwą integracyjną
Niektóre aplikacje przede wszystkim pobierają dane z jednego API, przekształcają je i wysyłają dalej. Jeśli nie zawierają istotnych reguł własnego biznesu, wzorce domenowe mogą nie dać wystarczającej wartości.
Brakuje dostępu do wiedzy domenowej
DDD wymaga regularnej współpracy z osobami, które rozumieją proces. Bez ich udziału programiści stworzą model oparty na przypuszczeniach. Jego nazwy mogą wyglądać profesjonalnie, ale nie będą odzwierciedlać rzeczywistości.
W takim przypadku pierwszym problemem do rozwiązania nie jest architektura, lecz dostęp do informacji i osób podejmujących decyzje.
DDD nie oznacza mikroserwisów
To jedno z najczęstszych nieporozumień. Ograniczony kontekst jest granicą modelu i odpowiedzialności. Mikroserwis jest sposobem uruchamiania oraz rozwijania części systemu jako osobnej usługi.
Można używać DDD w monolicie, zachowując moduły odpowiadające różnym kontekstom. Dla wielu nowych projektów taki modularny monolit jest rozsądniejszym początkiem: upraszcza wdrożenie i komunikację, a jednocześnie chroni granice biznesowe.
Mikroserwisy mają sens dopiero wtedy, gdy niezależne wdrażanie, skalowanie lub odpowiedzialność zespołów uzasadniają ich koszt operacyjny.
Jak zastosować DDD bez nadmiernej komplikacji?
Nie trzeba zaczynać od wszystkich wzorców. Praktyczna kolejność wygląda następująco:
- Zmapuj proces i decyzje. Zapisz główne kroki, reguły, wyjątki oraz zdarzenia ważne dla biznesu.
- Ustal wspólny język. Wybierz jednoznaczne nazwy i używaj ich konsekwentnie w rozmowach, wymaganiach, kodzie oraz testach.
- Wyznacz granice. Oddziel obszary, które mają inne cele, reguły lub znaczenie tych samych danych.
- Modeluj najważniejsze zasady. Zacznij od części systemu, która daje firmie przewagę albo niesie największe ryzyko.
- Dodawaj wzorce tylko wtedy, gdy rozwiązują problem. Obiekt wartości czy zdarzenie domenowe powinny upraszczać model, a nie służyć jako dowód zastosowania DDD.
- Testuj zachowanie domeny. Testy powinny opisywać reguły biznesowe, a nie wyłącznie techniczne szczegóły implementacji.
Takie podejście pozwala korzystać z DDD stopniowo. Architektura rośnie razem ze zrozumieniem domeny, zamiast wyprzedzać rzeczywisty problem.
Jak DDD wpływa na koszt projektu?
Na początku analiza domeny i modelowanie wymagają dodatkowego czasu. Nie jest to darmowa warstwa jakości. Inwestycja ma się zwrócić dzięki mniejszej liczbie nieporozumień, bezpieczniejszym zmianom oraz czytelniejszym granicom odpowiedzialności.
Jeżeli system jest prosty, zwrot może nigdy nie nastąpić. Jeżeli reguły są złożone i często się zmieniają, koszt braku modelu pojawia się przy każdej kolejnej funkcji.
Dlatego DDD powinno być świadomym elementem zakresu i architektury. Więcej o czynnikach wpływających na budżet znajdziesz w artykule ile kosztuje dedykowane oprogramowanie.
Krótka lista decyzyjna
Rozważ DDD, jeśli na większość poniższych pytań odpowiadasz „tak”:
- Czy system zawiera wiele zależnych reguł i wyjątków?
- Czy pojęcia biznesowe są niejednoznaczne?
- Czy różne obszary firmy rozumieją te same dane inaczej?
- Czy aplikacja będzie rozwijana przez długi czas?
- Czy błędne wykonanie reguły ma poważne konsekwencje?
- Czy masz regularny dostęp do osób znających domenę?
Jeżeli większość odpowiedzi brzmi „nie”, zacznij od prostszej architektury. Można ją uporządkować i przygotować na rozwój bez wprowadzania pełnego zestawu wzorców DDD.
Najpierw domena, potem wzorce
Największą wartością Domain-Driven Design nie są klasy o odpowiednich nazwach. Jest nią wspólne i precyzyjne rozumienie biznesu, zapisane w granicach systemu oraz jego zachowaniu.
DDD jest dobrym wyborem, gdy to właśnie reguły oraz wiedza domenowa stanowią najtrudniejszą część projektu. Jeśli trudność leży gdzie indziej, prostsze rozwiązanie zwykle będzie lepszą decyzją inżynierską.