Ga naar hoofdinhoud

Domain-driven design

Domain-driven design, afgekort DDD, is een ontwerpmethodiek waarin het businessdomein centraal staat. Het model van een systeem weerspiegelt rechtstreeks de begrippen en regels van het domein dat het ondersteunt. Eric Evans introduceerde de methodiek in 'the Blue Book'.

Domein​

Een domein is volgens Evans "een sfeer van kennis, invloed of activiteit". Die definitie veronderstelt een zekere mate van interne samenhang, maar kent – anders dan in de wiskunde – geen objectieve afbakeningscriteria. Ze sluit niet uit dat binnen één domein:

  • dezelfde concepten verschillend geïnterpreteerd worden,
  • regels en gedrag niet consistent zijn, en
  • bedrijfsprocessen niet op elkaar zijn afgestemd.

Binnen een domein bestaan daarom meestal meerdere subdomeinen of taakgebieden. Daarbij horen verantwoordelijkheden die zijn toegekend aan specifieke teams, afdelingen of bedrijfseenheden, met een eigen taal, eigen processen en eigen regels.

Model en ubiquitous language​

Eén van de kernprincipes van DDD is het gebruik van een ubiquitous language: een gemeenschappelijke taal die zowel ontwikkelaars als domeinexperts gebruiken, in gesprekken, in ontwerpen én in de code. In die taal is het model beschreven: een systeem van abstracties dat beschrijft hoe men vanuit een taakgebied naar de wereld kijkt en reageert op veranderingen in de buitenwereld.

Bounded context​

Een taakgebied dat in een gemeenschappelijke taal ondubbelzinnig en samenhangend is gemodelleerd, heet in DDD een bounded context. Evans beschrijft het belang daarvan als volgt:

"A bounded context delimits the applicability of a particular model so that team members have a clear and shared understanding of what has to be consistent and how it relates to other contexts. Within that context, work to keep the model logically unified, but do not worry about applicability outside those bounds. In other contexts, other models apply, with differences in terminology, in concepts and rules, and in dialects of the ubiquitous language. By drawing an explicit boundary, you can keep the model pure, and therefore potent, where it is applicable. At the same time, you avoid confusion when shifting your attention to other contexts. Integration across the boundaries necessarily will involve some translation, which you can analyze explicitly."

De ambiguïteiten die op domeinniveau nog voorkomen, verdwijnen binnen een bounded context (idealiter). Daar geldt zoveel mogelijk dat:

  • dezelfde concepten eenduidig geïnterpreteerd worden (op basis van de gemeenschappelijke taal),
  • regels en gedrag consistent zijn, en
  • bedrijfsprocessen op elkaar aansluiten.

Vertalen tussen contexten​

Bounded contexten bestaan zelden in isolatie. Waar ze met elkaar samenwerken, is volgens Evans vertaling nodig, en die moet je expliciet maken. DDD beschrijft daarvoor een aantal patronen voor de relatie tussen contexten. Een bekend voorbeeld is de anticorruption layer: een vertaallaag die voorkomt dat het model van een andere context het eigen model binnendringt.

DDD, CQRS en event sourcing​

In DDD draait alles om een model dat de zakelijke regels en begrippen van het domein weerspiegelt. CQRS past daar goed bij, omdat binnen een complex domein meestal verschillende modellen bestaan voor lees- en schrijfbewerkingen. Het commandomodel kan zich richten op de bedrijfslogica voor het wijzigen van de toestand, terwijl het querymodel is geoptimaliseerd voor het ophalen van gegevens.

Event sourcing is geen vereiste voor DDD of CQRS, maar sluit er wel goed op aan. In DDD worden events vaak gebruikt om veranderingen binnen een bounded context te modelleren. Event sourcing gaat een stap verder door die events als bron van waarheid te beschouwen.

DDD biedt dus het conceptuele kader, de methodiek en de terminologie; CQRS en event sourcing zijn architectuurpatronen die de uitwerking ondersteunen.

Betekenis voor de handreiking

De handreiking neemt de nadruk op het domein over. Een register werkt binnen één bounded context en legt vast in de taal daarvan. Wat van buiten komt, wordt met een vertaalregel expliciet omgezet naar een commando in die taal – een toepassing van de anticorruption layer, uitgewerkt in de Bounded Context Bridge. Ook de scheiding tussen gevolgenjournaal en projecties is geïnspireerd door CQRS en event sourcing.

Referenties​