Frage

Im Folgenden Video, Der Autor nimmt eine bestehende Klasse an und weist ihm das Prinzip der einzelnen Verantwortung zu. Er nimmt eine Druckklasse mit, die den Bericht zugreift, den Bericht formatiert und gedruckt hat. Er bricht jede Methode in ihre eigene Klasse aus, sodass er eine DatenAccess -Klasse erstellt, um den Datenzugriff zu verarbeiten, erstellt eine ReportFormatter -Klasse, um die Formatierung des Berichts zu verarbeiten, und er erstellt eine Berichts -Printer -Klasse, um den Druck des Berichts zu verarbeiten. In der ursprünglichen Berichtsklasse wird dann eine Methode gedruckt, print (), die den Klassenmethode des ReportPRINTER aufruft. DataAccess und ReportFormatter scheinen Verantwortung zu haben, aber ReportPRINTER ist auf DataAcess und ReportFormatter angewiesen. Brechen Sie dies also nicht die SRP oder verstehe ich ihn falsch?

War es hilfreich?

Lösung

Das Prinzip der einzelnen Verantwortung zeigt, dass eine bestimmte Klasse eine einzige Verantwortung (oder „Grund zur Änderung“) haben sollte. Es zeigt an und für sich nicht an, wie diese Verantwortung zufrieden sein soll. Dies kann und oft die Zusammenarbeit mehrerer anderer Klassen als Mitarbeiter erfordern.

Andere Tipps

Ohne das Video zu sehen, klingt es nach einem vernünftigen Design. SRP ist nicht unterbrochen, da Methoden, die sich mit dem Datenzugriff befassen, nicht in der Berichtspartnerklasse angezeigt werden, sondern nur das Konzept, dass "ich etwas aufrufen kann, um die gewünschten Daten zu erhalten."

Sie können es etwas weiter vorantreiben und eine Koordinatorklasse nur für die Koordinierung der Aktivitäten der Datenzugriffsklasse, der Formatierklasse und der Druckerklasse verantwortlich machen. Sie können die Objekte auch auf unterschiedliche Weise anordnen, z. B. das Senden des Koordinators Daten an den Formatierer, der sie an den Drucker sendet, und der Koordinator weiß nicht (direkt) über den Drucker.

Es muss etwas über die Koordinierung der Bemühungen der eng angeregten Objekte wissen. Das wird zu ihrer Verantwortung. Es ist in Ordnung, über die Idee oder das Konzept dessen zu wissen, was die anderen Objekte tun werden, solange Sie nicht wissen oder sich darum kümmern wie Sie machen es. Das Betrachten von Schnittstellen als "Verantwortungsnähte" ist ein guter Anfang.

Es kann auch hilfreich sein, wenn Sie Objekte als Daten aneinander übergeben, anstatt Dinge zu tun. Daher gibt die ReportFormatter ein neues Objekt zurück (oder leitet) ein neues Objekt, das einen formatierten Bericht darstellt, anstatt (konzeptionell) Objekte in einem vorhandenen Bericht auszuführen.

SRP adressiert keine Abhängigkeiten. Wenn Sie die Klasse in die Klassen mit einer Verantwortung in die Klassen verantwortlich machen, werden diese Abhängigkeiten später das Brechen von diesen Abhängigkeiten erleichtern. SRP befasst sich mit einem der beiden gemeinsamen Prinzipien: Zusammenhalt und Kopplung. Bei SRP handelt es sich um einen hohen Zusammenhalt, und die Abhängigkeiten können auf eine hohe Kopplung hinweisen. Gute Designs haben einen hohen Zusammenhalt und eine geringe Kopplung. Manchmal können diese beiden Prinzipien uneins sein.

Nein, es brechen nicht srp.

Annehmen, dass

DataAccess implements IDataAccess    

ReportFormatter  implements IReportFormatter 

ReportPrinter implements IReportPrinter 

Ereignis allerdings ReportPrinter relies on DataAccess and ReportFormatter , jede Änderung des Vertragsvertrags von IDataAccess or IReportFormatter sollte durch implementiert werden von DataAccess and ReportFormatter beziehungsweise. ReportPrinter Sorgen Sie sich nicht um die Verantwortung Änderungen in diesen Klassen.

Du kannst haben Composition oder implementieren Vermittler Muster, um eine lockere Kopplung zwischen diesen drei Klassen bereitzustellen und Arbeit zu erledigen. Behalten coupling Teil weg von responsibility.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top