Logo von nextlevels
Projekt anfragen
Zurück zum Wiki

Bounded Context

Zuletzt aktualisiert am

Kurz erklärt

Bounded Context ist ein zentrales Muster aus Domain-Driven Design (DDD): eine explizit gezogene Grenze, innerhalb derer ein bestimmtes Domänenmodell und seine Fachbegriffe eindeutig gelten. Außerhalb dieser Grenze darf dasselbe Wort etwas anderes bedeuten.

Das Muster hilft dir, große Systeme so zu schneiden, dass Teams, Code und Datenbanken nicht an widersprüchlichen Begriffen scheitern.

Was ist ein Bounded Context? Definition nach Eric Evans

Den Begriff hat Eric Evans in seinem Buch „Domain-Driven Design: Tackling Complexity in the Heart of Software“ geprägt, das im August 2003 bei Addison-Wesley erschien. In seiner späteren Kurzfassung, der DDD Reference von 2015, definiert Evans den Bounded Context als Beschreibung einer Grenze, typischerweise ein Subsystem oder der Arbeitsbereich eines bestimmten Teams, innerhalb derer ein bestimmtes Modell definiert und anwendbar ist.

Ausgangspunkt ist eine nüchterne Beobachtung: In jedem größeren Projekt existieren mehrere Modelle gleichzeitig. Verschiedene Anwendergruppen brauchen verschiedene Sichten, Teams lösen dasselbe Problem unabhängig voneinander, Werkzeuge unterscheiden sich. Werden Codeteile auf Basis unterschiedlicher Modelle unkontrolliert vermischt, wird Software laut Evans fehleranfällig, unzuverlässig und schwer verständlich.

Seine Antwort darauf lautet: Lege den Geltungsbereich eines Modells ausdrücklich fest. Die Grenze wird dabei auf drei Ebenen sichtbar gemacht:

  • Organisatorisch: Welches Team ist für das Modell zuständig?
  • Funktional: In welchen Teilen der Anwendung wird es verwendet?
  • Physisch: Welche Codebasis und welches Datenbankschema gehören dazu?

Innerhalb der Grenze sorgen kontinuierliche Integration und eine gemeinsame Sprache dafür, dass Begriffe konsistent bleiben. Was außerhalb passiert, soll das Team bewusst nicht ablenken. Martin Fowler fasst das in seinem Bliki-Eintrag „BoundedContext“ von 2014 so zusammen: Große Domänen werden in Kontexte mit jeweils in sich konsistentem Modell zerlegt, und die Beziehungen zwischen diesen Kontexten werden explizit beschrieben.

Wo verlaufen die Grenzen in deiner Software?

Von der Schnittstellen-Architektur bis zur Drittanbieter-Integration – maßgeschneiderte Software aus einer Hand.

Enterprise-Software-Leistungen ansehen

Bounded Context, Ubiquitous Language und Domänenmodell

Der Bounded Context ist eng mit zwei weiteren DDD-Grundbegriffen verbunden. Das Domänenmodell ist nach Evans ein System von Abstraktionen, das ausgewählte Aspekte einer Fachdomäne beschreibt und zur Lösung fachlicher Probleme dient. Ein Modell ist also nie ein vollständiges Abbild der Wirklichkeit, sondern eine bewusste Auswahl. Genau deshalb braucht es einen Rahmen, in dem diese Auswahl gilt.

Die Ubiquitous Language ist die gemeinsame Sprache, die Fachexperten und Entwickler innerhalb eines Bounded Context konsequent verwenden: im Gespräch, in Diagrammen, in Tickets und vor allem im Code. Klassen, Methoden und Module tragen die Namen, die auch die Fachabteilung benutzt. Ändert sich die Sprache, ändert sich das Modell.

Entscheidend ist der Zusatz „innerhalb“. Eine Ubiquitous Language ist nie unternehmensweit gültig. Sie gilt genau in einem Bounded Context. Der Kontext ist damit die Sprachgrenze, an der Begriffe ihre Bedeutung wechseln dürfen. Fowler nennt solche mehrdeutigen Wörter Polyseme und zeigt am Beispiel eines Energieversorgers, wie das Wort „Zähler“ je nach Abteilung einen Netzanschluss, eine Kundenbeziehung oder das physische Gerät bezeichnete.

Wie findest du die Grenzen eines Bounded Context?

Es gibt kein Rechenverfahren, das Kontextgrenzen automatisch liefert. In der Praxis haben sich drei Signale bewährt, die du kombinieren solltest. Wie das in einem konkreten Projekt abläuft, beschreibt der Beitrag Domain-Driven Design in der Praxis ausführlicher.

Sprachunterschiede als stärkstes Signal

Achte darauf, wo dasselbe Wort unterschiedliche Attribute, Regeln oder Lebenszyklen bekommt. Wenn die Buchhaltung beim „Kunden“ an Zahlungsbedingungen und Bonität denkt, der Support aber an Tickets und Ansprechpartner, liegt vermutlich eine Kontextgrenze dazwischen. Umgekehrt sind zwei verschiedene Wörter für dasselbe Konzept ein Hinweis, dass die Sprache innerhalb eines Kontexts noch nicht geklärt ist.

Event Storming als Workshop-Methode

Das von Alberto Brandolini entwickelte Event Storming ist ein Workshop-Format, in dem Fachleute und Entwickler fachliche Ereignisse auf einer langen Zeitachse sammeln, etwa „Angebot versendet“ oder „Maschine ausgeliefert“. Die offizielle EventStorming-Seite beschreibt es als flexibles Format zur gemeinsamen Erkundung komplexer Geschäftsdomänen. Wo sich Zuständigkeiten, Begriffe oder Taktung der Ereignisse ändern, zeichnen sich Kandidaten für Kontextgrenzen ab.

Teamgrenzen und Conway's Law

Melvin Conway formulierte 1968 im Magazin Datamation in seinem Aufsatz „How Do Committees Invent?“ die These, dass Organisationen Systeme entwerfen, deren Struktur ihre Kommunikationsstruktur kopiert. Für Bounded Contexts heißt das: Ein Kontext, den drei Teams gemeinsam verantworten, läuft Gefahr, in drei verschiedene Modelle zu zerfallen. Plane Kontexte deshalb so, dass jeder genau einem Team gehört. Ein Team darf durchaus mehrere Kontexte betreuen.

Context Mapping: Wie Bounded Contexts zusammenarbeiten

Ein einzelner Bounded Context löst nur die Hälfte des Problems. Systeme müssen Daten austauschen, und an jeder Verbindungsstelle droht ein Modell in das andere „auszulaufen“. Deshalb empfiehlt Evans eine Context Map: eine Übersicht, die jedes Modell im Projekt benennt, seinen Kontext abgrenzt und die Kontaktpunkte beschreibt, inklusive Übersetzungen, geteilter Teile und Machtverhältnisse.

Wichtig dabei ist ein Satz aus der DDD Reference: „Map the existing terrain.“ Die Context Map zeigt zuerst den Ist-Zustand, einschließlich unschöner Altlasten. Umbauten plant man erst danach. Viele Muster beschreiben dabei eine Upstream/Downstream-Beziehung: Das Upstream-Team beeinflusst mit seinen Entscheidungen den Erfolg des Downstream-Teams, aber nicht umgekehrt.

Beziehungsmuster der Context Map nach Eric Evans, DDD Reference (2015)
MusterBeziehungKernideeTypischer Einsatz
PartnershipWechselseitig abhängigZwei Teams planen und integrieren gemeinsam, weil beide nur zusammen erfolgreich sindZwei Kontexte, die nur gemeinsam einen Release-Wert haben
Shared KernelEng gekoppeltEin kleiner, explizit abgegrenzter Teil von Modell und Code wird geteilt und nur abgestimmt geändertGemeinsame Kernbegriffe zweier eng verwandter Teams
Customer/Supplier DevelopmentUpstream/DownstreamDie Bedürfnisse des Downstream-Teams fließen in die Planung des Upstream-Teams einInternes Plattformteam beliefert Fachteams
ConformistUpstream/DownstreamDas Downstream-Team übernimmt das Upstream-Modell unverändertUpstream hat keinen Anreiz zur Anpassung, Modell ist brauchbar
Anticorruption LayerUpstream/DownstreamEine isolierende Übersetzungsschicht schützt das eigene Modell vor dem fremdenAnbindung von Altsystemen oder schwachen Fremdmodellen
Open-host ServiceUpstream für vieleEin offenes Protokoll macht ein Subsystem für alle Konsumenten als Dienste zugänglichStark nachgefragter Kontext mit vielen Abnehmern
Published LanguageGemeinsames AustauschformatEine gut dokumentierte, geteilte Sprache dient als ÜbersetzungsmediumBranchenstandards für Datenaustausch, oft kombiniert mit Open-host Service
Separate WaysKeine VerbindungEin Kontext wird bewusst ohne jede Integration betriebenIntegration kostet mehr, als sie bringt

Die DDD Reference ergänzt außerdem den Big Ball of Mud als Muster für Bereiche ohne erkennbare Modellgrenzen. Partnership und Big Ball of Mud kennzeichnet Evans dort ausdrücklich als Begriffe, die erst nach dem ursprünglichen Buch hinzukamen. Für die Anbindung von Legacy-Software ist der Anticorruption Layer besonders relevant, weil er laut Evans kaum oder keine Änderungen am Altsystem erfordert.

Bounded Context vs. Subdomain vs. Microservice vs. Modul

Diese vier Begriffe werden oft vermischt, beschreiben aber verschiedene Dinge. Eine saubere Trennung hilft dir bei Architekturentscheidungen.

  • Subdomain gehört zum Problemraum: Sie ist ein fachlicher Teilbereich des Geschäfts, etwa Vertrieb, Fertigung oder Kundendienst. Evans unterscheidet die Core Domain, also das, was dein Unternehmen auszeichnet, von generischen Subdomänen. Vaughn Vernon ergänzt in „Implementing Domain-Driven Design“ (2013) unterstützende Subdomänen.
  • Bounded Context gehört zum Lösungsraum: Er ist die Grenze, in der ein konkretes Modell gilt. Idealerweise deckt ein Kontext genau eine Subdomain ab, in gewachsenen Systemen ist das selten der Fall.
  • Microservice ist eine Deployment-Einheit, also ein unabhängig auslieferbarer Prozess. Ein Bounded Context kann aus mehreren Microservices bestehen. Ein Microservice sollte aber nie mehrere Kontexte vermischen.
  • Modul ist eine Code-Struktur innerhalb einer Anwendung. In einem modularen Monolithen bildet jedes Modul einen Bounded Context ab, mit eigener Sprache, eigenem Datenzugriff und klarer Schnittstelle, aber gemeinsamem Deployment.

Der modulare Monolith ist für viele Mittelstandssysteme ein vernünftiger Startpunkt. Martin Fowler argumentiert in seinem Beitrag „MonolithFirst“ vom Juni 2015, dass stabile Service-Grenzen im Kern das Ziehen der richtigen Bounded Contexts bedeuten und dass selbst erfahrene Architekten diese Grenzen zu Beginn oft falsch setzen. In einem Monolithen lassen sich Fehlschnitte deutlich billiger korrigieren als zwischen verteilten Services.

Beispiel: „Auftrag“ bei einem fiktiven Maschinenbauer

Das folgende Szenario ist ein bewusst vereinfachtes, hypothetisches Beispiel. Ein mittelständischer Maschinenbauer fertigt Verpackungsanlagen und betreibt Vertrieb, Produktion und Service. Alle drei Abteilungen sprechen täglich vom „Auftrag“, meinen aber etwas anderes:

  • Vertrieb: Der Auftrag ist ein Kundenauftrag mit Konfiguration, Preis, Rabatt, Zahlungsbedingungen und zugesagtem Liefertermin. Sein Lebenszyklus endet mit der Auftragsbestätigung und später der Rechnung.
  • Produktion: Der Auftrag ist ein Fertigungsauftrag mit Stückliste, Arbeitsplan, Losgröße und Maschinenbelegung. Preise spielen hier keine Rolle. Aus einem Kundenauftrag können mehrere Fertigungsaufträge entstehen.
  • Service: Der Auftrag ist ein Serviceauftrag zu einer konkreten, bereits ausgelieferten Anlage mit Seriennummer, Störungsbild, Techniker, Ersatzteilen und Reaktionszeit.

Ein einziges Datenmodell „Auftrag“ für alle drei Bereiche würde zur Sammeltabelle mit Dutzenden optionaler Felder, deren Bedeutung nur noch Eingeweihte kennen. Mit drei Bounded Contexts bekommt jeder Bereich sein eigenes, schlankes Modell. Verbunden werden sie über stabile Kennungen wie Auftragsnummer und Seriennummer sowie über fachliche Ereignisse.

Bestätigt der Vertrieb einen Kundenauftrag, veröffentlicht sein Kontext etwa das Ereignis „Kundenauftrag bestätigt“. Die Produktion übersetzt es in eigene Fertigungsaufträge. Hängt die Produktion zusätzlich an einem älteren ERP-System, schützt ein Anticorruption Layer das Fertigungsmodell vor dessen Datenstrukturen. Der Service-Kontext übernimmt nach Auslieferung nur Anlagendaten und Seriennummer, nicht aber Preise oder Arbeitspläne.

Typische Fehler beim Schneiden von Bounded Contexts

  1. Bounded Context mit Microservice gleichsetzen. Wer jeden Kontext sofort als eigenen Service ausrollt, zahlt früh den Aufwand verteilter Systeme, bevor die Grenzen stabil sind.
  2. Nach technischen Schichten schneiden. „Frontend“, „Backend“ und „Datenbank“ sind keine fachlichen Kontexte. Grenzen folgen der Sprache und den Geschäftsregeln.
  3. Ein unternehmensweites Einheitsmodell anstreben. Evans hält eine vollständige Vereinheitlichung des Domänenmodells großer Systeme für weder machbar noch wirtschaftlich. Das kanonische „Kunde für alle“-Objekt erzeugt genau die Mehrdeutigkeit, die Kontexte vermeiden sollen.
  4. Datenbanktabellen heimlich teilen. Greifen zwei Kontexte auf dieselben Tabellen zu, entsteht ein ungeplanter Shared Kernel ohne Absprache. Jede Schemaänderung wird zum Risiko und erhöht die technische Schuld.
  5. Nur das Zielbild zeichnen. Eine Context Map, die den Ist-Zustand ausblendet, verschweigt die tatsächlichen Abhängigkeiten und führt zu unrealistischen Migrationsplänen.
  6. Teamstrukturen ignorieren. Kontexte ohne eindeutigen Eigentümer verwässern, weil niemand über die Sprache und das Modell entscheidet.

Häufige Fragen zu Bounded Context

Wie groß sollte ein Bounded Context sein?

Eine feste Größe gibt es nicht. Ein Kontext ist richtig geschnitten, wenn seine Sprache in sich widerspruchsfrei ist, ein Team ihn verantwortet und er sich mit überschaubaren Schnittstellen an andere Kontexte anbinden lässt. Zu kleine Kontexte erzeugen viel Integrationsaufwand, zu große verlieren ihre sprachliche Klarheit. Evans weist selbst darauf hin, dass immer kleinere Kontexte irgendwann wertvolle Kohärenz kosten.

Ist ein Bounded Context dasselbe wie ein Microservice?

Nein. Der Bounded Context ist eine fachliche Modellgrenze, der Microservice eine technische Auslieferungseinheit. Ein Kontext kann als Modul in einem Monolithen, als ein Service oder als Gruppe mehrerer Services umgesetzt werden. Umgekehrt sollte ein Service nie Modelle aus mehreren Kontexten vermischen.

Was ist der Unterschied zwischen Subdomain und Bounded Context?

Die Subdomain beschreibt einen fachlichen Teilbereich des Geschäfts, also das Problem. Der Bounded Context beschreibt die Grenze eines Software-Modells, also die Lösung. Im Idealfall entsprechen sie sich eins zu eins. In gewachsenen Systemen deckt ein Kontext oft mehrere Subdomänen ab, was ein Hinweis auf Umbaubedarf sein kann.

Lohnen sich Bounded Contexts auch ohne vollständiges DDD?

Ja. Schon eine einfache Context Map deiner bestehenden Systeme macht Abhängigkeiten, Übersetzungsstellen und Begriffskonflikte sichtbar. Die strategischen DDD-Muster lassen sich auch nutzen, ohne die taktischen Bausteine wie Aggregates oder Repositories konsequent einzusetzen. Gerade bei der Ablösung von Altsystemen ist das Kontextdenken der wertvollere Teil.

Weiterführende Artikel