Für mich orientiere ich mich an der Eric Evans-Definition,service
die ungefähr so aussieht:
Im Allgemeinen haben in einem gut konzipierten System die meisten Klassen (im Domänenmodell) eine klare Verantwortung oder Funktion, da sie sich mit einer bestimmten Entität oder einer Gruppe von Entitäten im Modell befassen.
dh
- Account, Account Factory, Account Repository usw
- Kunde, Kunden Fabrik, Kunden Repository, etc.
Wenn Sie Funktionen haben, die nicht zu einer bestimmten Entität gehören, kann es schwierig sein, einen korrekten Sitzplatz zu finden. Das heißt, etwas, das einen Prozess einschließt, der ein Account
UND einschließt Customer
.
Hier service
kommt a ins Spiel. Hier setzen Sie Code ein, der sich im Domänenmodell befindet, aber natürlich nicht zu einer Entität / Komponente oder einer anderen gehört.
Ich stelle mir helper
eine Art Strategieklasse vor. Für mich ist es ein Ort, an dem Code abgelegt werden kann, der von verschiedenen Klassen wiederverwendet werden muss, aber möglicherweise nicht als abstrakte Methode in die Hierarchie der Klassen passt, die ihn verwenden. Persönlich finde ich den Begriff helper
etwas vage und habe ihn nicht wirklich in meinem Modell. Obwohl sie in Bibliotheken existieren, die ich benutze.
Serviceklasse: Enthält Geschäftslogik.
Hilfsklasse: Diese Klasse ist eine Art wiederverwendbarer Komponenten.
quelle
Sie haben zwei nicht verwandte Prinzipien verwechselt. Dienste und Helferklassen sind nicht verbunden. Insbesondere der Begriff "Service-Klasse" ist irreführend - ich denke, Sie meinen einen "Service", der sich auf einer höheren Abstraktionsebene als Klassen befindet. Ein Service ist gekennzeichnet durch
Diese Definition ändert sich je nach Kontext geringfügig. Entscheidend ist jedoch, dass sich der Begriff "Service" auf einer abstrakten Ebene befindet , der Ebene der Architektur und des Domänenwissens . Die "Helper-Klasse" ist ein Entwurfsmuster (auch wenn es ein Anti-Muster ist, da es sich tendenziell zu Blobs oder God-Klassen entwickelt), das sich auf eine Klasse bezieht, die generische Operationen einschließt (beachten Sie, dass sich diese auf einer niedrigeren Abstraktionsebene befindet und verbunden ist zum Anwendungs- / Lösungswissen ). Mir ist bewusst, dass es so gut wie keine Software gibt, die keine Hilfsklasse enthält, aber es ist trotzdem eine schlechte Praxis.
quelle
Eine Sache, vor der man aufpassen sollte, ist die mehrfache Definition von 'Service' in DDD:
Anwendungsservice: Diese befinden sich in der Anwendungsschicht und kommunizieren mit der Domänen- und Datenschicht. Sie sind die Schnittstelle, über die externe Systeme / Benutzeroberflächen mit dem DDD-System interagieren.
Domänendienst: Dieser Dienst kann von der Domäne oder der Anwendungsebene verwendet werden und Geschäftslogik enthalten, die nicht genau in eine bestimmte Entität passt.
Infrastrukturdienst: Diese werden von der Domäne für die Kommunikation mit externen Ressourcen verwendet.
Hilfsklassen enthalten in der Regel Codeteile oder Algorithmen, die von mehreren Entitäten wiederverwendet werden. Sie können also nicht in Entitäten einsteigen, ohne das DRY-Prinzip zu verletzen. Sie sind wahrscheinlich den Domänendiensten am nächsten, da sie denselben Zweck erfüllen (Auslagerung von Geschäftslogik aus Entitäten), dies jedoch aus unterschiedlichen Gründen.
quelle