El principio abierto-cerrado (OCP) establece que un objeto debe estar abierto para la extensión pero cerrado para la modificación. Creo que lo entiendo y lo uso junto con SRP para crear clases que solo hacen una cosa. Y trato de crear muchos métodos pequeños que permitan extraer todos los controles de comportamiento en métodos que pueden ampliarse o anularse en alguna subclase. Por lo tanto, termino con clases que tienen muchos puntos de extensión, ya sea a través de: inyección de dependencia y composición, eventos, delegación, etc.
Considere la siguiente clase simple y extensible:
class PaycheckCalculator {
// ...
protected decimal GetOvertimeFactor() { return 2.0M; }
}
Ahora digamos, por ejemplo, que los OvertimeFactorcambios a 1.5. Como la clase anterior se diseñó para ampliarse, puedo subclasificar fácilmente y devolver una diferente OvertimeFactor.
Pero ... a pesar de que la clase está diseñada para la extensión y se adhiere a OCP, modificaré el método único en cuestión, en lugar de subclasificar y anular el método en cuestión y luego volver a cablear mis objetos en mi contenedor de IoC.
Como resultado, violé parte de lo que OCP intenta lograr. Parece que solo estoy siendo flojo porque lo anterior es un poco más fácil. ¿Estoy malentendido OCP? ¿Realmente debería estar haciendo algo diferente? ¿Aprovecha los beneficios de OCP de manera diferente?
Actualización : según las respuestas, parece que este ejemplo artificial es pobre por varias razones diferentes. La intención principal del ejemplo fue demostrar que la clase fue diseñada para extenderse al proporcionar métodos que, cuando se reemplazan, alterarían el comportamiento de los métodos públicos sin la necesidad de cambiar el código interno o privado. Aún así, definitivamente entendí mal el OCP.