Ich schreibe viel Code, der drei grundlegende Schritte umfasst.
- Holen Sie sich Daten von irgendwoher.
- Transformiere diese Daten.
- Legen Sie diese Daten irgendwo ab.
Normalerweise verwende ich drei Arten von Klassen - inspiriert von ihren jeweiligen Designmustern.
- Fabriken - um ein Objekt aus einer Ressource zu erstellen.
- Mediatoren - Um die Fabrik zu nutzen, führen Sie die Transformation durch und verwenden Sie dann den Kommandanten.
- Kommandanten - um diese Daten woanders abzulegen.
Meine Klassen sind in der Regel recht klein, oft eine einzelne (öffentliche) Methode, z. B. Daten abrufen, Daten transformieren, arbeiten, Daten speichern. Dies führt zu einer Zunahme der Klassen, funktioniert aber im Allgemeinen gut.
Wenn ich zum Testen komme, habe ich Probleme damit, eng gekoppelte Tests durchzuführen. Beispielsweise;
- Factory - Liest Dateien von der Festplatte.
- Commander - schreibt Dateien auf die Festplatte.
Ich kann nicht eins ohne das andere testen. Ich könnte zusätzlichen 'Test'-Code schreiben, um auch das Lesen / Schreiben der Festplatte durchzuführen, aber dann wiederhole ich mich.
Mit Blick auf .Net verfolgt die File- Klasse einen anderen Ansatz. Sie kombiniert die Verantwortlichkeiten (meiner) Fabrik und des Kommandanten miteinander. Es verfügt über Funktionen zum Erstellen, Löschen, Vorhandensein und Lesen an einem Ort.
Sollte ich versuchen, dem Beispiel von .Net zu folgen und - insbesondere im Umgang mit externen Ressourcen - meine Klassen zusammen zu kombinieren? Der Code ist immer noch gekoppelt, aber eher beabsichtigt - er geschieht eher bei der ursprünglichen Implementierung als bei den Tests.
Ist mein Problem hier, dass ich das Prinzip der Einzelverantwortung etwas übereifrig angewendet habe? Ich habe separate Klassen, die für Lesen und Schreiben verantwortlich sind. Wenn ich eine kombinierte Klasse haben könnte, die für den Umgang mit einer bestimmten Ressource verantwortlich ist, z. B. einer Systemfestplatte.
Looking at .Net, the File class takes a different approach, it combines the responsibilities (of my) factory and commander together. It has functions for Create, Delete, Exists, and Read all in one place.
- Beachten Sie, dass Sie "Verantwortung" mit "zu tun" verbinden. Eine Verantwortung ist eher ein "Problembereich". Die Dateiklasse ist dafür verantwortlich , Dateivorgänge auszuführen.
File
Bibliothek von C # ist, File
soweit wir wissen, dass die Klasse nur eine Fassade sein kann, die alle Dateioperationen an einem einzigen Ort - in der Klasse - platziert, aber intern ähnliche Lese- / Schreibklassen wie Ihre verwendet enthalten tatsächlich die kompliziertere Logik für die Dateiverwaltung. Eine solche Klasse (the File
) würde immer noch die SRP einhalten, da der Prozess der tatsächlichen Arbeit mit dem Dateisystem hinter einer anderen Ebene abstrahiert würde - höchstwahrscheinlich mit einer einheitlichen Schnittstelle. Nicht zu sagen, dass es der Fall ist, aber es könnte sein. :)