Das Open-Closed-Prinzip (OCP) besagt, dass ein Objekt zur Erweiterung geöffnet, zur Änderung jedoch geschlossen sein sollte. Ich glaube, ich verstehe es und verwende es in Verbindung mit SRP, um Klassen zu erstellen, die nur eines tun. Und ich versuche, viele kleine Methoden zu erstellen, die es ermöglichen, alle Verhaltenssteuerelemente in Methoden zu extrahieren, die in einigen Unterklassen erweitert oder überschrieben werden können. So erhalte ich Klassen mit vielen Erweiterungspunkten, sei es durch: Abhängigkeitsinjektion und -zusammensetzung, Ereignisse, Delegierung usw.
Betrachten Sie Folgendes als einfache, erweiterbare Klasse:
class PaycheckCalculator {
// ...
protected decimal GetOvertimeFactor() { return 2.0M; }
}
Sagen wir nun zum Beispiel, dass sich die OvertimeFactor
Änderungen auf 1.5 ändern. Da die obige Klasse erweitert werden sollte, kann ich leicht eine andere Unterklasse erstellen und zurückgeben OvertimeFactor
.
Aber ... obwohl die Klasse für die Erweiterung und Einhaltung von OCP ausgelegt ist, werde ich die betreffende einzelne Methode ändern, anstatt die betreffende Methode zu unterklassifizieren und zu überschreiben und dann meine Objekte in meinem IoC-Container neu zu verkabeln.
Infolgedessen habe ich einen Teil dessen verletzt, was OCP zu erreichen versucht. Es fühlt sich an, als wäre ich nur faul, weil das oben genannte etwas einfacher ist. Verstehe ich OCP falsch? Sollte ich wirklich etwas anderes machen? Nutzen Sie die Vorteile von OCP anders?
Update : Basierend auf den Antworten sieht es so aus, als ob dieses erfundene Beispiel aus verschiedenen Gründen schlecht ist. Die Hauptabsicht des Beispiels bestand darin, zu demonstrieren, dass die Klasse so erweitert werden sollte, dass Methoden bereitgestellt werden, die beim Überschreiben das Verhalten öffentlicher Methoden ändern , ohne dass interner oder privater Code geändert werden muss. Trotzdem habe ich OCP definitiv falsch verstanden.