P-programowanie P-programowanie
  • Języki programowania
  • Nauka i praca
  • Porady
  • Więcej niż programowanie
ARTYKUŁ: Czym jest Domain-Driven Design i jak go wdrożyć?
Udostępnij
P-programowanieP-programowanie
Font ResizerAa
Wyszukiwarka
  • Języki programowania
  • Nauka i praca
  • Porady
  • Więcej niż programowanie
Social media
Copyright © P-programowanie.
Porady

Czym jest Domain-Driven Design i jak go wdrożyć?

Miłosz Kenig
przez Miłosz Kenig
Aktualizacja: 2026-05-12
13 min. czytania
Myślenie biznesmen wektor
Udostępnij

Domain-Driven Design (DDD) to podejście do tworzenia oprogramowania, które stawia na pierwszym miejscu głębokie zrozumienie domeny biznesowej, a dopiero później detale techniczne.

Spis treści
  • Zrozumienie Domain-Driven Design – definicja, pochodzenie i główna filozofia
  • Projektowanie strategiczne – ustanawianie struktury domeny poprzez bounded contexts i ubiquitous language
    • Ubiquitous language – podstawa wspólnego zrozumienia
    • Bounded contexts – tworzenie klarownych granic organizacyjnych
    • Subdomeny – kategoryzowanie złożoności domeny
  • Wzorce projektowania taktycznego – podstawowe elementy modeli domenowych
    • Encje i obiekty wartości – rozróżnianie obiektów domeny
    • Agregaty i korzenie agregatów – granice spójności
    • Usługi domenowe – kapsułkowanie operacji, które nie pasują do obiektów
    • Repozytoria – abstrakcja warstwy trwałości
    • Fabryki i tworzenie obiektów wartości
    • Zdarzenia domenowe – rejestrowanie zmian stanu i efektów ubocznych
  • Event storming i współdzielone modelowanie domeny
    • Proces event storming – od odkrywania do bounded contexts
  • Wdrażanie bounded contexts i zarządzanie relacjami między kontekstami
    • Relacje partnerstwo i współdzielone jądro
    • Relacje customer–supplier i open host service
    • Anti-corruption layer – ochrona przed korumpującymi wpływami
  • Praktyczna implementacja Domain-Driven Design
    • Faza analizy strategicznej i planowania
    • Projektowanie klarownych granic bounded contexts
    • Modelowanie warstwy domeny
    • Orkiestracja warstwy aplikacji
    • Implementacja warstwy infrastruktury
    • Testowanie logiki domenowej w izolacji
  • Command Query Responsibility Segregation (CQRS) – rozdzielenie modeli odczytu i zapisu
  • Najczęstsze wyzwania implementacyjne i antywzorce
    • Błędne rozumienie ubiquitous language i bounded contexts
    • Przeinżynierowanie prostych domen
    • Anemiczne modele domenowe i wzorce proceduralne
    • Przerośnięte agregaty i niejasne granice spójności
    • Niewystarczająca współpraca i pomijanie projektowania strategicznego
    • Proliferacja usług domenowych wskazująca na złą organizację
  • DDD w architekturze mikroserwisów

Metodyka zaproponowana przez Erica Evansa w książce „Domain-Driven Design: Tackling Complexity in the Heart of Software” (2003) stała się standardem dla organizacji budujących złożone systemy ze skomplikowaną logiką i zmiennymi wymaganiami. Istotą DDD jest ścisła współpraca ekspertów domenowych i programistów, tworzenie modelu wiernie odzwierciedlającego rzeczywistość biznesową oraz używanie wspólnego słownika – Ubiquitous Language.

Poprzez dzielenie systemu na logiczne Bounded Contexts z wyraźnymi granicami oraz tworzenie świadomych relacji między nimi, DDD wspiera architektury skalowalne, łatwe w utrzymaniu i zbieżne z celem biznesowym. Artykuł omawia podstawy DDD, wzorce strategiczne i taktyczne, praktyki wdrożeniowe oraz typowe pułapki w projektach komercyjnych.

Zrozumienie Domain-Driven Design – definicja, pochodzenie i główna filozofia

DDD wyrasta z obserwacji, że wiele zespołów przedkłada technikalia nad realia biznesowe, co skutkuje rozwiązaniami nieadekwatnymi do potrzeb. DDD przesuwa akcent z technologii na domenę – konkretny obszar wiedzy i aktywności biznesowej – i podporządkowuje jej model oraz decyzje projektowe.

Współczesne systemy rosną w złożoność: mają liczne reguły, wielu interesariuszy i szybko ewoluujące wymagania. DDD zapewnia strukturę, która utrzymuje zgodność architektury ze strategią i celami biznesowymi przez cały cykl życia produktu.

Warunkiem sukcesu jest zrozumienie domeny poprzez intensywną współpracę z ekspertami. Programiści stopniowo stają się współ-ekspertami, a decyzje techniczne odzwierciedlają fakty biznesowe, nie preferencje architektoniczne. Wspólny model i język eliminują rozjazdy mentalnych modeli między IT a biznesem.

Projektowanie strategiczne – ustanawianie struktury domeny poprzez bounded contexts i ubiquitous language

Projektowanie strategiczne działa „ponad” wzorcami taktycznymi: porządkuje duże systemy, definiuje granice odpowiedzialności i mechanizmy komunikacji. Dwa filary to Ubiquitous Language i Bounded Contexts.

Ubiquitous language – podstawa wspólnego zrozumienia

Ubiquitous Language to precyzyjny, współtworzony słownik pojęć zrozumiały dla ekspertów domenowych, programistów, architektów i analityków. Powinien być konsekwentnie używany w kodzie, dokumentacji, diagramach i rozmowach. Konsekwencja językowa minimalizuje nieporozumienia, upraszcza modelowanie i przyspiesza decyzje.

Eksperci kwestionują niejasne terminy; programiści wyrażają logikę słownictwem domeny. Dzięki temu kod czyta się jak logikę biznesową, a nie techniczne rusztowanie.

Bounded contexts – tworzenie klarownych granic organizacyjnych

Bounded Context to zakres, w którym model ma spójne znaczenie i nie ulega dwuznaczności. Ten sam termin („produkt”, „klient”) może znaczyć co innego w sprzedaży i w magazynie — i to jest w porządku, jeśli każdy kontekst utrzymuje własny model i język, a integracje są jawnie zarządzane.

Bounded Context żyje w Solution Space, a subdomena w Problem Space. Jeden kontekst może odwzorowywać jedną lub wiele subdomen – ważne, by wewnątrz zachować jednoznaczność i spójność. Dobre granice umożliwiają autonomię zespołów i skalowalność rozwoju.

Subdomeny – kategoryzowanie złożoności domeny

Aby właściwie inwestować wysiłek i zasoby, warto rozróżniać typy subdomen:

  • Core Domain – krytyczny obszar przewagi konkurencyjnej; wymaga najlepszych inżynierów, najwyższej jakości projektowej i największej inwestycji (często to niewielki procent kodu dostarczający większość wartości);
  • Supporting Subdomains – funkcje wspierające core domain, specyficzne dla organizacji; warto je szyć na miarę, choć nie zawsze wymagają najbardziej wyrafinowanej architektury;
  • Generic Subdomains – zdolności generyczne (np. fakturowanie, uwierzytelnianie, płatności), które najlepiej pozyskiwać jako gotowe rozwiązania, oszczędzając zasoby na elementy różnicujące.

Taki podział porządkuje alokację zasobów, decyzje build vs. buy i dobór kompetencji zespołów.

Wzorce projektowania taktycznego – podstawowe elementy modeli domenowych

Wzorce taktyczne przekuwają rozumienie domeny w kod: pozwalają czysto wyrażać reguły i inwarianty oraz testować logikę w izolacji.

Encje i obiekty wartości – rozróżnianie obiektów domeny

Warstwa domeny operuje głównie na dwóch typach obiektów. Dla przejrzystości porównanie kluczowych własności wygląda następująco:

Cecha Entity (Encja) Value Object (Obiekt wartości)
Tożsamość Istotna i trwała w czasie (ID); Brak – liczą się wyłącznie atrybuty;
Równość Po tożsamości; Po wszystkich atrybutach;
Mutowalność Zwykle mutowalne (zmienia się stan); Z zasady niemutowalne;
Przykłady Klient, Zamówienie, Produkt; Money, Address, Numer telefonu;
Implikacje projektowe Trzeba strzec spójności i inwariantów; Łatwe kopiowanie, porównywanie, współdzielenie.

Wybór typu obiektu determinuje decyzje projektowe: obiekty wartości upraszczają rozumowanie i testy, encje wymagają zarządzania całym cyklem życia i regułami zmian.

Agregaty i korzenie agregatów – granice spójności

Aggregate to klaster encji i obiektów wartości będący jednostką spójności i transakcji. Inwarianty obowiązują wewnątrz agregatu i muszą być utrzymane po każdej modyfikacji.

Aggregate Root to jedyny publiczny punkt dostępu; wszystkie zmiany przechodzą przez korzeń, który egzekwuje reguły. To zabezpiecza model przed niespójnymi modyfikacjami.

Granice agregatu powinny być małe i skupione na konkretnych inwariantach. Gdy obiekty nie muszą zmieniać się razem – należą do osobnych agregatów i komunikują się przez identyfikatory lub zdarzenia.

Usługi domenowe – kapsułkowanie operacji, które nie pasują do obiektów

Nie każdą regułę sensownie osadzić w encji lub obiekcie wartości. Domain Service kapsułkuje bezstanową logikę przekrojową (np. kalkulację kosztu wysyłki), nie mieszając jej z odpowiedzialnościami agregatów. Usługi domenowe wyrażają czystą logikę biznesową; orkiestracja i infrastruktura należą do warstwy aplikacji.

Repozytoria – abstrakcja warstwy trwałości

Repository ukrywa mechanizmy persystencji i pozwala operować agregatami jak na kolekcjach w pamięci. Izoluje domenę od infrastruktury, ułatwia testowanie i daje elastyczność zmiany technologii.

W DDD repozytorium istnieje dla korzenia agregatu (nie dla każdej encji). Operacje koncentrują się na pobieraniu po tożsamości, zapisywaniu oraz zapytaniach według reguł (np. Specifications).

Fabryki i tworzenie obiektów wartości

Factory kapsułkuje złożoną inicjalizację agregatów i obiektów wartości: walidacje, inwarianty, koordynację wielu elementów. Zapewnia, że obiekty powstają w stanie ważnym i upraszcza warstwę aplikacji.

Zdarzenia domenowe – rejestrowanie zmian stanu i efektów ubocznych

Domain Events modelują znaczące zmiany w domenie (np. OrderPlaced, PaymentProcessed). Ujawniamy skutki i rozsprzęglamy agregaty – zamiast bezpośrednich wywołań, publikujemy zdarzenia i reagujemy na nie w odpowiednich handlerach.

Zdarzenia domenowe różnią się od integracyjnych: zwykle są przetwarzane synchronicznie w obrębie tego samego procesu, by zachować spójność lokalną.

Event storming i współdzielone modelowanie domeny

Event Storming (Alberto Brandolini) to szybka technika warsztatowa do odkrywania procesów, identyfikacji agregatów i wyznaczania granic kontekstów na wspólnym „płótnie”.

Proces event storming – od odkrywania do bounded contexts

Typowy przebieg warsztatu obejmuje następujące kroki:

  1. Identyfikacja Domain Events – zdarzeń wyrażanych w czasie przeszłym i układanych chronologicznie.
  2. Wyszukanie Commands – działań użytkowników lub systemów wyzwalających zdarzenia.
  3. Określenie Actors – ról inicjujących komendy (ludzie, systemy).
  4. Aggregate identification – grupowanie komend i zdarzeń w naturalne jednostki spójności.
  5. Wyznaczenie Bounded Context boundaries – łączenie agregatów, które zmieniają się razem; rozdzielanie tych, które ewoluują niezależnie.

Wdrażanie bounded contexts i zarządzanie relacjami między kontekstami

Wyraźne granice wspierają skalowalność i niezależność zespołów, ale wymagają świadomego modelowania relacji i kontraktów.

Relacje partnerstwo i współdzielone jądro

W Partnership dwa konteksty o współzależnych celach ściśle koordynują zmiany, dzieląc odpowiedzialność i ryzyko. Sprawdza się przy częstej interakcji, ale wymaga świetnej komunikacji.

Shared Kernel polega na współdzieleniu niewielkiej części modelu (np. obiektów wartości). Wprowadza sprzężenie i wymaga rygoru zmian, dlatego należy go używać oszczędnie.

Relacje customer–supplier i open host service

W relacji Customer–Supplier dostawca definiuje kontrakt, a klient od niego zależy; to asymetria często odpowiadająca strukturze organizacyjnej.

Open Host Service udostępnia ustandaryzowany interfejs, z którego może korzystać wiele klientów – zamiast tworzenia wielu relacji punkt–punkt.

Anti-corruption layer – ochrona przed korumpującymi wpływami

Anti-Corruption Layer (ACL) tłumaczy pojęcia i dane między niekompatybilnymi modelami (np. przy integracji z legacy), chroniąc lokalny model przed degradacją. ACL absorbuje złożoność i utrzymuje klarowność pojęć w nowym systemie.

Praktyczna implementacja Domain-Driven Design

Teoria jest fundamentem, lecz wdrożenie wymaga pragmatyzmu, iteracji i dyscypliny technicznej.

Faza analizy strategicznej i planowania

Warto zacząć od warsztatów z ekspertami i architektami, identyfikacji subdomen oraz wstępnych granic kontekstów (np. poprzez Event Storming). Wyraźnie wskaż, co jest core domain, co wspierające, a co generyczne – to ukierunkuje inwestycje i decyzje build vs. buy.

Projektowanie klarownych granic bounded contexts

Granice powstają iteracyjnie – wraz z lepszym zrozumieniem domeny. Każdy kontekst powinien mieć jasną odpowiedzialność i właściciela (zespół), co ułatwia spójne decyzje i rozliczalność jakości.

Modelowanie warstwy domeny

Logika biznesowa powinna być niezależna od frameworków i baz. Agregaty i obiekty wartości wyrażają operacje domenowe (np. AddLineItem, ConfirmPayment), egzekwując inwarianty przez kontrolowane interfejsy i fabryki.

Orkiestracja warstwy aplikacji

Warstwa aplikacji orkiestruje przypadki użycia: odbiera żądania, woła domenę i repozytoria, koordynuje persystencję oraz komunikację. Pozostaje cienka i wolna od reguł biznesowych.

Implementacja warstwy infrastruktury

Infrastruktura realizuje interfejsy zdefiniowane w domenie (persystencja, messaging, integracje), utrzymując separację od logiki biznesowej i umożliwiając wymienność technologii.

Testowanie logiki domenowej w izolacji

Testy jednostkowe modeli domenowych w pamięci są szybkie i wiarygodne; weryfikują inwarianty, sekwencje zmian stanu i reguły bez udziału infrastruktury.

Command Query Responsibility Segregation (CQRS) – rozdzielenie modeli odczytu i zapisu

CQRS rozdziela model zapisu (komendy) od modelu odczytu (zapytania). Model zapisu dba o reguły i spójność, a model odczytu jest zdenormalizowany i zoptymalizowany pod potrzeby interfejsu oraz wydajność. Pozwala to utrzymać prosty, poprawny model zapisu i szybkie, elastyczne odczyty.

Sprawdza się tam, gdzie wzorce zapisu i odczytu znacząco się różnią (np. złożone składanie zamówień vs. proste, częste sprawdzanie statusu).

Najczęstsze wyzwania implementacyjne i antywzorce

Błędne rozumienie ubiquitous language i bounded contexts

Ten sam termin z innym znaczeniem w różnych miejscach systemu to prosta droga do chaosu. Wymagaj precyzji definicji, dokumentuj uzgodnienia i pilnuj granic kontekstów.

Przeinżynierowanie prostych domen

DDD nie jest panaceum. W prostych aplikacjach CRUD rozbudowane agregaty czy zdarzenia bywają przerostem formy nad treścią. Stosuj DDD tam, gdzie złożoność naprawdę tego wymaga.

Anemiczne modele domenowe i wzorce proceduralne

Modele bez logiki łamią ducha DDD. Reguły powinny żyć w obiektach domenowych, a nie w usługach proceduralnych.

Przerośnięte agregaty i niejasne granice spójności

Zbyt szerokie agregaty powodują blokady, trudne testy i niejasną semantykę. Projektuj najmniejsze możliwe granice utrzymujące wymagane inwarianty.

Niewystarczająca współpraca i pomijanie projektowania strategicznego

Rozpoczynanie implementacji bez wspólnego odkrywania domeny zwykle kończy się reworkiem. Inwestuj w warsztaty i mapowanie kontekstów, zanim zejdziesz do taktyki.

Proliferacja usług domenowych wskazująca na złą organizację

Nadmierna liczba usług domenowych często oznacza, że logika powinna wrócić do encji lub zostać zawężona w agregatach.

DDD w architekturze mikroserwisów

DDD naturalnie współgra z mikroserwisami: jeden mikroserwis często odpowiada jednemu bounded context, utrzymując własny model, bazę i granice spójności; komunikacja odbywa się przez API lub zdarzenia asynchroniczne.

Nie ma jednak dogmatu 1:1. To domena powinna dyktować granice: czasem jeden kontekst wymaga kilku usług (powody wdrożeniowe, skalowanie), a czasem kilka kontekstów współistnieje w jednej usłudze. Decyzje architektoniczne muszą wypływać z modelu, nie z mody.

Powiązane wpisy:

  1. Jak skonfigurować własną domenę na Blogger i Blogspot? Praktyczne wskazówki i rozwiązania problemów
  2. Jak przekierować WWW na bez WWW w pliku .htaccess?
  3. Jak garbage collector w programowaniu poprawia zarządzanie pamięcią i wydajność aplikacji?
  4. ASP.NET MVC – dlaczego warto go używać do tworzenia nowoczesnych aplikacji webowych?
Podziel się artykułem
Facebook Kopiuj link Drukuj
przezMiłosz Kenig
Follow:
Miłosz Kenig to absolwent informatyki na Politechnice Warszawskiej, który po ukończeniu studiów zdobył ponad 6 lat doświadczenia zawodowego jako programista full-stack w kilku firmach technologicznych. W swojej karierze pracował z szerokim spektrum technologii, sprawnie poruszając się między 5 różnymi językami programowania, w tym Java, Python i JavaScript. Jako autor tekstów na blogu P-programowanie.pl, Miłosz wykorzystuje swoje praktyczne doświadczenie zdobyte przy realizacji ponad 15 komercyjnych projektów technologicznych.
Poprzedni Ola Kunysz Wypalenie w IT: jak stres zmienia mózg i nasze zachowania – wywiad
Następny Scena Inspire - Infoshare 2026 Infoshare 2026: jubileuszowa edycja największej technologicznej konferencji w regionie
Brak komentarzy

Dodaj komentarz Anuluj pisanie odpowiedzi

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *


- Reklama -
Opanuj dowolny język programowaniaOpanuj dowolny język programowania
Najnowsze
Złożony obraz wściekłej bizneswoman z klasą krzyczy na jej smartfonie
Jak zacząć kontrybuować do open source – poradnik krok po kroku
2026-06-02
Wpisywanie raportów szpitalnych Tworzenie nowego programu do czytania e-booków Globalny system czatowania Struktura połączenia internetowego Proces obsługi witryny Techniki programowania
Jak działa HTTP – metody, statusy i nagłówki w pigułce
2026-05-28
Podwójna ekspozycja kobiecych rąk piszących na komputerze i kreatywnego rysowania Koncepcja uruchomienia
Tailwind CSS – nowoczesne podejście do stylowania stron
2026-05-27
Scena Inspire - Infoshare 2026
Infoshare 2026: jubileuszowa edycja największej technologicznej konferencji w regionie
2026-05-22
Myślenie biznesmen wektor
Czym jest Domain-Driven Design i jak go wdrożyć?
2026-05-12

P-programowanie

Darmowa wiedza o programowaniu dla każdego.

Przeczytaj też

W3Schools
Porady

Co to W3Schools? Jak platforma wspiera naukę kodowania online?

11 min. czytania
calendar
Porady

Jaki laptop do programowania wybrać? Kluczowe parametry i zalety poleasingowych modeli

25 min. czytania
Side profile of a man in a hoodie, surrounded by red code, depicting cybersecurity theme.
Porady

Jak garbage collector w programowaniu poprawia zarządzanie pamięcią i wydajność aplikacji?

24 min. czytania
person using laptop
Porady

Jak skonfigurować własną domenę na Blogger i Blogspot? Praktyczne wskazówki i rozwiązania problemów

24 min. czytania

Twoja wiedza o programowaniu

Szczerze o programowaniu dla każdego.
P-programowanie P-programowanie

O programowaniu bez tajemnic. Blog informacjami, poradnikami, przeglądami dla obecnych i przyszłych programistów.

Strony

  • Strona główna
  • O P-programowanie
  • Polityka prywatności
  • Kontakt

Kategorie

  • Języki programowania
  • Nauka i praca
  • Porady
  • Więcej niż programowanie

100+ języków programowania

Poznaj ponad setkę najpopularniejszych języków programowania w na świecie.
Języki programowania
Welcome Back!

Sign in to your account

Username or Email Address
Password

Lost your password?