Wikipedia sagt
"Software-Entitäten (Klassen, Module, Funktionen usw.) sollten zur Erweiterung geöffnet, zur Änderung jedoch geschlossen sein"
Das Wort Funktionen ist mir aufgefallen und ich frage mich jetzt, ob wir davon ausgehen können, dass das Erzeugen einer Überladung für eine Methode als Beispiel für das Open / Closed-Prinzip angesehen werden kann oder nicht.
Lassen Sie mich ein Beispiel erklären. Bedenken Sie, dass Ihre Service-Schicht eine Methode enthält, die an fast 1000 Stellen verwendet wird. Die Methode ruft userId ab und bestimmt, ob der Benutzer admin ist oder nicht:
bool IsAdmin(userId)
Bedenken Sie nun, dass es irgendwo erforderlich ist, zu bestimmen, ob der Benutzer admin ist oder nicht, basierend auf dem Benutzernamen und nicht der Benutzer-ID. Wenn wir die Signatur der oben genannten Methode ändern, ist der Code an 1000 Stellen fehlerhaft (Funktionen sollten für Änderungen gesperrt sein). Auf diese Weise können wir eine Überladung erstellen, um den Benutzernamen abzurufen, die Benutzer-ID basierend auf dem Benutzernamen und der ursprünglichen Methode zu ermitteln:
public bool IsAdmin(string username)
{
int userId = UserManager.GetUser(username).Id;
return IsAdmin(userId);
}
Auf diese Weise haben wir unsere Funktion erweitert, indem wir eine Überladung dafür erstellt haben (Funktionen sollten für Erweiterungen offen sein).
Ist es ein Beispiel für ein offenes / geschlossenes Prinzip?
quelle
Indem Sie Ihre Methode überladen, erweitern Sie die Funktionalität des vorhandenen Moduls und erfüllen so die neuen Anforderungen Ihrer Anwendung
Sie nehmen keine Änderungen an einer vorhandenen Methode vor, verstoßen also nicht gegen die zweite Regel.
Es würde mich interessieren, was andere dazu sagen, die ursprüngliche Methode nicht ändern zu dürfen. Ja, Sie können geeignete Zugriffsmodifikatoren festlegen und die Kapselung erzwingen. Was kann jedoch noch getan werden?
Ref: http://www.objectmentor.com/resources/articles/ocp.pdf
quelle
Das Open-Closed-Prinzip ist ein Ziel, ein Idealfall, nicht immer eine Realität. Insbesondere bei der Überarbeitung von altem Code ist der erste Schritt oft eine umfangreiche Änderung, um das OCP zu einer Möglichkeit zu machen. Die Wurzel des Prinzips ist, dass der Arbeitscode bereits funktioniert und das Ändern möglicherweise Fehler verursacht. Daher ist es das beste Szenario, vorhandenen Code nicht zu ändern, sondern nur neuen Code hinzuzufügen.
Angenommen, Sie hatten eine Funktion namens
BigContrivedMethod(int1, int2, string1)
.BigContrivedMethod
macht drei Dinge: Ding1, Ding2 und Ding3. Zu diesem Zeitpunkt ist die Wiederverwendung von BCM wahrscheinlich schwierig, da dies zu viel bewirkt. Refactoring es (wenn möglich) inContrivedFunction1(int)
,ContrivedFunction2(int)
undContrivedFunction3(string)
gibt Ihnen drei kleinere, fokussiertere Methoden, die Sie einfacher kombinieren können.Und das ist der Schlüssel zu OCP in Bezug auf Methoden / Funktionen: Zusammensetzung. Sie "erweitern" Funktionen, indem Sie sie von anderen Funktionen aufrufen.
Denken Sie daran, dass OCP Teil von 5 anderen Prinzipien ist, den SOLID-Richtlinien. Das erste ist der Schlüssel, Single Responsibility. Wenn alles in Ihrer Codebasis nur das tat, was es tun musste, müssten Sie niemals Code ändern. Sie müssen nur neuen Code hinzufügen oder alten Code auf neue Weise miteinander kombinieren. Da realer Code diese Richtlinie selten erfüllt, müssen Sie ihn häufig ändern, um SRP zu erhalten, bevor Sie OCP erhalten können.
quelle
Sie folgen dem Open-Closed-Prinzip, wenn Sie das Verhalten Ihres Programms ändern, indem Sie neuen Code schreiben, anstatt alten Code zu ändern.
Da es so gut wie unmöglich ist, Code zu schreiben, der für jede mögliche Änderung offen ist (und Sie nicht möchten, weil Sie eine Analyse-Lähmung eingeben), schreiben Sie Code, der auf alle unterschiedlichen Verhaltensweisen reagiert, an denen Sie gerade arbeiten, und nicht auf Änderungen.
Wenn Sie auf etwas stoßen, das Sie ändern müssen, anstatt einfach etwas zu ändern, um das neue Verhalten zuzulassen, finden Sie heraus, wo die Änderung stattfindet, und strukturieren Sie Ihr Programm neu, ohne das Verhalten zu ändern, sodass Sie dieses Verhalten dann durch Schreiben von NEUEM Code ändern können .
So trifft dies auf Ihren Fall zu:
Wenn Sie Ihrer Klasse neue Funktionen hinzufügen, ist Ihre Klasse nicht geöffnet / geschlossen, sondern die Clients der Funktion, die Sie überladen, sind.
Wenn Sie einfach neue Funktionen hinzufügen, die in Ihrer Klasse funktionieren, sind sowohl diese als auch die Clients Ihrer Funktion offen / geschlossen.
quelle