Le principe ouvert-fermé (OCP) stipule qu'un objet doit être ouvert pour extension mais fermé pour modification. Je crois que je le comprends et l'utilise en conjonction avec SRP pour créer des classes qui ne font qu'une seule chose. Et, j'essaie de créer de nombreuses petites méthodes qui permettent d'extraire tous les contrôles de comportement dans des méthodes qui peuvent être étendues ou remplacées dans certaines sous-classes. Ainsi, je me retrouve avec des classes qui ont de nombreux points d'extension, que ce soit à travers: injection et composition de dépendances, événements, délégation, etc.
Considérez ce qui suit comme une classe simple et extensible:
class PaycheckCalculator {
// ...
protected decimal GetOvertimeFactor() { return 2.0M; }
}
Supposons maintenant, par exemple, que la OvertimeFactor
modification passe à 1.5. Étant donné que la classe ci-dessus a été conçue pour être étendue, je peux facilement sous-classer et renvoyer un autre OvertimeFactor
.
Mais ... en dépit du fait que la classe est conçue pour l'extension et adhère à l'OCP, je modifierai la méthode unique en question, plutôt que de sous-classer et de remplacer la méthode en question, puis de recâbler mes objets dans mon conteneur IoC.
En conséquence, j'ai violé une partie de ce que OCP tente d'accomplir. J'ai l'impression d'être juste paresseux parce que ce qui précède est un peu plus facile. Suis-je incompréhensible OCP? Dois-je vraiment faire quelque chose de différent? Tirez-vous parti des avantages de l'OCP différemment?
Mise à jour : sur la base des réponses, il semble que cet exemple artificiel soit médiocre pour un certain nombre de raisons différentes. L'objectif principal de l'exemple était de démontrer que la classe a été conçue pour être étendue en fournissant des méthodes qui, en cas de substitution, modifieraient le comportement des méthodes publiques sans qu'il soit nécessaire de modifier le code interne ou privé. Pourtant, j'ai certainement mal compris OCP.