Angenommen, Sie haben eine Anwendung mit einer weit verbreiteten Klasse namens User
. Diese Klasse enthüllt alle Informationen über den Benutzer, seine ID, seinen Namen, die Zugriffsebenen auf die einzelnen Module, die Zeitzone usw.
Die Benutzerdaten sind natürlich systemweit referenziert, aber aus welchem Grund auch immer, das System ist so eingerichtet, dass wir nicht dieses Benutzerobjekt in davon abhängige Klassen übergeben, sondern nur einzelne Eigenschaften davon übergeben.
Eine Klasse, die die Benutzer-ID benötigt, benötigt einfach die GUID userId
als Parameter. Manchmal benötigen wir auch den Benutzernamen, damit dieser als separater Parameter übergeben wird. In einigen Fällen wird dies an einzelne Methoden übergeben, sodass die Werte überhaupt nicht auf Klassenebene gespeichert werden.
Jedes Mal, wenn ich Zugriff auf eine andere Information aus der Benutzerklasse benötige, muss ich Änderungen vornehmen, indem ich Parameter hinzufüge. Wenn das Hinzufügen einer neuen Überladung nicht angemessen ist, muss ich auch jeden Verweis auf die Methode oder den Klassenkonstruktor ändern.
Der Benutzer ist nur ein Beispiel. Dies ist in unserem Code weit verbreitet.
Habe ich Recht, wenn ich denke, dass dies eine Verletzung des Open / Closed-Prinzips ist? Nicht nur die Änderung bestehender Klassen, sondern deren Einrichtung, sodass in Zukunft mit großer Wahrscheinlichkeit umfassende Änderungen erforderlich sein werden?
Wenn wir das User
Objekt nur übergeben , könnte ich eine kleine Änderung an der Klasse vornehmen, mit der ich arbeite. Wenn ich einen Parameter hinzufügen muss, muss ich möglicherweise Dutzende von Änderungen an Verweisen auf die Klasse vornehmen.
Werden andere Prinzipien durch diese Praxis verletzt? Abhängigkeitsinversion vielleicht? Obwohl wir nicht auf eine Abstraktion verweisen, gibt es nur einen Benutzertyp, so dass keine echte Benutzeroberfläche erforderlich ist.
Werden andere nicht-SOLID-Prinzipien verletzt, wie z. B. grundlegende defensive Programmierungsprinzipien?
Sollte mein Konstruktor so aussehen:
MyConstructor(GUID userid, String username)
Oder dieses:
MyConstructor(User theUser)
Hat es geposted:
Es wurde vorgeschlagen, die Frage unter "Pass ID oder Objekt?" Zu beantworten. Dies beantwortet nicht die Frage, inwiefern die Entscheidung für einen der beiden Wege einen Versuch beeinflusst, den SOLID-Grundsätzen zu folgen, die im Mittelpunkt dieser Frage stehen.
I
in SOLID
? MyConstructor
Grundsätzlich sagt jetzt "Ich brauche ein Guid
und ein string
". Warum also nicht eine Schnittstelle haben, die a Guid
und a bereitstellt, diese Schnittstelle implementieren und von einer Instanz abhängen string
lassen, User
die diese Schnittstelle MyConstructor
implementiert? Und wenn sich die Anforderungen MyConstructor
ändern, ändern Sie die Benutzeroberfläche. - Es hat mir sehr geholfen, über Schnittstellen nachzudenken, die eher dem Verbraucher als dem Anbieter "gehören" . Denken Sie also: "Als Verbraucher brauche ich etwas, das dies und das tut", anstatt "als Anbieter kann ich dies und das tun".