Domänengetriebenes Design
Domänengetriebenes Design (DDD) ist ein Software-Design sich nähern [1] Konzentration auf die Modellierung von Software, die zu einem passt Domain Nach Eingaben der Experten dieser Domäne.[2]
Bezüglich Objekt orientierte Programmierung Es bedeutet, dass die Struktur und Sprache des Softwarecode (Klassennamen, Klassenmethoden, Klassenvariablen) sollte dem übereinstimmen Geschäftsbereich. Wenn beispielsweise eine Software Darlehensanwendungen verarbeitet, kann es an Klassen wie Loan Application und Kunden sowie Methoden wie AcceptFer und Abheben verfügen.
DDD verbindet die Implementierung zu einem sich entwickelnden Modell.[3]
Das domänengesteuerte Design basiert auf den folgenden Zielen:
- Platzieren Sie den Hauptaugenmerk des Projekts auf den Kern Domain und Domänenlogik;
- Basieren komplexe Entwürfe auf ein Modell der Domäne;
- Initiierung einer kreativen Zusammenarbeit zwischen technischen und Domain -Experten Iterativ ein konzeptionelles Modell zu verfeinern, das bestimmte Domänenprobleme angeht.
Kritik an domänengesteuertem Design argumentieren, dass Entwickler in der Regel eine Menge Isolation und Kapselung implementieren müssen, um das Modell als reines und hilfreiches Konstrukt aufrechtzuerhalten. Während domänenorientiertes Design Vorteile wie Wartbarkeit bietet, empfiehlt Microsoft es nur für komplexe Domänen, in denen das Modell eindeutige Vorteile bei der Formulierung eines gemeinsamen Verständnisses der Domäne bietet.[4]
Der Begriff wurde von Eric Evans in seinem 2003 veröffentlichten Buch des gleichen Titel geprägt.[5]
Überblick
Domänengetriebenes Design artikuliert eine Reihe hochrangiger Konzepte und Praktiken.[5]
Von primärer Bedeutung ist DomainDer Fachbereich, auf den der Benutzer ein Programm anwendet, ist die Domäne der Software. Die Domain einer Software regelt ihre Kontext, die Einstellung, in der ein Wort oder eine Aussage erscheint, die seine Bedeutung bestimmt. Daraus bauen Entwickler a Domänenmodell: Ein System von Abstraktionen, das ausgewählte Aspekte einer Domäne beschreibt und zur Lösung von Problemen im Zusammenhang mit dieser Domäne verwendet werden kann.
Diese Aspekte des domänengesteuerten Designs zielen darauf ab, zu fördern allgegenwärtige Sprache, was bedeutet, dass das Domänenmodell a bilden sollte Gemeinsame Sprache gemeinsam von Domänenexperten zur Beschreibung der Systemanforderungen, Geschäftsbenutzer, Sponsoren und Entwickler.
Im domänengetriebenen Design die Domänenschicht ist eines der Gemeinsame Schichten in einem (n objektorientierter Mehrschichtige Architektur.
Arten von Modellen
Das domänengesteuerte Design erkennt mehrere Arten von Modellen.
Zum Beispiel eine Einheit ist ein Objekt, das nicht durch seine Attribute definiert ist, sondern es Identität. Beispielsweise weisen die meisten Fluggesellschaften den Sitzplätzen auf jedem Flug eine eindeutige Nummer zu: Dies ist die Identität des Sitzes.
Dagegen a Wertobjekt ist ein unveränderlich Objekt, das Attribute enthält, aber keine konzeptionelle Identität hat. Wenn Menschen beispielsweise Visitenkarten austauschen, kümmern sie sich nur um die Informationen auf der Karte (ihre Attribute), anstatt zu versuchen, zwischen jeder einzelnen Karte zu unterscheiden.
Modelle können auch definieren Veranstaltungen (etwas, das in der Vergangenheit passiert ist). Eine Domain -Veranstaltung ist eine Veranstaltung, die Domain -Experten interessieren.
Modelle können von einer Wurzeleinheit zusammengebunden werden, um eine zu werden Aggregat. Objekte außerhalb des Aggregats dürfen Verweise auf die Wurzel, jedoch nicht auf ein anderes Objekt des Aggregats halten. Die Aggregat -Wurzel prüft die Konsistenz von Änderungen im Aggregat. Die Fahrer müssen zum Beispiel nicht jedes Rad eines Autos einzeln steuern: Sie fahren einfach das Auto. In diesem Zusammenhang ist ein Auto ein Aggregat mehrerer anderer Objekte (der Motor, die Bremsen, die Scheinwerfer usw.)
Arbeiten mit Modellen
Bei der domänengesteuerten Gestaltung wird die Erstellung eines Objekts häufig vom Objekt selbst getrennt.
A RepositoryZum Beispiel ist ein Objekt mit Methoden zum Abrufen von Domänenobjekten aus einem Datenspeicher (z. B. einer Datenbank). Ebenso a Fabrik ist ein Objekt mit Methoden zum direkten Erstellen von Domänenobjekten.
Wenn ein Teil der Funktionalität eines Programms nicht konzeptionell zu einem Objekt gehört, wird dies normalerweise als ausgedrückt Service.
Beziehung zu anderen Ideen
Obwohl domänengetriebenes Design nicht von Natur aus gebunden ist objektorientierte AnsätzeIn der Praxis nutzt es die Vorteile solcher Techniken. Dazu gehören Entitäten/aggregierte Wurzeln als Empfänger von Befehlen/Methodenaufrufen, die Einkapselung des Zustands in den wichtigsten aggregierten Wurzeln und auf höheren architektonischen Ebenen begrenzte Kontexte.
Infolgedessen wird domänengetriebenes Design häufig miteinander verbunden Einfache alte Java -Objekte und Einfache alte CLR -Objekte. Technisch technisch technische Implementierungsdetails, spezifisch für Java und die .NET Framework Diese Begriffe spiegeln jeweils eine wachsende Ansicht wider, dass Domänenobjekte nur durch das Geschäftsverhalten der Domäne und nicht durch einen spezifischeren technologischen Rahmen definiert werden sollten.
Ebenso das nackte Objekte Muster ist der Ansicht, dass die Benutzeroberfläche einfach ein Spiegelbild eines gut genug Domänenmodells sein kann. Die Benutzeroberfläche als direkte Reflexion des Domänenmodells erzwingen, wird das Design eines besseren Domänenmodells erzwingen.[6]
Das domänengesteuerte Design hat andere Ansätze zur Softwareentwicklung beeinflusst.
Domänenspezifische Modellierungzum Beispiel wird domänengetriebenes Design mit angewendet Domänenspezifische Sprachen. Das domänengesteuerte Design erfordert nicht speziell die Verwendung von a Domänenspezifische Spracheobwohl es verwendet werden könnte, um eine domänenspezifische Sprache und Unterstützung zu definieren Domänenspezifische Multimodellierung.
Im Gegenzug, Aspekt-orientiertes Programmieren erleichtert es einfach, technische Bedenken (wie Sicherheit, Transaktionsmanagement, Protokollierung) von einem Domänenmodell auszufassen und sich nur auf die Geschäftslogik konzentrieren zu lassen.
Modellgetriebenes Engineering und Architektur
Während domänenorientiertes Design mit modellgetriebenem kompatibel ist Ingenieurwesen und die Architektur,[7] Die Absicht hinter den beiden Konzepten ist anders. Die modellgesteuerte Architektur befasst sich mehr mit der Übersetzung eines Modells in Code für verschiedene Technologieplattformen als mit der Definition besserer Domänenmodelle.
Die von modellgesteuerten Engineering bereitgestellten Techniken (um domänenspezifische Sprachen zu erstellen, um die Kommunikation zwischen Domänenexperten und Entwicklern zu erleichtern, ...) erleichtern das domänengesteuerte Design in der Praxis und helfen den Praktikern, mehr aus ihren herauszuholen Modelle. Dank der Modelltransformation und der Codegenerierung von modellgetriebenen Engineering kann das Domänenmodell verwendet werden, um das tatsächliche Softwaresystem zu generieren, das es verwaltet.[8]
Befehlsabfrageverantwortung Segregation
Befehlsabfrageverantwortung Segregation (CQRS) ist ein architektonisches Muster zur Trennung von Lesedaten (eine 'Abfrage') vom Schreiben auf Daten (ein 'Befehl'). CQRs stammen aus Befehls- und Abfrage -Trennung (CQS) Bertrand Meyer.
Befehle mutieren den Zustand und entspricht ungefähr der Methodenaufruf in aggregierten Wurzeln oder Entitäten. Abfragen lesen Zustand, mutieren aber nicht.
Während CQRS kein domänengesteuertes Design erfordert, unterscheidet dies jedoch zwischen Befehlen und Abfragen mit dem Konzept einer aggregierten Wurzel. Die Idee ist, dass ein bestimmtes Aggregat -Root eine Methode hat, die einem Befehl entspricht, und ein Befehlshandler ruft die Methode auf der Aggregat -Wurzel auf.
Die Aggregat -Root ist für die Durchführung der Logik des Betriebs und die Erbringung einer Reihe von Ereignissen, eine Fehlerantwort oder nur einen eigenen Zustand, der in einen Datenspeicher geschrieben werden kann, verantwortlich. Der Befehlshandler macht Infrastrukturbedenken im Zusammenhang mit der Speicherung des Zustands des Aggregats Root und der Erstellung der erforderlichen Kontexte (z. B. Transaktionen).
Ereignisbeschaffung
Ereignisbeschaffung ist ein architektonisches Muster, bei dem Entitäten ihren internen Zustand nicht durch direkte Serialisierung oder Objektrelationskartierung verfolgen, sondern durch Lesen und Festlegen von Ereignissen zu einem Event Store.
Wenn die Beschaffung von Ereignissen mit CQRS und domänenorientiertes Design sind aggregierte Wurzeln für die Validierung und Anwendung von Befehlen (häufig durch Aufrufen ihrer Instanzmethoden aus einem Befehlshandler) und dann für die Veröffentlichung von Ereignissen verantwortlich. Dies ist auch die Grundlage, auf der die aggregierten Wurzeln ihre Logik für den Umgang mit Methodenaufrufen basieren. Daher ist der Eingang ein Befehl und die Ausgabe ist eine oder viele Ereignisse, die in einem Event Store gespeichert und dann häufig in einem Message Broker für Interessierte veröffentlicht werden (wie z. Ansicht der Anwendung).
Modellierung der aggregierten Wurzeln zu Ausgabeereignis n-Tier Data-Passing-Architekturen. Ein wesentlicher Vorteil ist, dass axiomatische Theoremprover (z. B. Microsoft -Verträge und Schach[9]) sind leichter zu bewerben, da die aggregierte Wurzel ihren inneren Zustand umfassend verbirgt. Ereignisse werden häufig auf der Grundlage der Version der Aggregate Root -Instanz bestehen, die ein Domänenmodell ergibt, das in verteilten Systemen durch synchronisiert wird optimistische Parallelität.
Bemerkenswerte Werkzeuge
Obwohl domänengesteuerte Designs nicht von einem bestimmten Tool oder Rahmen abhängt, sind bemerkenswerte Beispiele:
- ActifSource, ein Plug-In für Finsternis Dies ermöglicht die Softwareentwicklung, die DDD mit kombiniert Modellgetriebene Engineering und Codegenerierung.
- CubicWeb, ein semantisches Open -Source -Web -Framework, das vollständig von einem Datenmodell angetrieben wird. Auf hohe Richtlinien können die Datenmodell nach Freigabe iterativ veröffentlicht werden. Das Definieren des Datenmodells reicht aus, um eine funktionierende Webanwendung zu erhalten. Weitere Arbeiten sind erforderlich, um zu definieren, wie die Daten angezeigt werden, wenn die Standardansichten nicht ausreichen.
- OpenMDX, eine Open-Source-Basis-MDA-Framework-Unterstützung Java se, Java ee, und .NETZ. OpenMDX unterscheidet sich von typischen MDA -Frameworks darin "Verwenden Sie Modelle, um das Laufzeitverhalten von Betriebssystemen direkt voranzutreiben".
- Erholte Objekte, ein Standard für die Zuordnung einer erholsamen API auf ein Domänenobjektmodell (bei dem die Domänenobjekte Entitäten, Ansichtsmodelle oder Dienste darstellen können). Zwei Open -Source -Frameworks (eine für Java, eine für .NET) können eine erholsame Objekt -API von einem Domänenmodell automatisch unter Verwendung der Reflexion erstellen.
Siehe auch
- Datennetz, eine domänenorientierte Datenarchitektur
- Ereignisstürmen
- Wissensrepräsentation
- Ontologie (Informationswissenschaft)
- Semantische Analyse (Wissensrepräsentation)
- Semantische Netzwerke
- Semantik
Verweise
- ^ Hirse, Scott; Tune, Nick (2015). Muster, Prinzipien und Praktiken des domänengesteuerten Designs. Indianapolis: Wrox. ISBN 978-1-118-71470-6.
- ^ Vernon, Vaughn (2013). Implementierung von domänengesteuertem Design. Upper Sadle River, NJ: Addison-Wesley. p. 3. ISBN 978-0-321-83457-7.
- ^ Domänengesteuerte Design.
- ^ Microsoft Application Architecture Guide, 2. Auflage. Abgerufen von http://msdn.microsoft.com/en-us/library/ee658117.aspx#domainmodelstyle.
- ^ a b Evans, Eric (2004). Domänengetriebenes Design: Komplexität im Herzen der Software angehen. Boston: Addison-Wesley. ISBN 978-032-112521-7. Abgerufen 2012-08-12.
- ^ Haywood, Dan (2009), Domänengetriebenes Design mit nackten Objekten, Pragmatische Programmierer.
- ^ MDE kann als Superset von MDA angesehen werden
- ^ Cabot, Jordi (2017-09-11). "Vergleich des domänengesteuerten Designs mit modellgetriebenem Engineering". Modellierungssprachen. Abgerufen 2021-08-05.
- ^ ein MS -Fehler -Finding -Tool
Externe Links
- Domänengesteuerte Design, Definitionen und Musterzusammenfassungen (PDF), Eric Evans, 2015
- Implementierung der aggregierten Wurzel in C# -Sprache
- Eine Einführung in das domänengesteuerte Design, Methoden & Tools