Die 5 besten Tools für domänengesteuertes Design

May 09 2023
Von der Ereignisbeschaffung bis zum Testen von Frameworks: Steigern Sie Ihre DDD mit diesen 5 erstklassigen Tools (und einem Hauch von Bit)
Als Entwickler möchten wir häufig Softwaresysteme erstellen, die auf das Domänenmodell abgestimmt sind und Geschäftsanforderungen erfüllen. Hier kommt DDD ins Spiel.

Als Entwickler möchten wir häufig Softwaresysteme erstellen, die auf das Domänenmodell abgestimmt sind und Geschäftsanforderungen erfüllen. Hier kommt DDD ins Spiel.

Domain-Driven Design (DDD) ist eine Methodik zur Entwicklung von Softwaresystemen, die einen starken Schwerpunkt auf die Ausrichtung des Domänenmodells an der Implementierung legt. Durch die Fokussierung auf den Problembereich und die Schaffung eines gemeinsamen Verständnisses der relevanten Konzepte und Zusammenhänge können Entwickler Software erstellen, die die Bedürfnisse der Stakeholder besser widerspiegelt und sich besser an sich ändernde Geschäftsanforderungen anpassen lässt.

Zur Unterstützung von DDD können Entwickler eine Vielzahl von Tools und Technologien verwenden, die bei Aufgaben wie Domänenmodellierung, Datenzuordnung und Tests hilfreich sind. In diesem Artikel werden wir einige der besten verfügbaren Tools und Frameworks zur Unterstützung von DDD untersuchen. Von Event Sourcing und CQRS bis hin zu Domänenmodellierungstools und ORM-Frameworks werden wir eine Reihe von Tools abdecken und ihre wichtigsten Vorteile und Anwendungsfälle hervorheben. Egal, ob Sie DDD-Neuling oder ein erfahrener Praktiker sind, lesen Sie weiter, um die besten Tools zum Aufbau domänengesteuerter Softwaresysteme zu entdecken.

Was ist das Domänenmodell und wie können wir es verwenden?

Kaufen Sie zuerst. Wenn Sie neu bei DD sind, lassen Sie uns kurz auf den rosa Elefanten im Raum eingehen: Was ist das „Domänenmodell“?

Das Domänenmodell ist ein zentrales Konzept im Domain-Driven Design (DDD) und stellt den Kern eines Softwaresystems dar. Es handelt sich um ein konzeptionelles Modell des realen Bereichs, den das Softwaresystem ansprechen soll, und es definiert die Struktur der Daten und das Verhalten des Systems. Das Domänenmodell ist ein gemeinsames Verständnis der Problemdomäne unter allen Beteiligten, einschließlich Geschäftsexperten, Entwicklern und Benutzern.

Dieses Modell besteht aus:

  • Entitäten, bei denen es sich um Objekte mit eindeutigen Identitäten handelt, die einen Lebenszyklus haben.
  • Aggregate sind Cluster verwandter Objekte, die eine Transaktionskonsistenzgrenze bilden.
  • Wertobjekte sind Objekte, die keine eindeutige Identität haben und durch ihre Eigenschaften definiert werden.
  • Domänendienste sind Vorgänge oder Algorithmen, die nicht spezifisch für eine einzelne Entität oder ein einzelnes Wertobjekt sind.

Denken wir an ein Beispiel

Ich verwende immer gerne praktische Beispiele, um komplexe Konzepte zu verstehen. Nehmen wir also an, wir bauen eine E-Commerce-Plattform und eine der Anforderungen besteht darin, Benutzern die Möglichkeit zu geben, Bestellungen für Produkte aufzugeben.

Beim domänengesteuerten Design beginnen wir mit der Erstellung eines Domänenmodells, das die relevanten Konzepte und Beziehungen in der Problemdomäne darstellt.

Eine der wichtigsten Entitäten in dieser Domäne ist die Entität „Bestellung“, die eine einzelne Bestellung eines Benutzers darstellt. Die Order-Entität hätte Eigenschaften wie eine OrderID , eine CustomerID , eine Liste der bestellten Produkte , einen Gesamtpreis und einen Status (z. B. ausstehend, erfüllt, storniert).

Eine weitere Entität in dieser Domäne könnte die Produktentität sein, die ein zum Kauf verfügbares Produkt darstellt. Die Produktentität kann Eigenschaften wie eine Produkt-ID , einen Namen , eine Beschreibung , ein Bild , einen Preis und eine Liste von Kategorien haben .

Aggregate sind Cluster verwandter Objekte, die eine Transaktionskonsistenzgrenze bilden. Daher können wir ein Bestellaggregat erstellen, das die Entität „Bestellung“ sowie zugehörige Entitäten wie die Entität „Produkt“ und die Entität „Kunde“ enthält. Dadurch würde sichergestellt, dass alle Änderungen an diesen Entitäten auf transaktionskonsistente Weise durchgeführt werden.

Wir können auch Wertobjekte erstellen, um Konzepte wie Lieferadressen und Rechnungsadressen darzustellen, die keine eindeutigen Identitäten haben, sondern durch ihre Eigenschaften definiert werden.

Schließlich könnten wir Domänendienste wie einen ShippingService erstellen, der für die Berechnung der Versandkosten und die Aktualisierung der Order-Entität mit den entsprechenden Versandinformationen verantwortlich wäre.

Insgesamt hilft uns dieses Domänenmodell, die Schlüsselkonzepte und Beziehungen in der Problemdomäne zu verstehen und bietet eine Grundlage für die Implementierung der E-Commerce-Plattform. Indem wir die Implementierung am Domänenmodell ausrichten, können wir ein System schaffen, das flexibler und wartbarer ist und besser auf sich ändernde Geschäftsanforderungen reagiert.

Schauen wir uns nun einige Tools an, die uns dabei helfen könnten.

Event Sourcing – der Heilige Gral von DDD

Event Sourcing ist eine Technik zur Implementierung von DDD-Konzepten wie Aggregaten, Entitäten und Wertobjekten. Beim Event Sourcing speichern wir alle am System vorgenommenen Änderungen als Abfolge von Ereignissen, anstatt nur den aktuellen Zustand des Systems zu speichern. Auf diese Weise können wir den Zustand des Systems zu jedem Zeitpunkt rekonstruieren, was unglaublich aussagekräftig ist. Es ist, als ob Sie eine Zeitmaschine für Ihre Software hätten!

Fahren wir mit unserem Beispiel einer E-Commerce-Plattform fort.

Nehmen wir an, wir möchten Änderungen an unserer Order-Entität im Laufe der Zeit verfolgen. Mit Event Sourcing erstellen wir statt der direkten Aktualisierung der Order-Entität eine Reihe von Ereignissen, die die Statusänderungen der Order darstellen. Jedes Ereignis stellt eine diskrete Änderung des Status der Auftragseinheit dar und wird in einem Ereignisprotokoll gespeichert.

Angenommen, ein Benutzer gibt eine Bestellung für ein Produkt auf. Anstatt die Order-Entität direkt mit den neuen Bestelldetails zu aktualisieren, erstellen wir ein OrderPlaced-Ereignis, das die OrderID, die CustomerID, die Liste der bestellten Produkte und den Gesamtpreis enthält. Anschließend hängen wir dieses Ereignis an das Ereignisprotokoll an.

Wenn der Benutzer später seine Bestellung aktualisiert, indem er Produkte hinzufügt oder entfernt, erstellen wir ein OrderUpdated-Ereignis, das die OrderID und die aktualisierte Produktliste enthält, und hängen es an das Ereignisprotokoll an. Wenn die Bestellung storniert wird, erstellen wir ein OrderCanceled-Ereignis, das die OrderID und den Grund für die Stornierung enthält, und hängen es an das Ereignisprotokoll an.

Durch die Verwendung von Event Sourcing können wir den Status der Order-Entität zu jedem Zeitpunkt wiederherstellen, indem wir die Ereignisse im Ereignisprotokoll wiedergeben. Wir können das Ereignisprotokoll auch verwenden, um Änderungen an der Bestelleinheit zu überwachen und Berichte zu erstellen, die den Verlauf der Bestellung anzeigen.

Durch die Verwendung von Event Sourcing zur Erfassung von Zustandsänderungen dieser Objekte können wir sicherstellen, dass unsere Softwareimplementierung mit dem Domänenmodell übereinstimmt.

Nehmen wir zum Beispiel an, dass unsere Bestellung tatsächlich ein Aggregat ist, das aus einer oder mehreren OrderLine-Entitäten und einem ShippingAddress-Wertobjekt besteht. Durch die Verwendung von Event Sourcing können wir jede Statusänderung im Order-Aggregat als eine Reihe von Ereignissen erfassen, z. B. OrderPlaced, OrderUpdated und OrderCanceled. Diese Ereignisse können dann verwendet werden, um den Status des Auftragsaggregats zu jedem Zeitpunkt wiederherzustellen und so sicherzustellen, dass unsere Softwareimplementierung das Domänenmodell genau widerspiegelt.

Mit Bit können Sie eine Komponente erstellen, die die Event-Sourcing-Implementierung einschließlich des Ereignisspeichers, der Ereignishandler und anderer relevanter Komponenten kapselt. Dieses Bit kann dann mit anderen Teams geteilt werden, die es problemlos in ihren eigenen Projekten wiederverwenden können. Durch die Verwendung von Bit können Sie sicherstellen, dass die Implementierung über verschiedene Projekte und Teams hinweg konsistent ist. Dies kann besonders in großen Organisationen von Nutzen sein, in denen mehrere Entwicklungsteams an verschiedenen Projekten arbeiten.

CQRS – Wenn eine Einheitsgröße nicht für alle passt

CQRS (Command Query Responsibility Segregation) ist ein Muster, das zur Trennung von Lese- und Schreibvorgängen in einem System verwendet wird. In herkömmlichen Architekturen verfügen wir über ein einziges Modell, das sowohl Lese- als auch Schreibvorgänge verarbeitet, was zu Leistungsproblemen und Skalierbarkeitsproblemen führen kann. CQRS löst dieses Problem durch die Trennung der Lese- und Schreibmodelle, sodass wir jedes Modell unabhängig optimieren können.

Zur Unterstützung von CQRS stehen mehrere Frameworks zur Verfügung. Ein solches Framework ist NestJS. NestJS erreicht CQRS durch die Verwendung seines integrierten Ereignisbusses, der es Ihnen ermöglicht, Ereignisse in verschiedenen Teilen Ihrer Anwendung zu veröffentlichen und zu abonnieren. Dies erleichtert die Implementierung eines Befehlshandlers, der in die Datenbank Ihrer Anwendung schreibt, sowie eines Abfragehandlers, der Daten aus der Datenbank abruft und an den Client zurückgibt.

Durch die Trennung dieser beiden Verantwortlichkeiten können Sie sicherstellen, dass Ihre Anwendung leistungsfähiger, einfacher zu testen und widerstandsfähiger gegen Änderungen ist

Die Verwendung von NestJS mit Bit kann Ihre Fähigkeit zur Entwicklung von DDD-Anwendungen weiter verbessern. Bit bietet eine Möglichkeit, Codekomponenten in verschiedenen Projekten zu teilen und wiederzuverwenden ( lesen Sie diesen Artikel , um mehr darüber zu erfahren), sodass Teams effektiver zusammenarbeiten und Doppelarbeit vermeiden können. Durch die Erstellung einer gemeinsam genutzten Bibliothek von NestJS-Komponenten wie Befehls- und Abfragehandlern können Sie die Menge an Code reduzieren, die Sie in Ihrem gesamten Anwendungsportfolio schreiben und verwalten müssen. Darüber hinaus können Sie mit Bit Änderungen an Ihren Komponenten im Laufe der Zeit versionieren und verfolgen, was die Verwaltung von Abhängigkeiten erleichtert und die Kompatibilität zwischen Ihren Anwendungen gewährleistet.

Tools zur Domänenmodellierung – Visualisieren Sie Ihr Domänenmodell

Ah, Domänenmodellierungstools. Wenn Sie sich für Domain-Driven Design (DDD) interessieren, sind Sie wahrscheinlich damit vertraut. Wenn nicht, machen Sie sich keine Sorgen – ich bin hier, um Ihnen dabei zu helfen, sich auf den neuesten Stand zu bringen.

Was sind also Domänenmodellierungstools? Kurz gesagt handelt es sich dabei um Softwareanwendungen, die Entwicklern dabei helfen, das Domänenmodell ihres Softwaresystems zu erstellen und zu visualisieren. Das Domänenmodell ist eine Darstellung der realen Konzepte und Beziehungen, die das Softwaresystem modellieren soll. Es ist ein wesentlicher Bestandteil von DDD, das die Bedeutung eines klaren, präzisen und gemeinsamen Verständnisses des Domänenmodells aller Beteiligten hervorhebt.

Es stehen verschiedene Domänenmodellierungstools zur Verfügung, mit denen Sie Domänenmodelle für Ihre Softwaresysteme erstellen und visualisieren können. Diese Tools können besonders nützlich sein, wenn Sie mit Domänenexperten und anderen Teammitgliedern zusammenarbeiten, um sicherzustellen, dass das Domänenmodell korrekt und gut verständlich ist.

Ein Beispiel für ein solches Tool ist PlantUML , ein textbasiertes Diagrammtool, mit dem Sie UML-Diagramme, einschließlich Klassendiagramme, Sequenzdiagramme, Anwendungsfalldiagramme und mehr, mit einer einfachen Syntax erstellen können. PlantUML ist Open Source und unterstützt mehrere Ausgabeformate, darunter PNG, SVG und PDF. Es kann über Erweiterungen oder Plugins in verschiedene Editoren und IDEs, einschließlich Visual Studio Code, integriert werden.

Ein weiteres beliebtes Tool ist Lucidchart , ein webbasiertes Diagrammtool, mit dem Sie mithilfe einer Drag-and-Drop-Oberfläche verschiedene Arten von Diagrammen erstellen können, darunter Flussdiagramme, UML-Diagramme, ER-Diagramme und mehr. Lucidchart bietet eine Reihe von Vorlagen und Formen, mit denen Sie schnell und einfach professionell aussehende Diagramme erstellen können.

Darüber hinaus bieten einige Code-Editoren und IDEs, wie z. B. IntelliJ IDEA, integrierte Unterstützung für UML-Diagramme und andere visuelle Modellierungstools, was bei der Arbeit an Softwaresystemen mit komplexen Domänenmodellen nützlich sein kann.

Insgesamt können Domänenmodellierungswerkzeuge bei der Arbeit an Softwaresystemen, die komplexe Domänenmodelle beinhalten, eine wertvolle Bereicherung sein. Sie können Ihnen dabei helfen, das Domänenmodell effektiv zu erstellen, zu visualisieren und mit anderen Teammitgliedern zu kommunizieren, wodurch es einfacher wird, Softwaresysteme zu erstellen, die den Geschäftsanforderungen entsprechen.

ORM-Frameworks (Object-Relational Mapping).

Eine der größten Herausforderungen bei der Implementierung von DDD ist die Zuordnung von Objekten zu relationalen Datenbanken. Hier kommen ORM-Frameworks zum Einsatz. ORM-Frameworks bieten eine Möglichkeit, Objekte Tabellen in einer relationalen Datenbank zuzuordnen. Dadurch können Sie mit Objekten in Ihrem Code arbeiten, während sich das Framework um die Datenbankinteraktionen kümmert.

Es gibt zahlreiche gängige ORM-Frameworks für alle Sprachen. Für das JavaScript-Ökosystem haben Sie, wie es nicht anders sein könnte, eine riesige Auswahl. Allerdings sind Sequelize und Prisma einige der beliebtesten Optionen . Diese Frameworks bieten eine Möglichkeit, Objekte Tabellen in einer Datenbank zuzuordnen, und sie bieten auch eine Möglichkeit, die Datenbank mithilfe einer objektorientierten Syntax abzufragen.

Einer der Vorteile der Verwendung von ORM-Frameworks besteht darin, dass sie die Menge an Boilerplate-Code reduzieren, die Sie schreiben müssen. Sie erleichtern außerdem die Änderung des zugrunde liegenden Datenbankschemas, ohne dass Sie Ihren Code ändern müssen.

Allerdings können ORM-Frameworks auch zu einem gewissen Leistungsaufwand führen und die Ausführung komplexer Abfragen (z. B. komplexer JOINs und Unterabfragen) erschweren. Daher ist es wichtig, das richtige Framework für Ihre Anwendung auszuwählen.

Neben all den Vorteilen, die ORMs bieten, bietet Bit noch mehr Mehrwert, indem es Ihnen die Wiederverwendung von Datenmodellen und generischem Code in mehreren Projekten ermöglicht, die Datenstrukturen problemlos gemeinsam nutzen. Sie können beispielsweise eine ORM-Komponente erstellen, die ein bestimmtes Datenmodell definiert, und diese dann in verschiedenen Teilen Ihrer Anwendung wiederverwenden. Dadurch können Sie Zeit und Mühe sparen, da Sie denselben Code nicht mehrmals schreiben müssen. Da Bit Ihnen außerdem die einfache Verwaltung und Versionierung Ihrer Komponenten ermöglicht, können Sie sicherstellen, dass alle Ihre Komponenten auf dem neuesten Stand sind und der aktuellen Version Ihrer Datenstruktur entsprechen.

Hat Ihnen gefallen, was Sie gelesen haben? Erwägen Sie, meinen KOSTENLOSEN Newsletter zu abonnieren , in dem ich mein Wissen aus zwei Jahrzehnten in der IT-Branche mit allen teile. Machen Sie mit bei „ Das Geschwafel eines alten Entwicklers “!

Frameworks testen

Beim Testen im Domain-Driven Design (DDD) ist es wichtig sicherzustellen, dass Ihr Domänenmodell korrekt ist und sich wie erwartet verhält. Hier kommen Test-Frameworks ins Spiel. Ihre Tests sollten das Domänenmodell irgendwie beschreiben, um sicherzustellen, dass die endgültige Logik Ihrer Software die Erwartungen erfüllt.

Es gibt viele Test-Frameworks für JavaScript, jedes mit seinen eigenen Stärken und Schwächen.

Zwei sehr beliebte Test-Frameworks für JavaScript sind Jest und Mocha.

Jest ist ein JavaScript-Testframework, das von Facebook entwickelt wurde. Es bietet eine einfache und intuitive Test-API, mit der Sie problemlos Tests für Ihren JavaScript-Code schreiben können. Jest bietet außerdem Funktionen wie Mocking und Snapshot-Tests, mit denen Sie effizientere und effektivere Tests schreiben können.

Mocha ist ein JavaScript-Testframework, mit dem Sie Tests in jedem von Ihnen bevorzugten Stil schreiben können. Es bietet eine flexible API, mit der sowohl synchroner als auch asynchroner Code getestet werden kann. Mocha unterstützt außerdem mehrere Berichtsformate und erleichtert so die Integration mit anderen Tools in Ihren Testworkflow.

Die Verwendung eines Test-Frameworks wie Jest oder Mocha kann Ihnen dabei helfen, Fehler zu erkennen und sicherzustellen, dass sich Ihr Domain-Modell wie erwartet verhält. Allerdings kann es zeitaufwändig und mühsam sein, Ihre Tests einzurichten und sicherzustellen, dass Sie sie immer ausführen. Hier kann Bit helfen.

Bit generiert automatisch eine Testvorlage für jede einzelne Komponente, die Sie erstellen. Darüber hinaus ist der Testschritt in allen Hauptprozessen (z. B. Markieren und Erstellen der Komponenten) obligatorisch. Selbst wenn Sie dies nicht möchten, müssen Sie die Tests schreiben, um sicherzustellen, dass die Komponenten gepusht werden können mit anderen Entwicklern geteilt. Darüber hinaus wird die Einrichtung von Jest (oder Ihren gewünschten Test-Frameworks) automatisch von Bit durchgeführt, sodass Sie sich auch über diesen Schritt keine Gedanken machen müssen.

Zusammenfassend lässt sich sagen, dass die Verwendung eines Test-Frameworks bei der Entwicklung von Anwendungen nach den Prinzipien des Domain-Driven Design (DDD) von entscheidender Bedeutung ist. Jest und Mocha sind beliebte Optionen zum Testen von JavaScript-Anwendungen, und die Verwendung von Bit kann Ihnen dabei helfen, Ihren Testprozess zu optimieren. Dadurch können Sie Zeit und Aufwand sparen und sicherstellen, dass Ihre Tests auf dem neuesten Stand sind und ordnungsgemäß funktionieren.

Zusammenfassend ist Domain-Driven Design (DDD) eine leistungsstarke Methode zur Entwicklung von Softwaresystemen, die sich auf die Ausrichtung des Domänenmodells an der Implementierung konzentriert. Zur Unterstützung von DDD können Sie eine Vielzahl von Tools und Technologien verwenden, darunter Event Sourcing, CQRS, Domänenmodellierungstools, ORM-Frameworks und Test-Frameworks.

Darüber hinaus ermöglicht Bit Teams die Erstellung und gemeinsame Nutzung von Komponenten, die bestimmte Geschäftsfunktionen kapseln, was für die Erstellung und Wartung komplexer Anwendungen, die auf DDD basieren, von entscheidender Bedeutung ist. Komponenten können verwendet werden, um Domänenmodelle zu erstellen, in Datenbanken zu integrieren und komplexe Geschäftslogik auszuführen.

Egal, ob Sie gerade erst mit DDD anfangen oder ein erfahrener Profi sind, diese Tools und Technologien können Ihnen dabei helfen, bessere Softwareanwendungen zu entwickeln, die Ihren Geschäftsanforderungen entsprechen.

Probieren Sie sie einfach aus und finden Sie heraus, was für Sie am besten funktioniert!

Erfahren Sie mehr