Unterschied zwischen einer Serviceklasse und einer Helferklasse [geschlossen]

61

Ich möchte wissen, was eine Service-Klasse von einer Utility-Klasse oder einer Helfer-Klasse unterscheidet. Eine Klasse, die nur zugrunde liegende Methoden aufruft, ist der Dao ein Dienst? Verstößt die Verwendung von Helper-Klassen nicht gegen SRP?

Tim und Struppi
quelle

Antworten:

74

Die Linien können ein wenig verschwommen sein, aber ich sehe es so:

  • Eine Service-Klasse / -Schnittstelle bietet einem Client die Möglichkeit, mit einigen Funktionen in der Anwendung zu interagieren. Dies ist in der Regel öffentlich und hat eine geschäftliche Bedeutung. Zum Beispiel kann eine TicketingServicemöglicherweise Schnittstelle , die Sie erlaubt buyTicket, sellTicketund so weiter.

  • Eine Helferklasse ist normalerweise für den Kunden unsichtbar und wird intern verwendet, um einige Kesselplattenarbeiten bereitzustellen, die keine Geschäftsdomänenbedeutung haben. Angenommen, Sie möchten ein Datum in einen Zeitstempel konvertieren, um es in Ihrem Datenspeicher zu speichern. Möglicherweise haben Sie eine Utility-Klasse, die DateConvertormit einer convertDateToTimestampMethode aufgerufen wird, die diese Verarbeitung durchführt.

Services sind nicht einfach eng an DAOs gekoppelt, sondern eher ein Begriffs- / Nutzungsmuster als die Persistenz

Helferklassen verletzen SRP nicht, wenn sie nach diesem Prinzip codiert sind. Das heißt, jede Methode sollte eine Sache und eine Sache gut machen, die Klasse sollte eine Art von Hilfsprogramm ausführen (z. B. Datumskonvertierung) und das auch.

Martijn Verburg
quelle
25

Keine wissenschaftliche Definition, aber meine allgemeine Annahme ist, dass eine Serviceklasse einen bestimmten Kontext in der Anwendung hat, während Helfer allgemeiner sind und es egal ist, welcher App sie helfen.

Wyatt Barnett
quelle
15

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 AccountUND einschließt Customer.

Hier servicekommt 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 helpereine 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 helperetwas vage und habe ihn nicht wirklich in meinem Modell. Obwohl sie in Bibliotheken existieren, die ich benutze.

JW01
quelle
1
Die oben erwähnte Definition von Eric Evan gilt speziell für einen Domänendienst. DDD bietet Domänendienste, Anwendungsdienste, Infrastrukturdienste und sogar Repositorys, die als Datenzugriffsdienste angesehen werden können.
Songo
12

Serviceklasse: Enthält Geschäftslogik.
Hilfsklasse: Diese Klasse ist eine Art wiederverwendbarer Komponenten.

Dhiral Pandya
quelle
5

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

"Ein Mechanismus, um den Zugriff auf eine oder mehrere Funktionen zu ermöglichen, bei dem der Zugriff über eine vorgeschriebene Schnittstelle erfolgt und im Einklang mit den in der Dienstbeschreibung angegebenen Einschränkungen und Richtlinien erfolgt."

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.

ins0m
quelle
4

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.

Paul T Davies
quelle