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.
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:
- 01 – Co je Domain-Driven Design
- 06 – Základní koncepty DDD
- 07 – Návrh agregátu
- 10 – Implementace v Symfony 8
- 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:
- 02 – Subdomény: Core, Supporting, Generic
- 03 – Bounded Context a Context Mapping
- 04 – Event Storming a Domain Storytelling
- 05 – Conway's Law a Team Topologies
- 09 – Architektonické styly
- 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:
- 01 – Co je Domain-Driven Design
- 04 – Event Storming a Domain Storytelling (objevení implicitní domény)
- 06 – Základní koncepty DDD
- 07 – Návrh agregátu
- 18 – Migrace z CRUD na DDD (včetně refaktoringové kuchařky)
- 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é:
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
- 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.
- 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.
- 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ář.