Home » Begrippen » Wat is Domain-driven design?

Wat is Domain-driven design?

Domain-driven design, afgekort DDD, is een benadering van softwareontwikkeling waarbij de bedrijfslogica en het domein van een organisatie centraal staan in de architectuur van de applicatie. In plaats van te beginnen met technische keuzes, start je bij DDD met een diep begrip van het probleemdomein: de termen, processen en regels die de organisatie dagelijks gebruikt. Een webshop heeft bijvoorbeeld een domein met concepten als “bestelling”, “klant”, “voorraad” en “verzending”, en DDD zorgt ervoor dat die concepten direct terugkomen in de code. De aanpak wordt toegepast bij complexe bedrijfssystemen in sectoren als financiën, logistiek en e-commerce. Door code en bedrijfslogica op elkaar af te stemmen, verlaag je de kans op misverstanden tussen ontwikkelaars en stakeholders en maak je software beter onderhoudbaar op de lange termijn.

De kernprincipes van Domain-driven design

DDD is gebouwd op een aantal fundamentele principes. Het belangrijkste is dat het domein — de activiteit en kennis van de organisatie — leidend is voor alle architectuurbeslissingen. Ontwikkelaars en domeinexperts werken nauw samen om te begrijpen hoe de organisatie echt werkt, niet hoe een buitenstaander denkt dat ze werkt.

Ubiquitous Language: één gedeelde taal

Een van de hoekstenen van DDD is de ubiquitous language (alomtegenwoordige taal): een gedeelde woordenschat die zowel door ontwikkelaars als door domeinexperts wordt gebruikt. Dezelfde termen die een accountant of logistiek manager gebruikt, komen letterlijk terug in de code — in klasse- en methodenamen, in databasetabellen en in documentatie. Dit elimineert de vertaallaag die anders constant misverstanden veroorzaakt tussen technische en niet-technische teamleden.

Bounded Context: grenzen bewaken

Een groot systeem kun je niet als één monoliet met één consistent model beschrijven. DDD introduceert het concept van de bounded context (begrensde context): een duidelijk afgebakend deel van het systeem met een eigen model en taal. Binnen de context “Verkoop” betekent “klant” iets anders dan binnen de context “Klantenservice”. Door die grenzen expliciet te maken, voorkom je dat een model te complex en te ambigu wordt.

Bounded contexts communiceren met elkaar via goed gedefinieerde interfaces, zoals events of API-aanroepen. Dit maakt het mogelijk om verschillende delen van een groot systeem onafhankelijk van elkaar te ontwikkelen en te schalen, wat aansluit op moderne microservices-architecturen.

Strategisch en tactisch ontwerp

DDD maakt onderscheid tussen twee niveaus van ontwerp. Het strategisch ontwerp gaat over de grote lijnen: welke bounded contexts bestaan er, hoe verhouden ze zich tot elkaar en welke relaties zijn er tussen teams? Hulpmiddelen hierbij zijn de context map, een visuele weergave van alle contexten en hun relaties, en patronen als Shared Kernel (gedeeld model) of Anti-Corruption Layer (vertaallaag die jouw model beschermt tegen een externe legacy-API).

Het tactisch ontwerp richt zich op de implementatiedetails binnen één bounded context. Hier introduceer je bouwblokken zoals entiteiten, value objects, aggregates en domeingebeurtenissen. Samen vormen deze bouwblokken een rijke domeinlaag die de bedrijfsregels nauwkeurig modelleert.

Entiteiten en Value Objects

Een entiteit is een object met een unieke identiteit die door de tijd heen behouden blijft, zoals een klant of een bestelling met een eigen ID. Een value object heeft geen eigen identiteit en wordt gedefinieerd door zijn waarden: een adres, een geldbedrag of een datumrange. Value objects zijn onveranderlijk — je past ze niet aan, maar vervangt ze door een nieuw exemplaar. Dit onderscheid helpt je om de juiste complexiteit op de juiste plek te leggen.

Aggregates: consistente eenheden

Een aggregate is een cluster van entiteiten en value objects die als één geheel worden behandeld voor datamutaties. Elke aggregate heeft een aggregate root: het enige object dat van buitenaf aangesproken mag worden. Alle wijzigingen gaan via de root, zodat de interne consistentie altijd gegarandeerd is. Een “Bestelling” met meerdere “Bestelregels” is een klassiek voorbeeld: je past bestelregels alleen aan via de Bestelling zelf.

Domain Events: communicatie tussen contexten

Domain events zijn berichten die aangeven dat er iets betekenisvols is gebeurd in het domein, zoals BestellingGeplaatst of BetalingOntvangen. Ze zijn vernoemd in de taal van het domein, niet in technische termen. Andere bounded contexts kunnen reageren op deze events zonder dat de verzender iets hoeft te weten over de ontvanger.

Dit patroon is de ruggengraat van event-driven architectuur en sluit perfect aan op messaging-systemen zoals RabbitMQ of Apache Kafka. Domain events maken het systeem losjes gekoppeld, beter testbaar en eenvoudiger uit te breiden zonder bestaande code te wijzigen.

Wanneer gebruik je DDD wel en niet?

DDD is bijzonder waardevol bij complexe domeinen met veel bedrijfsregels, meerdere teams en een lange levensduur van de applicatie. Financiële systemen, logistieke platforms en grote e-commerce-oplossingen zijn typische kandidaten. De aanpak vraagt echter investering: intensieve samenwerking met domeinexperts, doorlopende verfijning van het model en een team dat bereid is de principes consequent toe te passen.

Voor eenvoudige CRUD-applicaties — waarbij je simpelweg data opslaat en ophaalt zonder complexe bedrijfslogica — is DDD vaak te zwaar. In dat geval voegt de extra structuur meer overhead toe dan waarde. De kunst is om te herkennen wanneer de complexiteit van het domein de investering rechtvaardigt.

Conclusie

Domain-driven design is een krachtige benadering voor het bouwen van software die de complexiteit van een bedrijfsdomein eerlijk weerspiegelt in de architectuur. Door te werken met een gedeelde taal, duidelijke grenzen tussen contexten en rijke domeinmodellen, verminder je miscommunicatie en maak je systemen flexibeler en beter onderhoudbaar. DDD is geen technologie maar een manier van denken die het beste resultaat oplevert wanneer ontwikkelaars en domeinexperts echt samenwerken. De initiële investering in begrip en modellering betaalt zich terug in minder bugs, snellere uitbreidingen en software die aansluit op hoe de organisatie écht werkt. Ben je bezig met een complex systeem dat blijft groeien? Verken dan de wereld van DDD en ontdek hoe het jouw aanpak kan transformeren.

Veelgestelde vragen

  1. Is Domain-driven design hetzelfde als microservices?

    Nee, maar ze vullen elkaar goed aan. DDD is een ontwerpfilosofie die helpt om domeinen correct te modelleren; microservices is een architectuurstijl waarbij een systeem bestaat uit kleine, zelfstandige services. Bounded contexts uit DDD worden vaak gebruikt als leidraad voor het bepalen van de grenzen van microservices.

  2. Welke programmeertalen zijn geschikt voor DDD?

    DDD is taal-agnostisch en werkt met elke programmeertaal. In de praktijk wordt het het meest toegepast in object-georiënteerde talen zoals Java, C# en Python, omdat die goed aansluiten op de concepten van entiteiten, value objects en aggregates. Er zijn ook functionele DDD-implementaties in talen zoals F# en Haskell.

  3. Hoe begin je met DDD in een bestaand project?

    Begin met het in kaart brengen van het domein via Event Storming: een workshop waarbij je met post-its alle domeingebeurtenissen, commando’s en actoren in kaart brengt. Van daaruit identificeer je de bounded contexts en pas je de ubiquitous language toe. Je hoeft niet het hele systeem in één keer om te schrijven — je kunt DDD geleidelijk introduceren in de delen met de meeste complexiteit.

  4. Wat is het boek dat DDD heeft geïntroduceerd?

    Domain-driven design werd geïntroduceerd door Eric Evans in zijn boek Domain-Driven Design: Tackling Complexity in the Heart of Software uit 2003, ook wel het “Blue Book” genoemd. Een toegankelijkere introductie is Implementing Domain-Driven Design van Vaughn Vernon uit 2013, het “Red Book”.

  5. Hoe verhoudt DDD zich tot Clean Architecture?

    Clean Architecture (van Robert C. Martin) en DDD zijn complementair. Clean Architecture beschrijft hoe je lagen in een applicatie organiseert zodat de domeinlogica onafhankelijk is van frameworks en databases. DDD vult dit aan door inhoudelijk te beschrijven hoe je die domeinlaag modelleert met entiteiten, aggregates en domeingebeurtenissen.

Al onze begrippen

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0-9