2010-04-15 5 views
5

Angenommen, wir entwickeln eine UserServiceImpl-Klasse, die CRUD-Operationen (Erstellen, Lesen, Aktualisieren und Löschen) ausführt. Aus meiner Sicht sind Erstellen, Lesen, Aktualisieren und Löschen vier Gründe für eine Änderung der Klasse. Verstößt diese Klasse gegen das Prinzip der einfachen Verantwortung? Wenn es verletzt, dann sollten wir vier Klassen wie CreateUserServiceImpl, ReadUserServiceImpl, UpdateUserServiceImpl und DeleteUserServiceImpl haben. Ist es nicht ein Overkill, viele Klassen zu haben?So wenden Sie das Prinzip der einfachen Verantwortlichkeit auf eine Serviceklasse an

Angenommen, ich definiere jeweils 4 Schnittstellen für Erstellen, Lesen, Aktualisieren und Löschen von Operationen und meine Serviceklasse implementiert alle vier Schnittstellen. Jetzt kann ich nur eine einzige Implementierungsklasse haben, aber indem ich ihre Schnittstellen getrennt habe, habe ich die Konzepte als weit entfernt, wie Rest der Anwendung betrifft. Ist das der richtige Weg oder sehen Sie einige Probleme drin?

Antwort

1

Es verstößt nicht gegen das Prinzip der einfachen Verantwortlichkeit, bis der Dienst für die Datendienste eines einzelnen Typs oder einer Geschäftsinformation verantwortlich ist.

4

Das ist, was ich über Muster und Prinzipien lieben - sie sind ein jeder bestehen Weg :-)

zustimmen, wie so viel über Software-Design anderer Meinung zu sein

würde meiner Ansicht nach die Klasse zu bauen, in welcher Weise auch immer es macht ein Nutzbare und leicht verständliche Klasse - abhängig von der Komplexität und dem Kontext, in dem die Klasse lebt. Mit einer einfachen Implementierung und einem einfachen Kontext wird eine einzelne Klasse funktionieren. Man könnte sagen, dass es sich an die SRP hält, weil es die Verantwortung für die Verwaltung der CRUD-Operationen ist. Wenn die Implementierung jedoch komplex ist oder viel gemeinsam genutzten Code zur Verfügung steht, der für die Platzierung in einer abstrakten Elternklasse geeignet wäre, sind vielleicht vier separate Klassen für jede CRUD-Operation sinnvoller. Es geht darum, wie du es ansiehst.

Muster und Prinzipien sind großartige Dinge, aber falsch verwendet können sie ein einfaches Problem genauso komplex wie nicht haben.

+0

Danke für die Antwort. Ich habe die Frage aktualisiert. Ist das Design jetzt besser? – Shekhar

2

Aus meiner Sicht Create, Read, Update und Delete sind vier Gründe für eine Klasse zu ändern.

Warum? Wenn ich eine Stack Klasse habe, sind Push und Pop Gründe für die Klasse zu ändern?

Ich glaube nicht. Dies sind zwei Standardoperationen, die Leute mit einem Stack machen. Das gleiche wie bei CRUD ist eine einfache, etablierte, wohlbekannte Menge von Operationen über einen Datenspeicher.

Jetzt ist Ihre zugrunde liegende Speichertechnologie selbst ein Grund für Ihre Klasse zu ändern. Das heißt, wenn Ihre CRUD-Implementierung fest codiert ist, nur mit einer bestimmten Instanz einer MS SQL 6.0-Datenbank zu arbeiten, dann verletzen Sie SRP und die Klasse wird nicht einfach wiederverwendbar oder erweiterbar sein.

In Bezug auf 4 Schnittstellen, das ist näher an einem anderen SOLID-Prinzip, ISP, und die Notwendigkeit hier wird durch die Muster der Nutzung Ihres Datenspeichers bestimmt. Wenn beispielsweise einige Klassen nur aus dem Datenspeicher lesen müssen, ist es sinnvoll, eine Schnittstelle nur mit der Read-Methode zu extrahieren und diese Schnittstelle als Argument für solche Methoden anzufordern. Indem Sie diese Schnittstelle trennen, können Sie später eine separate Implementierung vornehmen.Wer weiß, vielleicht können Sie für schreibgeschützte Clients eine bessere optimierte Abfrage oder einen Speichercache verwenden, aber wenn nicht, können Sie ihnen einfach die Instanz Ihres Standarddatenspeichers übergeben, der diese Schnittstelle implementiert.

Verwandte Themen