2010-09-15 3 views
6

Ich habe eine Schnittstelle für die Client-Registrierung namens IRegistrationService. Dies enthält eine Methode namens Register und wird über die Klasse RegistrationService implementiert. Wenn ich Methoden zum Löschen, Aktualisieren, Abrufen zum Beispiel haben möchte, würde ich eine separate Schnittstelle für jede Aktion wie IDeletionService, IUpdateService, IRetrieveService erstellen oder einfach alle Methoden in IRegistrationService einfügen. Der Grund, warum ich das frage, ist, dass dies die SOLID-Prinzipien, vor allem das SRP-Prinzip, zu fragen scheinen.Wie granular bekomme ich mein Klassendesign, wenn ich versuche, den SOLID-Prinzipien zu folgen?

Antwort

2

Eine Möglichkeit, das Prinzip der einfachen Verantwortung zu formulieren, ist, dass eine Klasse nur einen Grund haben sollte, sich zu ändern. Das heißt nicht unbedingt, dass es nur eine Sache macht, sondern dass es sich nur um einen Verantwortungsbereich handelt.

Es ist also gut für Ihren Registrierungsdienst, alles über die Registrierung von Personen zu erfahren, und ich würde das Entfernen, Aktualisieren und Abrufen von Registrierungen darin einschließen. Wenn sich der Registrierungsprozess ändert (z. B. Sie entscheiden, dass alle neuen oder aktualisierten Benutzer eine E-Mail erhalten), ändert sich die Klasse. Die Implementierungsdetails, wie die Registrierungs-E-Mail gesendet wird, gehören jedoch nicht zu diesem Dienst - das wäre ein zweiter Grund, warum sich die Klasse ändert (z. B. wenn Sie wissen, dass Sie E-Mails über einen externen SMTP-Server anstatt lokal oder via senden möchten) SMS statt E-Mail usw.).

+1

Die Registrierung kapselt die Methoden RegisterUser, DeleteUser, UpdateUser ein. Wenn ich jedoch Benachrichtigungen per E-Mail oder SMS an Benutzer senden möchte, sollte ich wahrscheinlich eine andere Klasse namens UserNotifications haben, die Nachrichten behandelt. Habe ich Sie richtig verstanden? Die einzige Sache, die Sie gesagt haben, die mich immer noch davon abhält, ist, dass die Klasse nicht eine Sache macht, sie befasst sich mit einem Verantwortungsbereich. Was meinst du mit Sphäre? Hast du ein Beispiel? Danke – Xaisoft

+2

Die meisten SOLID-Prinzipien sind ziemlich konkret, aber die SRP ist etwas subjektiv. Die Meinungen von fähigen Entwicklern können sich darüber unterscheiden, was eine einzelne Verantwortlichkeit ausmacht, oder wie JacobM es ausdrückte, eine "Sphäre" der Verantwortung. Dennoch glaube ich, dass Ihr Verständnis basierend auf dem von Ihnen angegebenen UserNotifications-Beispiel korrekt ist. Vielleicht lässt sich die SRP am besten erklären, wenn man an einen klaren Verstoß denkt: Eine Klasse, die Methoden zur Registrierung von Kunden bietet, ihre Hypothekenzinsen berechnet und sie benachrichtigt, wenn sie bei einer Zahlung zu spät kommen, hätte mehrere Verantwortlichkeiten. –

+0

Einverstanden, dass die Definition eines Zuständigkeitsbereichs schwierig sein kann. Und stimmte zu, dass Benutzerbenachrichtigungen eine separate Klasse sein würden. Eine Möglichkeit, darüber nachzudenken, besteht darin, über die Art von Konversation nachzudenken, die Sie haben würden, wenn Sie herausfinden würden, wie eine Klasse funktionieren sollte. Sie haben eine Art von Konversation (wahrscheinlich mit Ihrem Client), um über Änderungen am Registrierungsprozess nachzudenken, und eine andere Konversation mit jemand anderem, um herauszufinden, welcher Datenbanktreiber zum Verbinden bei der Registrierung verwendet werden soll. Eine einzelne Klasse sollte nicht über diese beiden Dinge Bescheid wissen. –