Reference · DDD Cheat Sheet

DDD Cheat Sheet

Jednostránková navigace celou knihou. Kdo si pamatuje jen pojem, najde zde odkaz na detail. Kdo neví, který vzor použít, projde rozhodovací strom. Příklady stránka nemá, ty jsou v odkazovaných kapitolách.

Autor M. Katuščák
Publikováno · Aktualizováno ·
Obsah kapitoly

Cheat sheet doplňuje glosář a referenční rozcestník. Z jediné stránky vede odkaz na tu část knihy, kterou právě potřebujete, a strukturu obsahu si není třeba pamatovat.

cs.01 Rozhodovací strom – co použít a kdy

Tabulka přiřazuje typickému symptomu nebo požadavku vzor a odkazuje na kapitolu s detailem. Vyčerpávající není. Pokrývá 14 nejčastějších situací, na které DDD odpovídá konkrétním vzorem.

Situace Vzor Detail
Složitá doména, která tvoří jádro byznysu Plné DDD – strategické i taktické Co je Domain-Driven Design · Subdomény: Core, Supporting, Generic
Dva nebo více Bounded Contextů, které spolu komunikují Context Map Bounded Context a Context Mapping
Legacy systém, ze kterého je třeba přebírat data Anti-Corruption Layer (ACL) Context Mapping – ACL
Dlouhotrvající proces s kompenzacemi Sága / Process Manager Ságy a Process Managery
Stav je posloupnost událostí Event Sourcing Event Sourcing
Oddělené čtení a zápis CQRS CQRS
Zápis stavu a publikace události v jedné transakci Outbox Pattern Outbox Pattern
Skládatelné doménové pravidlo Specification Specification Pattern
Logika, která nepatří do entity Domain Service (doménová služba) Domain Services
Složitý vznik agregátu Factory Factories
Workshop pro objevení domény Event Storming Event Storming a Domain Storytelling
Reorganizace týmů kolem Bounded Contextů Team Topologies Conway's Law a Team Topologies
Autorizace na úrovni use casu Symfony Voter Autorizace – Voter
Postupná migrace z CRUD Strangler Fig Pattern Migrace z CRUD na DDD

cs.02 Mapování Symfony ↔ DDD (rychlá tabulka)

Krátká verze tabulky pro rychlou orientaci. Plná verze s odkazy na anti-vzory a kapitoly je v glosáři, sekce „Mapování Symfony ↔ DDD (rozšířená tabulka)“.

Konstrukt Symfony Pojem DDD Poznámka
Controller Driving adaptér (HTTP) Doménová logika do něj nepatří
#[AsMessageHandler] handler Aplikační služba (use case) Jeden command = jeden handler; doménovou logiku deleguje na agregát
EventSubscriber (Doctrine/Kernel) Infrastruktura Nejde o handler doménové události
Handler doménové události Aplikační služba Reaguje na doménovou událost, rozhodnutí nechává agregátu nebo doménové službě
Entity (s ORM) Kořen agregátu nebo entita Výchozí je mapování atributy; oddělený persistence model popisuje Persisted Object
Repository (Doctrine) Repozitář Rozhraní v doméně, implementace v infrastruktuře
Voter Autorizace use casu Doménové invarianty hlídá agregát, ne Voter
Service (autowire) Aplikační, doménová nebo infrastrukturní služba Typ služby musí být z kódu poznat
Form Mapování vstupu Plní command DTO, metody agregátu nevolá
Messenger transport (sync) Command a event bus uvnitř procesu Monolit
Messenger transport (async) Asynchronní zpracování Přes hranici kontextu jen integrační události přes Outbox (AMQP, Kafka)

cs.03 False friends – slovní pasti

Stejné slovo znamená v DDD něco jiného než v Symfony, PHP nebo SQL. Tabulka shrnuje 7 nejčastějších záměn. Úplný přehled s 9 hesly a podrobnějším rozborem je v glosáři, sekce „Slovní pasti – false friends“.

Pojem V DDD V Symfony / obecně Jak je rozlišit
ACL Anti-Corruption Layer Access Control List V DDD literatuře vždy to první
Repository Doménová kolekce agregátů Třída Doctrine EntityRepository Repozitář v DDD je rozhraní, třída Doctrine jeho implementace
Service Bezstavový objekt (doménová, aplikační nebo infrastrukturní služba) Služba Symfony (cokoli v DI kontejneru) Typ služby patří do názvu nebo namespace
Event Doménová událost (OrderPlaced) Událost Symfony EventDispatcheru Událost Symfony ≠ doménová událost
Entity Objekt s identitou v doméně Entita Doctrine (mapovaná přes ORM) Entita v DDD může ležet i uvnitř agregátu
Aggregate Konzistentní shluk objektů Agregační funkce SQL (SUM, COUNT) Významy se nepřekrývají, začátečníky ale matou
Domain Oblast podnikání Translation domain v Twigu (messages) Obvykle se myslí DDD

cs.04 Průchody knihou – co číst podle role

Kniha má 25 kapitol a nikdo nemusí číst všechny. Následují čtyři průchody pro typické role a situace. Každý respektuje závislosti mezi kapitolami a vede od základů k pokročilým tématům. Doba čtení vychází z odhadů v obsahu knihy.

Junior PHP vývojář, první kontakt s DDD

Pokud jste s DDD nikdy nepracovali a chcete pochopit, o co jde, dřív než začnete refaktorovat produkční kód:

  1. 01 – Co je Domain-Driven Design
  2. 06 – Základní koncepty DDD
  3. 07 – Návrh agregátu
  4. 10 – Implementace v Symfony 8
  5. 17 – Testování DDD

Doba čtení: zhruba 155 minut. Cíl: rozumět slovníku a vědět, co v code review znamená „agregát“ nebo „Bounded Context“.

Architekt na novém projektu

Stavíte nový projekt na zelené louce a chcete od začátku rozvrhnout strategický design: Bounded Contexty, topologii týmů a integrační vzory:

  1. 02 – Subdomény: Core, Supporting, Generic
  2. 03 – Bounded Context a Context Mapping
  3. 04 – Event Storming a Domain Storytelling
  4. 05 – Conway's Law a Team Topologies
  5. 09 – Architektonické styly
  6. 19 – DDD a microservices

Doba čtení: zhruba 251 minut. Cíl: mít ucelený obraz pro review architektury a roadmapu.

Migrace existujícího projektu v Symfony

Máte produkční CRUD aplikaci v Symfony a chcete ji postupně převést na DDD bez přepisu naráz:

  1. 01 – Co je Domain-Driven Design
  2. 04 – Event Storming a Domain Storytelling (objevení implicitní domény)
  3. 06 – Základní koncepty DDD
  4. 07 – Návrh agregátu
  5. 18 – Migrace z CRUD na DDD (včetně refaktoringové kuchařky)
  6. 21 – Anti-vzory a typické chyby

Doba čtení: zhruba 182 minut a pak týdny refaktoringu. Cíl: mít konkrétní plán prvních pěti pull requestů migrace.

Tech lead před releasem

Před produkčním releasem chcete mít jistotu, že infrastrukturní vzory (CQRS, Event Sourcing, ságy, Outbox) jsou správně postavené a otestované:

  1. 12 – CQRS
  2. 13 – Event Sourcing
  3. 14 – Ságy a Process Managery
  4. 15 – Outbox Pattern
  5. 17 – Testování DDD

Doba čtení: zhruba 214 minut. Cíl: mít checklist pro review před releasem.

cs.05 Externí zdroje, které stojí za přečtení

Pět knih a tři přednášky pro každého, kdo chce DDD používat vážně. Úplnou bibliografii (články, repozitáře, kurzy, komunity, oficiální dokumentace) najdete na samostatné stránce Zdroje a další četba.

Pět knih

Autor Titul Proč číst
Eric Evans (2003) Domain-Driven Design: Tackling Complexity in the Heart of Software Zakladatelská kniha. Slovník celého oboru.
Vaughn Vernon (2013) Implementing Domain-Driven Design Praktické pokračování Evanse: implementační vzory a CQRS.
Vaughn Vernon (2016) Domain-Driven Design Distilled Stručný výtah pro ty, kdo váhají investovat čas do celé Implementing DDD.
Vlad Khononov (2021) Learning Domain-Driven Design Pohled s odstupem 18 let od Evanse. Víc prostoru dostává strategický design a rozhodnutí, kde se DDD vyplatí.
Greg Young (2010) CQRS Documents (PDF zdarma) Původní texty autora, který CQRS popsal. Hutné a přesné.

Tři přednášky

  1. Eric Evans – Tackling Complexity in the Heart of Software (keynote DDD Europe, ~55 min). Kratší výklad myšlenek ze stejnojmenné knihy. Pokud nemáte čas na knihu, projděte aspoň přednášku.
  2. Greg Young – CQRS and Event Sourcing (Code on the Beach 2014, ~65 min). Young na praktických případech ukazuje, kdy má smysl oddělit commandy od queries a kdy jít až k úložišti založenému na událostech.
  3. Jimmy Bogard – Vertical Slice Architecture (NDC, ~60 min). Argument pro vertikální řezy místo horizontálních vrstev. Týká se organizace kódu uvnitř Bounded Contextu.

Konkrétní implementační příklady najdete v Praktických příkladech a v kapitole Implementace v Symfony 8. Podrobnější slovník pojmů nabízí Glosář.