Was ist ein "Domain-Modell"?

Hallo Habr.

Heute bin ich zum #school-Kanal in der russischsprachigen GoCommunity in Slack gegangen und habe dort einen interessanten Dialog gefunden . Dieser Dialog fĂŒhrte mich zu einigen Gedanken darĂŒber, wie meine Kollegen das Konzept des „DomĂ€nenmodells“ interpretieren.

Wie sich herausstellte, gibt es ziemlich viele falsche oder nicht ganz genaue und manchmal völlig ungenaue Interpretationen dieses Begriffs, was ihn wesentlich verzerrt. Um diesen Dialog herum wurde die Idee dieses Artikels geboren. Details unter dem Schnitt.

Frage zur Architektur.


Daher stellte der Entwickler in der Community die folgende Frage:
Sagen Sie mir, wie die Architektur korrekt ausgefĂŒhrt wird. Nehmen wir an, ich habe ein Tablet in der Datenbank erstellt, die Reformen gebeten, ein Modell fĂŒr mich zu generieren. Kann ich dieses Modell als DomĂ€nenmodell in meiner Anwendung verwenden oder ist es besser, ein eigenes DomĂ€nenmodell zu erstellen und einen Adapter zu erstellen, der mir genau mein DomĂ€nenmodell gibt es aus einem Reformmodell schaffen? “

Auf die ein anderer Programmierer folgende Antwort gab:
Am einfachsten ist die Architektur mit einem anĂ€mischen Modell. Dies ist der Fall, wenn das DB-Modell = DomĂ€nenmodell = API-Antwortmodell. Das Rich-Domain-Modell ist ein seltenes Tier und degeneriert normalerweise zu AnĂ€mien. Mit anĂ€misch ist eine DTO-Struktur gemeint. die ĂŒblichen Attribute (Felder) ohne Methoden. Die Logik degeneriert zu einer Reihe von Funktionen, die mit einem solchen dto arbeiten. Fowler betrachtet eine solche Architektur manchmal als Antimuster. Aber dann eine gute Microservice-Lösung usw.

Nachdem ich dies gelesen hatte, wurde mir plötzlich klar, warum die Organisation der GeschÀftslogikschicht so kontrovers diskutiert wird und warum viele Menschen AnsÀtze wie Clean Architecture usw. nicht in die Praxis umsetzen . Was bedeutet "Architektur mit einem anÀmischen Modell" ?

Wenn Sie versuchen, ein solches Konzept im Netzwerk zu finden, werden Sie es höchstwahrscheinlich nicht finden, da es keine solche Architektur gibt. Es gibt das Konzept von „AnemicDomainModel“ , und wenn wir uns demselben Fowler zuwenden, stellt sich heraus, dass dies nur ein prozeduraler Ansatz zum Erstellen einer Anwendungsarchitektur ist (Hallo Fortran, ALGOL, COBOL, BASIC, Pascal und C). Dies nennt der Autor der Antwort im Wesentlichen „Architektur mit einem anĂ€mischen Modell“ .

Das Domain-Modell.


Als nĂ€chstes stellt sich die nĂ€chste Frage: Ist das „anĂ€mische Modell“ im Wesentlichen ein Modell? Ich denke nicht, und deshalb.

Die Wahrheit ist, dass das DomĂ€nenmodell im Gegensatz zum „DB-Modell“ oder „API-Antwortmodell“ kein Datenmodell ist. Das DomĂ€nenmodell hat eine sehr spezifische Definition . DarĂŒber hinaus ist es falsch, das Datenbankmodell zu stören, bei dem es sich im Wesentlichen um ein Datenmodell handelt .

Wenn es um das DomÀnenmodell geht, ist dies genau das konzeptionelle Modell. Und dies ist die Gesamtheit der Konzepte des Themenbereichs und der Beziehungen zwischen ihnen (d. H. Die Gesamtheit von Verhalten und Daten). Im Allgemeinen ist das Hauptmerkmal, das ein Modell eines Themenbereichs von einem anderen unterscheidet, genau ein Satz von GeschÀftsregeln.

Ja, das konzeptionelle Modell kann mit Daten arbeiten, die in verschiedenen Formen dargestellt werden (Daten aus der Datenbank oder API-Antworten), aber das Wesentliche Ă€ndert sich nicht, das Verhalten ist von grĂ¶ĂŸter Bedeutung . Wir ĂŒbergeben die Eingabe an das Modell, um eine bestimmte Ausgabe zu erhalten. Dieses Ergebnis wird durch die Implementierung der GeschĂ€ftslogik innerhalb des Modells erzielt (dh durch Anwenden von GeschĂ€ftsregeln). Ich finde hier eine Analogie zu mathematischen Modellen und zur Modellierung technologischer Prozesse (Hallo Studentenjahre).

Was ist mit der Substitution von Konzepten behaftet?


Wenn Sie Datenstrukturen als „DomĂ€nenmodell“ bezeichnen , können Sie Konzepte ersetzen oder nicht ersetzen. Dies fĂŒhrt dazu, dass die GeschĂ€ftslogik hĂ€ufig in der gesamten Anwendung verteilt ist. TatsĂ€chlich ist das Modell des Themenbereichs in diesem Fall der sehr verschmierte Satz von Funktionen, die mit Datenstrukturen arbeiten.

Bei der Entwicklung mittlerer und großer Anwendungen fĂŒhrt ein MissverstĂ€ndnis oder eine Vermischung dieser Konzepte in der Regel bereits zu Beginn der Systementwicklung zu einer Reihe von Problemen und Fragen, ganz zu schweigen von der langfristigen UnterstĂŒtzung. Unter ihnen gibt es zum Beispiel hĂ€ufig gestellte Fragen wie:

  • "- Wo sollen die Daten validiert werden?"
  • "- Wie vermeide ich zyklische AbhĂ€ngigkeiten?"
  • "- Ist" diese "GeschĂ€ftslogik im Allgemeinen?"
  • "- Und wo bewahren wir die GeschĂ€ftslogik auf?"
  • usw.

Wenn Sie eine einfache CRUD haben, d. H. Im Wesentlichen eine Schnittstelle zur Datenbank, wird es höchstwahrscheinlich keine Probleme geben. Wenn Sie eine Bibliothek auf Infrastrukturebene schreiben (z. B. fĂŒr die Arbeit mit einem Netzwerk oder mit derselben Datenbank), sollten ebenfalls keine Probleme auftreten. Das liegt daran, dass es einen RFC gibt und alle „GeschĂ€ftsregeln“ seit langem klar sind und die Logik seit langem klar ist. Sie können ein einfaches prozedurales Programm schreiben, und alles wird sowieso gut.

Wenn wir auf die Tatsache zurĂŒckkommen, dass der Dialog ĂŒber Domain-Modelle in der Go-Community entstanden ist, wĂŒrde ich das sagen. Aufgrund der Tatsache, dass Go eine Multi-Paradigmen-Sprache ist und eine Reihe der erfolgreichsten OOP-Konzepte (Komposition, Schnittstellen) unterstĂŒtzt, sollten Sie diese beim Modellieren einer DomĂ€ne nicht ignorieren und Code ausschließlich in einem prozeduralen Stil schreiben, als ob Sie mit BASIC oder C arbeiten.

Bei korrekter Interpretation des Konzepts des „DomĂ€nenmodells“ wird deutlich, warum es hĂ€ufig ĂŒblich ist, GeschĂ€ftslogik in eine separate Ebene aufzuteilen. Es wird auch klar, wie Sie dieselbe Ebene auswĂ€hlen und Clean Architecture oder eine andere Variante davon implementieren können. Indem wir eine separate Ebene isolieren, erstellen wir im Wesentlichen eine Bibliothek, die das konzeptionelle Modell in Form von Programmcode implementiert. Infolgedessen wird die GeschĂ€ftslogik im Rahmen dieser Bibliothek gekapselt und nicht in der gesamten Anwendung verteilt (wie bei einem reinen prozeduralen Ansatz).

Das VerstĂ€ndnis dieser Konzepte erspart Ihnen natĂŒrlich keine Konstruktionsfehler, macht Sie nicht zu einem idealen Entwickler oder Systemarchitekten und bringt Ihnen nicht bei, beim ersten Mal alles richtig zu machen. Hier ist nicht nur Theorie wichtig, sondern auch Praxis. Sobald Sie jedoch die Konzepte richtig verstehen und die Definitionen interpretieren, werden viele Dinge fĂŒr Sie viel offensichtlicher und einfacher.

Zusammenfassend.


  • Es ist nicht korrekt, "Daten" als DomĂ€nenmodell zu bezeichnen.
  • Ein DomĂ€nenmodell ist ein konzeptionelles Modell, das sowohl Verhalten als auch Daten enthĂ€lt. Es kann in einer separaten Schicht eingekapselt oder in der gesamten Anwendung verteilt werden.
  • "Architektur mit einem anĂ€mischen Modell" ist nichts anderes als ein prozeduraler Ansatz zum Erstellen einer Anwendungsarchitektur, bei der das DomĂ€nenmodell ĂŒber die gesamte Anwendung verteilt ist

Achten Sie auf Definitionen, studieren Sie sie tiefer als nur diagonal zu lesen. Sehr oft sind wir faul und greifen nach Informationen in StĂŒcken, wonach es sicherlich zu Verzerrungen kommt. Vergessen Sie nicht, zurĂŒckzukommen und sich an Dinge zu erinnern, die Ihnen lange Zeit offensichtlich erscheinen, und beziehen Sie sich immer auf die Quellen und nennen Sie einen Spaten einen Spaten.

Gut zu allen! Vielen Dank fĂŒr Ihre Aufmerksamkeit.

PS. Gerne höre ich konstruktive Kritik sowie Ihre Vision von einem „Domain-Modell“. Verweise auf die Quelle sind willkommen.

UPD: Der Artikel ist kein Versuch, das Konzept des "DomĂ€nenmodells" frei zu interpretieren und eine mir bekannte Bedeutung in dieses Konzept einzufĂŒgen. Ich möchte dies vermitteln: Die Bedeutung dieses Konzepts ist seit langem investiert und wird in BĂŒchern und Artikeln ĂŒber ComputerScience ausfĂŒhrlich beschrieben. Der Artikel ist ein Versuch, Kollegen die Wichtigkeit der korrekten Wahrnehmung dieser Konzepte zu vermitteln, ohne ihre Bedeutung zu verzerren (dies ist wichtig, da Sie in der Praxis aussagekrĂ€ftigeren Code schreiben können).

UPD2: Ich bin kein Architekt eines Unternehmenstheoretikers. Ich bin der gleiche praktizierende Entwickler wie Sie. Ich schreibe jeden Tag Code und spreche ĂŒber diese Dinge, um meinen Code besser und die Kunden zufriedener zu machen. Wenn ich Ihrer Meinung nach die ursprĂŒngliche Bedeutung verzerrt habe, teilen Sie Links zur Quelle und geben Sie an, wo ich sie falsch platziert habe, damit ich sie beheben kann.

UPD3: Weil Viele interpretieren den Begriff „Themenbereich“ unterschiedlich. Ich gebe einige Beispiele fĂŒr Themenbereiche, damit keine Verwirrung und Substitution von Konzepten entsteht. Der Themenbereich hĂ€ngt immer davon ab, welches Problem Sie mit der Anwendungsentwicklung lösen:

  • Tickets buchen (wenn Sie Entwickler von Reservierungssystemen sind)
  • Banking (wenn Sie Entwickler von Bankanwendungen sind)
  • Betriebssysteme (Wenn Sie ein Entwickler sind OS-Entwickler)
  • Cloud-Infrastrukturmanagement (wenn Sie ein k8s-Entwickler sind)
  • Virtualisierung (Wenn Sie ein Docker-Entwickler sind)
  • LeistungsĂŒberwachung (Wenn Sie ein Prometheus / Grafana-Entwickler sind)

Source: https://habr.com/ru/post/de453906/


All Articles