Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Domain-Driven Design

Domain-Driven Design

Avatar for Kim Van Renterghem

Kim Van Renterghem

September 17, 2025
Tweet

More Decks by Kim Van Renterghem

Other Decks in Education

Transcript

  1. Kim Van Renterghem be more effective not effective // Increase

    Communication // Write code as text [email protected] https://kimvanrenterghemnew.github.io/Pages/
  2. Domain-Driven Design a software development approach that prioritizes understanding the

    complex business domain to model software that accurately reflects it. It emphasizes collaboration between developers and domain experts to create a Ubiquitous Language. Meet us
  3. Kernconcepten Write code as text Gebruik dezelfde taal in de

    code als de business Ubiquitous Language Ondubbelzinnige taal: één begrip = één term, gedeeld door business en IT. Bounded Contexts Onafhankelijke gebieden binnen een groot systeem, elk met eigen model en taal. Vaak in lijn met microservices. (Root) Aggregates Kern-domeinconcepten die consistentie binnen een aggregate garanderen. Value Types Specifieke, onveranderlijke types (bijv. Jaar, Datum, Identiteit). Commands , Queries, Events CRUD: Create, Read, Update, Delete – aanpassingen en leesopdrachten in het domein.
  4. Gezamenlijke taal Evolutie Consistentie 01 Gebruiken dezelfde termen. 02 Zowel

    in documenten als code 03 De taal groeit mee met het domein Ubiquitous Language Glossary 04 Hou een woordenboek bij
  5. 1 begrip 1 woord Vaakheb je voor 1 begrip meerdere

    woorden en soms zelfs afhankelijk van de wie het uit spreekt. Een andere betekenis. Meet us
  6. Event Storming • Samen met domeinexperts en developers • Begin

    met domein-events (wat gebeurt er in het businessproces?) • Voeg daarna commands, aggregates en policies toe • Doel: inzicht in processen en grenzen (Bounded Contexts)
  7. 03 Value Types • Gebruik specifieke types i.p.v. primitieve types

    (int, string, bool) • Voorbeelden: Jaar, Datum, Identiteit • Eigenschappen: onveranderlijk (immutable), altijd geldig
  8. Int Id Gebruik geen primitieve types (int, string, bool) voor

    belangrijke domeinconcepten. Gebruik Specifieke types zoals CustomerId, OrderId. Meet us
  9. Immutable Na creatie verandert de toestand van een Value Object

    niet. Dit verhoogt betrouwbaarheid en voorspelbaarheid. Meet us
  10. Altijd Correct • Validatie gebeurt bij creatie van het object.

    • Daarna is het object altijd geldig. • Geen losse checks in de code (bijv. if(jaar > 1900)). Meet us
  11. Specifiek • Domeinregels en transformaties kunnen in het object zelf

    worden verwerkt. • Dit voorkomt verspreide logica in de code. Meet us
  12. Afbakening Consistentie Integratie Bounded Contexts Een Bounded Context is een

    duidelijk afgebakend gebied binnen het domein met eigen regels en taal. Binnen een Bounded Context zijn begrippen en modellen eenduidig en consistent. De grenzen tussen Bounded Contexts zijn expliciet en bepalen hoe verschillende delen van het systeem met elkaar communiceren.
  13. Bounded Contexts Je kunt Bounded Contexts ontdekken via technieken als

    event storming, waarbij je samen met domeinexperts de grenzen en interacties in kaart brengt. - Voorbeeld: In een webshop zijn “Bestelling” en “Voorraad” vaak aparte Bounded Contexts, elk met hun eigen regels en modellen.
  14. Aggregate (root) the single, primary entity within an Aggregate in

    Domain- Driven Design (DDD) that acts as the sole entry point for all data modifications, interactions, and data changes within that logical boundary Meet us
  15. Aggregate (root) De aggregate root is het centrale toegangspunt voor

    alle wijzigingen binnen een aggregate in DDD. Alle commands gaan via deze root. Meet us Garandeert consistentie binnen een bounded context
  16. Werkt het makkelijkst met events. Start vanuit huidige status Na

    succesvolle opslag wordt de nieuwe state actief Pas wijzigingen toe via commands How do we do it? Events Unit of work Create Status change
  17. Best practice Het is een best practice om bij elke

    command die een wijziging aanbrengt, een domein event te creëren. Dit event beschrijft wát er is gebeurd in het domein. Meet us
  18. Validatie Maak Event Verander Wat is een command? Controleer of

    actie kan worden uitgevoerd (bijv. stock > 0) Maak een even en hou deze bij als Transactie. (bijv. StockRemoved(-2, "stilo")) Pas status van aggregate aan
  19. Events • Koppel events aan de Aggregate Root • Sla

    ze op of publiceer bij opslag van de aggregate • Zorgt voor transparante en consistente geschiedenis Meet us
  20. Klassieke Architectuur? Domein Bestaat uit Services & DTO’s Controllers sturen

    alles aan DAL Data via DAL (CRUD naar database) Controllers
  21. Hexagon Domein 3 2 0 1 Application FrameWorks / Integrators

    Aggregate & Value Objects domein logica, consistency rules Command, Query, Event Handlers Controllers, Repositories, Integraties Domein Adapters Application Adapters
  22. Query- Command- Event- Application - Handlers? Deze spreken rechtstreeks tegen

    de repo- eventueel worden hier validaties en rechten afgeandeld • Get/Create Aggregate • Run Command • Foutafhandeling • Store data Hier worden vooral projecties gedaan. Of policies (act on external event)
  23. Repository • Gebruik uitsluitend Aggregates als input en output. •

    Plaats interfaces waar je ze gebruikt. • Publiceer domein-events na opslag Meet us
  24. Interfaces • Beschrijf de rol, niet de implementatie • Geen

    'I' prefix (geen ICustomerRepository) • Voorbeeld: Interface: Drinks Implementatie: MongoDbDrinksRepo Meet us
  25. Werk nauw samen met business Start met een workshop Event

    Storming Begin klein. Met kleine projecten Bouw een eerste bounded context Hoe begin je met DDD? Betrek business Workshops Event Storming Bounded context
  26. Samenvatting • Focus op het domein • Ubiquitous Language •

    Bounded Contexts • Aggregates & Value Objects • Samenwerking met domeinexperts
  27. veelgemaakte fouten: tips • Te veel technische focus, te weinig

    business • Geen duidelijke grenzen tussen contexten • Over-engineering bij kleine projecten • Niet iteratif blijven verbeteren Valkuilen & Tips • Begin klein, evolueer iteratief • Werk nauw samen met business • Blijf verbeteren
  28. Slidesgo Flaticon Freepik CREDITS: This presentation template was created by

    Slidesgo, including icons by Flaticon, and infographics & images by Freepik questions? [email protected] https://speakerdeck.com/kimvanrenterghem/domain-driven-design Thanks! Please keep this slide for attribution