DDD im Frontend: wann Domain-Driven Design sinnvoll ist | POLPROG Zum Inhalt springen

DDD im Frontend: wann Domain-Driven Design sinnvoll ist

Domain-Driven Design ist weder eine Ordnerkonvention noch ein Ansatz nur für Backends. Ziel ist es, komplexe Geschäftsdomänen mit gemeinsamer Sprache, expliziten Modellen und klaren Kontextgrenzen beherrschbar zu machen. Im Frontend kann DDD in großen Produktanwendungen sehr wertvoll sein, aber ebenso leicht unnötige Architekturkosten erzeugen. Entscheidend ist, ob der Client tatsächlich Domänenkomplexität enthält oder hauptsächlich Präsentation übernimmt.

Veröffentlicht Verfasst von Lesezeit 9 Min. Lesezeit

Domain-Driven Design ist weder eine Ordnerkonvention noch ein Ansatz nur für Backends. Ziel ist es, komplexe Geschäftsdomänen mit gemeinsamer Sprache, expliziten Modellen und klaren Kontextgrenzen beherrschbar zu machen. Im Frontend kann DDD in großen Produktanwendungen sehr wertvoll sein, aber ebenso leicht unnötige Architekturkosten erzeugen. Entscheidend ist, ob der Client tatsächlich Domänenkomplexität enthält oder hauptsächlich Präsentation übernimmt.

Auf dieser Seite
  1. 1DDD beginnt nicht mit einem `domain`-Ordner
  2. 2Strategisches und taktisches DDD arbeiten auf unterschiedlichen Ebenen
  3. 3Ein Bounded Context ist keine technische Schicht
  4. 4Wann DDD im Frontend sinnvoll ist
  5. 5Wann DDD zu Overengineering wird
  6. 6Ubiquitous Language sollte auch im UI-Code sichtbar sein
  7. 7Große Frontends nach Domänen statt nur nach Dateitypen organisieren
  8. 8Präsentationsverhalten von Domänenverhalten trennen
  9. 9Praktische Schichten innerhalb eines Frontend-Kontexts
  10. 10API-Modell und Frontend-Domain-Modell müssen nicht identisch sein
  11. 11Entities, Value Objects und Aggregates selektiv einsetzen
  12. 12UI-State ist nicht dasselbe wie Domain-State
  13. 13Grenzen müssen durchgesetzt und nicht nur dokumentiert werden
  14. 14Frontend und Backend können eine Domäne teilen, ohne dass ihre Modelle identisch sind
  15. 15Testbarkeit ist ein starkes Argument für isolierte Domänenlogik
  16. 16DDD ohne Big Rewrite in ein bestehendes Frontend einführen

DDD beginnt nicht mit einem `domain`-Ordner

Eric Evans beschreibt DDD als Sammlung von Mustern und Definitionen für die Arbeit mit Domänenmodellen. Martin Fowler betont die Modellierung komplexer Domänen und eine gemeinsame Sprache zwischen Entwicklern und Domänenexperten. [1][2][4]

Eine Struktur wie `domain/application/infrastructure` macht eine Anwendung daher noch nicht zu DDD. Auch perfekt benannte Ordner können nur DTOs und prozedurale Logik enthalten. Strategisches DDD ist zudem ohne kanonische Schichtenstruktur möglich.

Strategisches und taktisches DDD arbeiten auf unterschiedlichen Ebenen

Strategisches DDD zerlegt größere Domänen in Subdomains und Bounded Contexts und beschreibt deren Beziehungen. Microsoft ordnet Domain Analysis genau diesem Schritt zu, während Fowler Bounded Context als zentrales strategisches Muster bezeichnet. [3][7]

Taktisches DDD arbeitet innerhalb eines konkreten Kontexts und umfasst unter anderem Entities, Value Objects, Aggregates und Domain Services. Microsoft trennt strategische Analyse ausdrücklich von taktischer Modellierung. [8]

Im Frontend ist es oft sinnvoll, mit strategischem Design zu beginnen und erst danach zu entscheiden, ob ein Kontext ein reichhaltiges taktisches Modell braucht.

Ein Bounded Context ist keine technische Schicht

Fowler beschreibt einen Bounded Context als Grenze, innerhalb derer ein Modell konsistent bleibt und Begriffe eindeutig sind. Dasselbe Konzept, etwa `Customer` oder `Product`, kann in verschiedenen Kontexten unterschiedliche Bedeutungen haben. [3]

Für Frontend-Architektur folgt daraus: `frontend`, `backend`, `React app`, `route` oder `micro-frontend` sind nicht automatisch Bounded Contexts. Kontextgrenzen entstehen aus Domänenmodell und Sprache, nicht aus Technologie. Frontend-DDD-Praktiker weisen auf dieselbe Gefahr hin. [15][16]

Wann DDD im Frontend sinnvoll ist

SignalRichtungWarum
Viele wechselnde GeschäftsregelnDDDEin Domain-Modell verhindert verstreute Regelimplementierung
Dieselben Begriffe bedeuten in Produktbereichen UnterschiedlichesDDDBounded Contexts erlauben mehrere konsistente Modelle
Mehrere Teams und Domänenexperten arbeiten zusammenDDDUbiquitous Language reduziert Mehrdeutigkeit
Einfaches CRUD und FormulareEinfachere ModularitätDer Aufwand taktischen DDD kann den Nutzen übersteigen
Frontend spiegelt hauptsächlich ein APIEinfachere ModularitätWenig eigene Domänenlogik zu modellieren
Kleine Anwendung mit einer konsistenten DomäneEinfachere ModularitätZusätzliche Grenzen und Schichten bringen eventuell wenig Wert

Das stärkste Signal sind komplexe und häufig wechselnde Geschäftsregeln auf Client-Seite: Konfiguratoren, mehrstufige Prozesse, Pricing, Berechtigungen, Zustandsübergänge, Workflows oder unterschiedliche Modelle derselben Begriffe in verschiedenen Produktbereichen.

DDD ist auch wertvoll, wenn mehrere Teams an einem großen Produkt arbeiten und dieselben Wörter in verschiedenen Bereichen etwas anderes bedeuten. Bounded Contexts wurden genau für mehrere kohärente Modelle und Teams entwickelt. [3]

DDD Crew empfiehlt, zuerst die Domäne zu verstehen, strategisch wichtige Subdomains zu identifizieren, danach Verantwortlichkeiten von Bounded Contexts zu definieren und erst anschließend das Modell zu codieren. [10]

Wann DDD zu Overengineering wird

Wenn das Frontend hauptsächlich Daten lädt, rendert, Formulare bearbeitet und einfache CRUD-Kommandos sendet, ohne nennenswerte Geschäftslogik im Client, löst vollständiges taktisches DDD meist kein echtes Problem.

Microsoft weist ausdrücklich darauf hin, dass für einen einfachen CRUD-Kontext ein anämisches Datenmodell ausreichen kann und komplexere DDD-Muster den Aufwand nicht immer rechtfertigen. Ein reichhaltigeres Modell lohnt sich eher bei vielen wechselnden Geschäftsregeln. [9]

Dasselbe Prinzip gilt im Frontend: Die Architektur sollte zur Domänenkomplexität passen und nicht zur technischen Ambition des Teams.

Ubiquitous Language sollte auch im UI-Code sichtbar sein

Ubiquitous Language ist eine gemeinsame, präzise Sprache von Entwicklern und Domänenexperten auf Basis des Modells. Fowler betont, dass sie mit wachsendem Domänenverständnis weiterentwickelt werden soll. [4]

Im Frontend sollten Namen von Use Cases, Aktionen, Typen, Modulen, Screens und Zuständen daher Geschäftsvokabular verwenden, sobald sie Domänenverhalten ausdrücken.

Wenn das Fachgebiet `approveApplication` sagt, der Code aber überall `setFlag2` oder `handleData` verwendet, verliert der Code seine Funktion als ausführbare Darstellung der Domänensprache.

Große Frontends nach Domänen statt nur nach Dateitypen organisieren

Fowler erklärt, dass `view/model/data` als oberste Struktur bei kleineren Systemen funktionieren kann. Mit wachsender Anwendung sollten Top-Level-Module jedoch häufig domänenorientiert werden und ihre eigenen internen Schichten enthalten. [5]

Die aktuelle Nx-Dokumentation zeigt eine ähnliche Richtung: Ordner können Domain-Ownership-Grenzen bilden, während Libraries innerhalb einer Domäne als `feature`, `ui`, `data-access` und `util` klassifiziert werden. [12]

Eine praktische Struktur kann daher `libs/orders/...`, `libs/billing/...` und `libs/identity/...` verwenden statt eines globalen Baums aus `components/`, `services/` und `models/`.

Präsentationsverhalten von Domänenverhalten trennen

Fowler beschreibt die Trennung von Präsentation, Domänenlogik und Datenzugriff als wirksame Modularisierung. UI-Code ist oft schwerer zu testen, weshalb Domänenlogik außerhalb der Präsentation Vorteile bringt. [5][6]

Eine Frontend-Komponente sollte primär rendern, UI-Ereignisse behandeln und Operationen delegieren. Regeln wie Stornierbarkeit einer Bestellung, Rabattberechnung oder gültige Zustandsübergänge sollten einen expliziten Ort außerhalb von JSX, Templates oder Komponentenklassen haben.

Präsentationslogik bleibt natürlich erlaubt. View-Validierung, Sichtbarkeit, lokaler Fokus oder Animation sind etwas anderes als Geschäftsregeln.

Praktische Schichten innerhalb eines Frontend-Kontexts

SchichtVerantwortungBeispiele
presentation / uiRendering und UI-Verhaltencomponents, routes, view state
applicationKoordination von Use Casescommands, use cases, orchestration
domainDomänenregeln, Begriffe und Invariantenentities, value objects, policies
infrastructure / data-accessTechnische IntegrationenHTTP, storage, SDKs, mappers

DDD schreibt keine bestimmte Ordnerstruktur vor. Die Trennung in `presentation`, `application`, `domain` und `infrastructure` ist eine praktische Interpretation der Verantwortungsseparation, keine formale Vorgabe von Evans. [1][5]

Die Domain-Schicht kann frameworkunabhängige Regeln, Begriffe und Verhalten enthalten; application koordiniert Use Cases; infrastructure adaptiert HTTP, Storage und externe SDKs; presentation enthält Komponenten, Routing und reinen UI-State.

API-Modell und Frontend-Domain-Modell müssen nicht identisch sein

Ein Bounded Context kann ein eigenes Modell eines Begriffs besitzen, und verschiedene Kontexte können zwischen Repräsentationen abbilden. Fowler nennt `Customer` und `Product` als typische Beispiele für Begriffe mit kontextabhängiger Bedeutung. [3]

Ein Backend-DTO muss deshalb nicht direkt bis in jede Komponente reichen. Mapper oder Adapter können den Transportvertrag in das Modell des jeweiligen Frontend-Kontexts überführen.

Diese Grenze ist besonders wertvoll bei gemeinsam genutzten, historischen oder unabhängig evolvierenden APIs. Für einen trivialen CRUD-Endpunkt kann eine zusätzliche Mapping-Schicht überflüssig sein.

Entities, Value Objects und Aggregates selektiv einsetzen

DDD unterscheidet unter anderem Entities, Value Objects, Services und Aggregates. Fowler nennt sie als Teil des Evans-Vokabulars, Microsoft beschreibt Aggregate als taktisches Muster zur Wahrung der Modellkonsistenz. [2][8]

Ein Frontend sollte das Backend-Modell nicht 1:1 kopieren, nur um dieselben Klassen zu besitzen. Ein Value Object ist sinnvoll für `Money`, `DateRange` oder `Email`, wenn es echte Invarianten schützt. Ein Aggregate ist sinnvoll, wenn der Client tatsächlich Konsistenzregeln eines Modells gewährleisten muss.

Ist ein Typ nur Datenstruktur für eine Tabelle, ist ein einfacher TypeScript-Typ oft besser als Entity, Factory, Repository und Service Layer.

UI-State ist nicht dasselbe wie Domain-State

React behandelt State-Organisation als Designproblem und empfiehlt, redundanten oder duplizierten State zu vermeiden. Das ist nützliche technische Anleitung, aber Reducer, Stores oder Signals erzeugen noch kein Domain-Modell. [14]

State wie `isModalOpen`, aktiver Tab oder Scrollposition gehört zur Präsentation. Ein Bestell-Lebenszyklus, erlaubte Prozessübergänge oder Konfigurationsregeln können dagegen Teil des Domain-Modells sein.

Die Trennung verhindert globale Stores, die Serverdaten, Geschäftsverhalten und UI-Details unstrukturiert vermischen.

Grenzen müssen durchgesetzt und nicht nur dokumentiert werden

Nx erlaubt Project Tags und deklarative Dependency Constraints, etwa um Imports zwischen Scopes oder Library-Typen zu blockieren. `@nx/enforce-module-boundaries` kann Imports während des Lintings prüfen. [11]

Nx unterstützt mehrere Tag-Dimensionen, sodass `scope`, Library-Typ, Stabilität oder Client/Server-Aspekte getrennt modelliert werden können. [13]

Für DDD im Frontend können Architekturentscheidungen damit zu CI-Regeln werden: `billing` importiert keine `identity`-Interna, `ui` hängt nicht von `data-access` ab und `domain` bleibt frameworkunabhängig.

Frontend und Backend können eine Domäne teilen, ohne dass ihre Modelle identisch sind

Ein Bounded Context begrenzt Modell und Sprache und sollte daher nicht automatisch entlang der Netzwerkgrenze zwischen Browser und Server gezogen werden. Praktische Frontend-DDD-Quellen betonen, dass Kontexte technische Schichten übergreifen und gemeinsam von Frontend und Backend umgesetzt werden können. [15][16]

Die Client-Repräsentation darf sich trotzdem von der Server-Repräsentation unterscheiden, weil Interaktion, lokaler State und Präsentation andere Anforderungen stellen. Wichtig sind erhaltene Semantik und explizites Mapping statt Klassenduplikation.

Auch ein Micro-Frontend sollte nicht allein deshalb entstehen, weil ein Bounded Context existiert. Domain-Grenze und Deployable-Grenze sind verschiedene Entscheidungen.

Testbarkeit ist ein starkes Argument für isolierte Domänenlogik

Fowler nennt Testbarkeit als Vorteil der Trennung von Präsentation und Domäne. Logik außerhalb der UI kann ohne Rendering von Komponenten und ohne Abhängigkeit von Oberflächendetails getestet werden. [5][6]

Im Frontend ermöglicht das schnelle Tests von Regeln, Value Objects, Use Cases und Zustandsübergängen als normales TypeScript oder JavaScript. Komponententests bleiben wichtig, müssen aber nicht der einzige Ort für Geschäftsregeln sein.

Ein Warnsignal ist, wenn jede Änderung einer Geschäftsregel das Mounten einer kompletten Komponente und Mocks für Router, Store, HTTP und Browser-APIs erfordert.

DDD ohne Big Rewrite in ein bestehendes Frontend einführen

DDD Crew empfiehlt einen iterativen Prozess: Domäne verstehen, wichtige Subdomains erkennen, Verantwortlichkeiten von Bounded Contexts definieren und anschließend das Modell codieren. [10]

In einem bestehenden Frontend ist es sicherer, einen problematischen Geschäftsbereich auszuwählen, dessen Sprache und Grenze festzulegen, Präsentation von Regeln zu trennen, eine öffentliche Modul-API zu definieren und erst danach weitere Features zu migrieren.

Nicht die gesamte Anwendung muss umgebaut werden. DDD kann dort eingesetzt werden, wo Geschäfts­komplexität den Modellierungsaufwand rechtfertigt, während einfache Bereiche schlanke Feature Modules bleiben.

  • Mit einem Geschäftsproblem beginnen, nicht mit Ordnern.
  • Begriffe, Regeln und mehrdeutige Konzepte identifizieren.
  • Einen Bounded Context und seinen öffentlichen Vertrag definieren.
  • Domänenregeln von Komponenten und Transport-DTOs trennen.
  • Nur taktische Muster hinzufügen, die konkrete Komplexität lösen.
  • Grenzen als Lint- oder CI-Regeln festhalten.
  • Abhängigkeiten, Zyklen, Regressionen und Kosten projektübergreifender Änderungen messen.
  • Einfache CRUD-Bereiche nicht nur für architektonische Symmetrie migrieren.

DDD im Frontend ist sinnvoll, wenn der Client Teil eines komplexen Produkts und nicht nur Datenrenderer ist. Den größten Nutzen bringt meist strategisches DDD: gemeinsame Sprache, Kontextgrenzen und durchsetzbare Modulgrenzen. Taktische Muster sollten nur dort ergänzt werden, wo echte Regeln, Invarianten und Verhalten ein reichhaltigeres Modell rechtfertigen. Bei überwiegend CRUD, Formularen und einfachem API-Rendering sind gute Modularität und klare Präsentations-Daten-Trennung meist wertvoller als vollständiges DDD.

DDD Domain-Driven Design Frontend Architecture Software Architecture Bounded Context Ubiquitous Language TypeScript Nx React Angular

Häufig gestellte Fragen

Ist DDD im Frontend sinnvoll?

Ja, wenn das Frontend an einer komplexen Domäne beteiligt ist und von expliziten Grenzen, gemeinsamer Sprache oder Client-seitigen Geschäftsregeln profitiert. DDD ist nicht Backend-only. [1][2][15]

Sollte jedes Frontend DDD verwenden?

Nein. Bei einfachen CRUD-Anwendungen kann vollständiges taktisches DDD unnötig sein. Microsoft weist ausdrücklich darauf hin, dass einfache CRUD-Kontexte nicht immer ein reichhaltiges Modell rechtfertigen. [9]

Ist das Frontend ein eigener Bounded Context?

Nicht automatisch. Ein Bounded Context begrenzt ein konsistentes Modell und seine Sprache, nicht eine Technologie. [3][16]

Soll jeder Bounded Context ein Micro-Frontend werden?

Nein. Eine Domain-Grenze erfordert kein separates Deployment. Micro-Frontend-Architektur ist eine zusätzliche Entscheidung. [3][15]

Brauche ich einen domain-Ordner?

Nein. DDD schreibt keine Verzeichnisstruktur vor. Ein Ordner kann helfen, erzeugt aber allein kein Domain-Modell. [1][5]

Wo gehört Geschäftslogik im Frontend hin?

Außerhalb reiner Präsentation, in ein explizites Modell oder eine Use-Case-Schicht des Kontexts. Fowler empfiehlt die Trennung von Präsentation und Domänenlogik. [5][6]

Kann ein API-DTO das Domain-Modell sein?

In einem trivialen Fall ja, aber es muss nicht so sein. Verschiedene Kontexte können dasselbe Konzept unterschiedlich modellieren, daher ist Mapping oft sinnvoll. [3]

Ist das Repository-Muster im Frontend sinnvoll?

Nur wenn es ein echtes Abstraktionsproblem beim Modellzugriff löst. Für einfaches Fetching kann ein zusätzliches Repository unnötig sein. DDD verlangt nicht jedes Muster überall. [1][9]

Sind Redux, NgRx, Zustand oder Signals Teil von DDD?

Nein. Das sind State-Management-Mechanismen. Sie können Domain-State speichern, definieren aber weder Modell noch Sprache oder Bounded Context. [14]

Soll das Frontend-Domain-Modell identisch mit dem Backend sein?

Nein. Die Domänensemantik sollte stimmen, die Repräsentation darf an Client-Bedürfnisse angepasst sein. [3]

Wie erzwingt man Domain-Grenzen im Monorepo?

Nx kann mit Tags und @nx/enforce-module-boundaries unerlaubte Abhängigkeiten automatisch blockieren. [11][13]

Wo beginnt man mit DDD in einer bestehenden Anwendung?

Bei einem komplexen Geschäftsbereich: Sprache, Regeln und Kontextgrenze verstehen. DDD Crew empfiehlt einen iterativen Weg von der Domäne zu Kontexten und Code. [10]

Quellen und Referenzen

  1. Eric Evans, DDD Reference12345
  2. Martin Fowler, Domain Driven Design123
  3. Martin Fowler, Bounded Context12345678
  4. Martin Fowler, Ubiquitous Language12
  5. Martin Fowler, Presentation Domain Data Layering123456
  6. Martin Fowler, Presentation Domain Separation123
  7. Microsoft Azure Architecture Center, Use Domain Analysis to Model Microservices
  8. Microsoft Azure Architecture Center, Use Tactical DDD to Design Microservices12
  9. Microsoft .NET, Design a microservice domain model123
  10. DDD Crew, DDD Starter Modelling Process123
  11. Nx, Enforce Module Boundaries12
  12. Nx, Monorepo Folder Structure
  13. Nx, Tag in Multiple Dimensions12
  14. React, Managing State12
  15. ANGULARarchitects, DDD in Angular & Frontend Architecture1234
  16. Tomasz Ducin, Your Frontend itself is NOT a Bounded Context123

War das hilfreich?

Neue Artikel per E-Mail erhalten

Eine kurze E-Mail pro neuem Wissens-Artikel. Kein Spam, Abmeldung mit einem Klick.

Wir nutzen Ihre E-Mail nur, um neue Artikel zu versenden. Keine Weitergabe an Dritte.

Zurück zu Wissen