Was ist Domain Driven Design?

198

Kann jemand bitte (kurz und bündig) erklären, was genau domänengesteuertes Design ist? Ich sehe den Begriff ziemlich oft, verstehe aber wirklich nicht, was er ist oder wie er aussieht. Wie unterscheidet es sich von nicht domänengesteuertem Design?

Kann jemand erklären, was ein Domänenobjekt ist? Wie unterscheidet sich die Domäne von normalen Objekten?

Calanus
quelle
6
Mögliches Duplikat von Was ist domänengesteuertes Design?
Niels van der Rest
Beantwortet das deine Frage? Was ist Domain Driven Design (DDD)?
Satpal

Antworten:

112

BEARBEITEN:

Da dies ein Top-Ergebnis bei Google zu sein scheint und meine Antwort unten nicht lautet, beziehen Sie sich bitte auf diese viel bessere Antwort:

https://stackoverflow.com/a/1222488/1240557

ALTE ANTWORT (nicht so vollständig :))

Um eine gute Software zu erstellen, müssen Sie wissen, worum es bei dieser Software geht. Sie können kein Bankensoftwaresystem erstellen, wenn Sie nicht genau wissen, worum es beim Bankgeschäft geht. Sie müssen den Bereich des Bankwesens verstehen.

Aus: Domain Driven Design von Eric Evans.

Dieses Buch beschreibt DDD ziemlich gut.

Registrieren Sie sich, um eine Zusammenfassung des Buches herunterzuladen , oder laden Sie die Zusammenfassung direkt herunter .

Mikael Östberg
quelle
Diese Mini-Version ist eine hervorragende Referenz und ich finde sie hilfreich, selbst wenn eine Kopie des vollständigen Textes vorliegt. Ich gehe in der Regel zuerst darauf und dann auf den Text, um weitere Einzelheiten zu erfahren.
Kyri Sarantakos
15
Also nehme ich aus dieser Antwort "dieses Buch lesen", dass es unmöglich ist, DDD in nur wenigen Absätzen zusammenzufassen? Wie kann eine Designphilosophie so kompliziert sein?
Robin Winslow
Ich würde nicht sagen, dass es unmöglich ist, aber ich dachte, es gibt bessere Orte, um darüber zu lesen, und Eric Evans Buch ist die beste Quelle dafür imo. Warum also das hier duplizieren?
Mikael Östberg
6
Sehr geehrter Leser, wenn Sie, wie ich, vom Top-Google-Ergebnis hierher gekommen sind und enttäuscht waren, die akzeptierte Antwort so überwältigend zu finden (Entschuldigung, Mikael), befürchten Sie nicht, dass es hier auf SO zufriedenstellendere Erklärungen gibt: stackoverflow.com/a/1222488 / 1240557
Kryger
3
Dort habe ich meine Antwort mit dem Link aktualisiert. Das war eine viel bessere Antwort. Vielen Dank!
Mikael Östberg
41

Domain Driven Design ist eine Methodik und ein Prozessrezept für die Entwicklung komplexer Systeme, deren Schwerpunkt auf der Zuordnung von Aktivitäten, Aufgaben, Ereignissen und Daten innerhalb einer Problemdomäne zu den Technologieartefakten einer Lösungsdomäne liegt.

Der Schwerpunkt von Domain Driven Design liegt auf dem Verständnis der Problemdomäne, um ein abstraktes Modell der Problemdomäne zu erstellen, das dann in einem bestimmten Satz von Technologien implementiert werden kann. Domain Driven Design als Methodik bietet Richtlinien dafür, wie diese Modellentwicklung und Technologieentwicklung zu einem System führen kann, das den Anforderungen der Benutzer entspricht und gleichzeitig robust gegenüber Veränderungen in der Problemdomäne ist.

Die Prozessseite von Domain Driven Design umfasst die Zusammenarbeit zwischen Domain-Experten, Personen, die die Problemdomäne kennen, und Design- / Architektur-Experten, Personen, die die Lösungsdomäne kennen. Die Idee ist, ein gemeinsames Modell mit gemeinsamer Sprache zu haben, damit Menschen aus diesen beiden unterschiedlichen Bereichen mit ihren zwei unterschiedlichen Perspektiven die Lösung diskutieren und tatsächlich eine gemeinsame Wissensbasis mit gemeinsamen Konzepten diskutieren.

Das Fehlen eines gemeinsamen Verständnisses der Problemdomäne zwischen den Personen, die ein bestimmtes System benötigen, und den Personen, die das System entwerfen und implementieren, scheint ein Haupthindernis für erfolgreiche Projekte zu sein. Domain Driven Design ist eine Methode, um dieses Hindernis zu beseitigen.

Es ist mehr als ein Objektmodell. Der Fokus liegt wirklich auf der gemeinsamen Kommunikation und der Verbesserung der Zusammenarbeit, damit die tatsächlichen Bedürfnisse innerhalb der Problemdomäne entdeckt und eine geeignete Lösung geschaffen werden kann, um diese Bedürfnisse zu erfüllen.

Domain-Driven Design: Das Gute und das Herausfordernde bietet mit diesem Kommentar einen kurzen Überblick:

DDD hilft dabei, die Architektur der obersten Ebene zu entdecken und über die Mechanik und Dynamik der Domäne zu informieren, die die Software replizieren muss. Konkret bedeutet dies, dass eine gut durchgeführte DDD-Analyse Missverständnisse zwischen Domänenexperten und Softwarearchitekten minimiert und die nachfolgende Anzahl teurer Änderungsanforderungen reduziert. Durch die Aufteilung der Domänenkomplexität in kleinere Kontexte vermeidet DDD, dass Projektarchitekten gezwungen werden, ein aufgeblähtes Objektmodell zu entwerfen, bei dem viel Zeit für die Erarbeitung von Implementierungsdetails verloren geht - auch weil die Anzahl der zu bearbeitenden Entitäten häufig über das hinausgeht Größe der Whiteboards im Konferenzraum.

Lesen Sie auch diesen Artikel Domain Driven Design für Services Architecture, der ein kurzes Beispiel enthält. Der Artikel enthält die folgende Miniaturbeschreibung des domänengesteuerten Designs.

Domain Driven Design befürwortet eine Modellierung basierend auf der Realität des Geschäfts als relevant für unsere Anwendungsfälle. Da es jetzt älter wird und der Hype abnimmt, vergessen viele von uns, dass der DDD-Ansatz wirklich dazu beiträgt, das vorliegende Problem zu verstehen und Software für das gemeinsame Verständnis der Lösung zu entwickeln. Beim Erstellen von Anwendungen spricht DDD von Problemen als Domänen und Subdomänen. Es beschreibt unabhängige Schritte / Problembereiche als begrenzte Kontexte, betont eine gemeinsame Sprache, um über diese Probleme zu sprechen, und fügt viele technische Konzepte wie Entitäten, Wertobjekte und aggregierte Stammregeln hinzu, um die Implementierung zu unterstützen.

Martin Fowler hat eine Reihe von Artikeln verfasst, in denen Domain Driven Design als Methodik erwähnt wird. Beispielsweise bietet dieser Artikel, BoundedContext , einen Überblick über das Konzept des begrenzten Kontexts aus der domänengesteuerten Entwicklung.

In jenen jüngeren Tagen wurde uns geraten, ein einheitliches Modell des gesamten Geschäfts zu erstellen, aber DDD erkennt an, dass wir erfahren haben, dass "eine vollständige Vereinheitlichung des Domänenmodells für ein großes System nicht machbar oder kostengünstig sein wird" 1 . Stattdessen unterteilt DDD ein großes System in begrenzte Kontexte, von denen jeder ein einheitliches Modell haben kann - im Wesentlichen eine Möglichkeit, MultipleCanonicalModels zu strukturieren.

Richard Chambers
quelle
20

Sie können das domänengesteuerte Design NUR verstehen, wenn Sie zunächst die folgenden Punkte verstehen:

Was ist eine Domain?

Das Feld, für das ein System erstellt wurde. Flughafenmanagement, Versicherungsverkauf, Cafés, Orbitalflug, wie Sie es nennen.

Es ist nicht ungewöhnlich, dass eine Anwendung mehrere verschiedene Domänen umfasst. Beispielsweise kann ein Online-Handelssystem in den Bereichen Versand (Auswahl geeigneter Versandarten, abhängig von Artikeln und Bestimmungsort), Preisgestaltung (einschließlich Werbeaktionen und benutzerspezifischer Preisgestaltung nach beispielsweise Standort) und Empfehlungen (Berechnung im Zusammenhang) funktionieren Produkte nach Kaufhistorie).

Was ist ein Modell?

"Eine nützliche Annäherung an das vorliegende Problem." - Gerry Sussman

Eine Mitarbeiterklasse ist kein echter Mitarbeiter. Es modelliert einen echten Mitarbeiter. Wir wissen, dass das Modell nicht alles über echte Mitarbeiter erfasst, und darum geht es nicht. Es soll nur erfassen, woran wir für den aktuellen Kontext interessiert sind.

Verschiedene Domänen können auf unterschiedliche Weise daran interessiert sein, dasselbe zu modellieren. Beispielsweise können die Gehaltsabteilung und die Personalabteilung Mitarbeiter auf unterschiedliche Weise modellieren.

Was ist ein Domain-Modell?

Ein Modell für eine Domain.

Was ist Domain-Driven Design (DDD)?

Es ist ein Entwicklungsansatz, der das Domänenmodell zutiefst schätzt und es mit der Implementierung verbindet. DDD wurde von Eric Evans geprägt und ursprünglich entwickelt.

Von hier aus gekeult

Edwin Ikechukwu Okonkwo
quelle
12

Hier ist ein weiterer guter Artikel, den Sie über Domain Driven Design lesen können . wenn Ihre Bewerbung etwas Ernstes ist als eine College-Aufgabe. Die Grundvoraussetzung ist, alles um Ihre Entitäten herum zu strukturieren und ein starkes Domänenmodell zu haben. Unterscheiden Sie zwischen Diensten, die infrastrukturbezogene Dinge bereitstellen (wie das Senden von E-Mails, persistente Daten), und Diensten, die tatsächlich Dinge tun, die Ihren Kerngeschäftsanforderungen entsprechen.

Hoffentlich hilft das.

Nilesh
quelle
4

Wie bei TDD & BDD konzentrieren Sie / Ihr Team sich am meisten auf Test und Verhalten des Systems als auf die Code-Implementierung.

Ähnlich verhält es sich, wenn Systemanalytiker, Product Owner, Entwicklungsteam und natürlich der Code - Entitäten / Klassen, Variablen, Funktionen, Benutzeroberflächenprozesse - in derselben Sprache kommunizieren, die als Domain Driven Design bezeichnet wird

DDD ist ein Denkprozess. Bei der Modellierung eines Software-Designs müssen Sie den Geschäftsbereich / -prozess im Mittelpunkt der Aufmerksamkeit halten und nicht Datenstrukturen, Datenflüsse, Technologie, interne und externe Abhängigkeiten.

Es gibt viele Ansätze, um Systeme mit DDD zu modellieren

  • Event Sourcing (Verwendung von Events als einzige Quelle der Wahrheit)
  • relationale Datenbanken
  • Diagrammdatenbanken
  • mit funktionalen Sprachen

Domänenobjekt:

In sehr naiven Worten, ein Objekt, das

  • Der Name basiert auf dem Geschäftsprozess / -fluss
  • hat die vollständige Kontrolle über seinen internen Zustand, dh es werden Methoden zur Manipulation des Zustands verfügbar gemacht.
  • Erfüllen Sie immer alle Geschäftsinvarianten / Geschäftsregeln im Zusammenhang mit ihrer Verwendung.
  • folgt dem Prinzip der Einzelverantwortung
Nitin babariya
quelle
TDD - Test Driven Development
Nitin Babariya
BDD - Verhaltensorientierte Entwicklung
Nitin babariya
DDD - Domain Driven Development
Nitin Babariya
DDD -> Domain Driven Design ~ Entwicklung ~
Psaxton
4

DDD (Domain Driven Design) ist ein nützliches Konzept zur Analyse der Anforderungen eines Projekts und zum Umgang mit der Komplexität dieser Anforderungen. Zuvor analysierten die Benutzer diese Anforderungen unter Berücksichtigung der Beziehungen zwischen Klassen und Tabellen, und tatsächlich basierte ihr Design auf Datenbanktabellen Beziehungen es ist nicht alt, aber es hat einige Probleme:

  • In großen Projekten mit komplexen Anforderungen ist dies nicht sinnvoll, obwohl dies eine großartige Möglichkeit zum Entwerfen für kleine Projekte ist.

  • Wenn Sie mit keiner technischen Person zu tun haben, die kein technisches Konzept hat, kann dieser Konflikt einige große Probleme in unserem Projekt verursachen.

DDD behandelt also das erste Problem, indem es das Hauptprojekt als Domäne betrachtet und jeden Teil dieses Projekts in kleine Teile aufteilt, die wir für Bounded Context kennen und von denen jeder keinen Einfluss auf andere Teile hat. Das zweite Problem wurde mit einer allgegenwärtigen Sprache gelöst, die eine gemeinsame Sprache zwischen Mitgliedern des technischen Teams und Produktbesitzern ist, die nicht technisch sind, aber über ausreichende Kenntnisse über ihre Anforderungen verfügen

Im Allgemeinen ist die einfache Definition für Domain das Hauptprojekt, mit dem die Eigentümer und andere Teams Geld verdienen.

Sajadre
quelle
1

Ich glaube, das folgende PDF gibt Ihnen einen Überblick. Domain Driven Design von Eric Evans

HINWEIS: Stellen Sie sich ein Projekt vor, an dem Sie arbeiten können, wenden Sie die kleinen Dinge an, die Sie verstanden haben, und sehen Sie sich Best Practices an. Es wird Ihnen helfen, Ihre Fähigkeit zum Designansatz für Mikrodienstarchitekturen zu erweitern.

Hedego
quelle
0

Ich möchte die Antworten anderer nicht wiederholen, daher erkläre ich kurz einige häufige Missverständnisse

  • Praktische Ressource: MUSTER, PRINZIPIEN UND PRAXIS DES DOMAIN-DRIVEN DESIGN von Scott Millett
  • Es ist eine Methode für komplizierte Geschäftssysteme. Bei der Kommunikation mit Geschäftsexperten werden alle technischen Fragen erledigt
  • Es bietet ein umfassendes Verständnis des (vereinfachten und destillierten) Geschäftsmodells im gesamten Entwicklerteam.
  • Durch die Verwendung der allgegenwärtigen Sprache wird das Geschäftsmodell mit dem Codemodell synchronisiert (die Sprache, die vom gesamten Entwicklerteam, Geschäftsexperten, Geschäftsanalysten usw. verstanden wird), die für die Kommunikation innerhalb des Entwicklerteams oder des Entwicklers mit anderen Teams verwendet wird
  • Es hat nichts mit Projektmanagement zu tun . Obwohl es perfekt in Projektmanagementmethoden wie Agile verwendet werden kann.
  • Sie sollten vermeiden, alles in Ihrem Projekt zu verwenden

    DDD betont die Notwendigkeit, sich am meisten auf die Kern-Subdomäne zu konzentrieren. Die Kern-Subdomain ist der Bereich Ihres Produkts, der den Unterschied zwischen Erfolg und Misserfolg ausmacht. Es ist das Alleinstellungsmerkmal des Produkts, der Grund, warum es eher gebaut als gekauft wird.

    Grundsätzlich liegt es daran, dass es zu viel Zeit und Mühe kostet. Es wird daher empfohlen, die gesamte Domain in Subdomains zu unterteilen und sie nur auf diejenigen mit hohem Geschäftswert anzuwenden. (zB nicht in generischer Subdomain wie E-Mail, ...)

  • Es ist keine objektorientierte Programmierung. Es handelt sich hauptsächlich um Problemlösungsansätze, und ( manchmal ) müssen Sie in Ihren Domänenmodellen keine OO-Muster (wie z. B. Gang of Four) verwenden. Einfach, weil es von Geschäftsexperten nicht verstanden werden kann (sie wissen nicht viel über Fabrik, Dekorateur, ...). Es gibt sogar einige Muster in DDD (wie das Transaktionsskript, das Tabellenmodul), die nicht zu 100% mit den OO-Konzepten übereinstimmen.

Ali Abdoli
quelle