Entiendo la intención del principio abierto-cerrado. Está pensado para reducir el riesgo de romper algo que ya funciona y al mismo tiempo modificarlo, diciéndole que intente extender sin modificar.
Sin embargo, tuve algunos problemas para entender cómo se aplica este principio en la práctica. A mi entender, hay dos maneras de aplicarlo. Antes y después de un posible cambio:
-
Antes: programa a las abstracciones y 'predice el futuro' tanto como puedas. Por ejemplo, un método
drive(Car car)
tendrá que cambiar siMotorcycle
s se agregan al sistema en el futuro, por lo que probablemente viola la OCP. Pero el métododrive(MotorVehicle vehicle)
es menor. Es probable que tenga que cambiar en el futuro, por lo que se adhiere a OCP.Sin embargo, es bastante difícil predecir el futuro y saber en Avance qué cambios se van a realizar en el sistema.
-
Después: cuando se necesita un cambio, extienda una clase en lugar de modificarla código actual.
La práctica # 1 no es difícil de entender. Sin embargo, es la práctica número 2 que me cuesta entender cómo postular.
Por ejemplo (lo tomé de un video en YouTube): digamos que tenemos un método en una clase que acepta CreditCard
objects: makePayment(CraditCard card)
. Un día Voucher
s se agregan al sistema. Este método no los admite, por lo que tiene que ser modificado.
Al implementar el método en primer lugar, no pudimos predecir el futuro y el programa en términos más abstractos (por ejemplo, makePayment(Payment pay)
, por lo que ahora tenemos que cambiar el código existente.
La práctica n.º 2 dice que deberíamos agregar la funcionalidad extendiendo en lugar de modificar. ¿Qué significa eso? ¿Debería crear una subclase de la clase existente en lugar de simplemente cambiar su código existente? ¿Debería hacer algún tipo de envoltorio alrededor de él solo para evitar volver a escribir el código?
¿O el principio ni siquiera se refiere a 'cómo modificar / agregar correctamente la funcionalidad', sino a 'cómo evitar tener que hacer cambios en primer lugar (es decir, programar en abstracciones)?