Soll ich die Berechnungslogik in eine Entität oder in die Business-Schicht einfügen?

15

Vor kurzem stellte sich mir die Frage, ob eine einfache Berechnung in die Ebene "Entity" gestellt werden soll oder ob die Entity rein sein soll, um nur die Rohdaten zu speichern und die Berechnungslogiken in der Business-Ebene zu belassen.

Meine Frage ist also, ob es sinnvoll ist, einfache Berechnungen in die Eigenschaften einer Entitätsklasse zu kapseln.

Kata
quelle

Antworten:

21

Dies hängt von der gewünschten Architektur ab.

  • Im domänengetriebenen Design würden Sie ein Domänenmodell erstellen , das sowohl Daten als auch Funktionen enthält.

Dies würde bedeuten, dass an Ordereine Eigenschaft (oder Methode) hat, die den Gesamtpreis der Bestellung basierend auf dem zurückgibt OrderLines. Sie Orderhätten auch eine Methode AddOrderItem(Product product, int amount)und Orderwürden prüfen, ob es OrderLinefür dieses spezielle Produkt bereits eine gibt .

In einem solchen Modell würden Sie auch Objekte haben, die keine realen Entitäten sind, z. B. Repositoryzum Zugreifen auf Daten oder Factoryzum Erstellen von Entitäten. Diese werden als Domänendienste bezeichnet. Eine Anwendungsschicht ist dafür verantwortlich, die Domänendienste aufzurufen (z. B. um eine Entität aus der Datenbank abzurufen), und führt dann Funktionen für die Entität aus. Der Application Layersollte so dünn wie möglich sein.

Dies ist ein schöner Artikel über DDD, in dem diese Konzepte ausführlicher erläutert werden.

  • Sie können auch ein anämisches Domänenmodell verwenden . Das bedeutet, dass Ihre Entitäten aus get / set-Eigenschaften bestehen und kein Verhalten enthalten. In einem solchen Entwurf enthält Ihr Business Layer das Verhalten, z. B. das Berechnen des OrderPreises und das Überprüfen auf Duplikate OrderLines.

Es gibt unterschiedliche Meinungen, ob ein anämisches Domänenmodell eine schlechte Sache ist. Persönlich bevorzuge ich ein echtes Domain-Modell.

Dieser Artikel beschreibt die Unterschiede zwischen einem anämischen und einem nicht anämischen Domänenmodell.

Wouter de Kort
quelle
Hallo Wouter, danke für die Antwort und die Links. Ich scheine mit der falschen Einstellung konfrontiert zu sein, dass bei Verwendung des anämischen Domänenmodells alle Geschäftslogiken (auch die sehr einfachen) in die Geschäftsschicht aufgenommen werden sollten. Dies erscheint in einigen Fällen unsinnig, in denen die Geschäftslogik wirklich nur vom Modell selbst abhängt. Beispielsweise wird eine Eigenschaft aus den vorhandenen Eigenschaften im Modell berechnet. Ich konnte keinen vernünftigen Grund finden, die Geschäftslogik, die vom Modell selbst abhängt, in die Geschäftsschicht einzubeziehen.
Wie kann man in einem anämischen Domänenmodell, da es sowohl Geschäftsklassen als auch Entitätsklassen gibt, Klassen richtig benennen, um Verwechslungen zu vermeiden? Schlagen Sie die Verwendung von Suffixen vor? Wenn ja, könnten Sie ein Beispiel nennen?
Kwadz
Was passiert bei DDD, wenn die Preisberechnungslogik kompliziert ist? Zum Beispiel basiert der Preis auf Standort (Steuer), Benutzerinformationen (Geburtsdatum, Mitgliedschaftsrabatt), Coupon, Kreditkarte (Kreditkarten-Sonderrabatt) usw. Wie können wir eine solche Logik in den OrderUnterricht einordnen?
Sher10ck
1
Ihr Bestellaggregat sollte alle Informationen enthalten, die für die Berechnung erforderlich sind. Aufgrund Ihrer Beschreibung sollte dies tatsächlich Teil des Aggregats sein. Wenn die Logik jedoch sehr komplex wird und Sie sie möglicherweise ändern müssen, übergebe ich den Rechner als Objekt an den Entity-Konstruktor und lasse die Entität den Rechner intern zum Festlegen des Preises verwenden.
Burzum
Anämisch ... die arme Domäne klingt, als ob sie an irgendeiner Krankheit leidet. Würdest du nicht lieber getrieben werden ?! Ja!
Matt Jenkins
1

Nun, Entity- und Business-Objekte sind die meiste Zeit fast identisch. Wenn Sie beispielsweise eine Produktklasse haben und eine Eigenschaft verfügbar machen möchten, die eine vorhandene Eigenschaft in der Produktklasse übernimmt, eine Berechnung durchführt und diese dann verfügbar macht. In diesem Sinne bleibt die Logik der Erstellung dieser Eigenschaft bei der Klasse.

Nun könnte die Frage auftauchen, wohin Ihre Business-Layer-Klasse passen soll. Ich bevorzuge die Verwendung von Business-Layer-Klassen, die eine gewisse Logik zur Bewältigung von Geschäftsproblemen aufweisen. In Ihrem Produktbeispiel könnte ein geschäftliches Problem darin bestehen, Geld mit einem Drittanbieter wie Paypal zu berechnen.

Ein wichtiger Punkt ist, dass eine Entität immer eine Identität hat, ein Geschäftsobjekt jedoch eine Entität ohne Identifikation ist. Zum Beispiel ist ein Produkt eine Einheit, aber Geld hätte keine Identität. 1000 verschiedene Geldinstanzen wären gleich.


quelle
Ja. Wenn die Geschäftslogik der Eigenschaft alle von den vorhandenen Eigenschaften desselben Modells abhängt, ist es besser, die Eigenschaft nur dem Modell hinzuzufügen. Dies würde dazu beitragen, das unnötige Paar mit der Geschäftsschicht für die berechneten Eigenschaften zu verlieren.