Estoy un poco confundido acerca de cómo se puede aplicar el principio de Open Closed en la vida real. Requisito en cualquier negocio cambia con el tiempo. De acuerdo con el principio Open-Closed, debe extender la clase modificando la clase existente. Para mí, cada vez que extender una clase no parece ser práctico para cumplir con el requisito. Permítanme dar un ejemplo con el sistema de reserva de trenes.
En el sistema de reserva de trenes habrá un objeto Boleto. Podría haber diferentes tipos de boletos Boleto regular, Boleto de concesión, etc. Boleto es clase abstracta y Boletos regulares y Boletos de concesión son clases concretas. Como todos los tickets tendrán el método PrintTicket que es común, por lo tanto, está escrito en Ticket, que es la clase abstracta base. Digamos que esto funcionó bien durante unos meses. Ahora entra un nuevo requisito, que establece cambiar el formato del ticket. Es posible que se agreguen algunos campos más en el ticket impreso o que se cambie el formato. Para cumplir este requisito, tengo las siguientes opciones
- Modifique el método PrintTicket () en la clase abstracta Ticket. Pero esto violará el principio de Abierto-Cerrado.
- Anule el método PrintTicket () en las clases secundarias, pero esto duplicará la lógica de impresión que es una violación del Principio DRY (No se repita).
Entonces las preguntas son
- ¿Cómo puedo satisfacer los requisitos comerciales anteriores sin violar el principio Abierto / Cerrado?
- ¿Cuándo se supone que la clase está cerrada por modificación? ¿Cuáles son los criterios para considerar que la clase está cerrada por modificación? Es después de la implementación inicial de la clase o puede ser después de la primera implementación en producción o puede ser otra cosa.