Este es probablemente el más sólido de los principios sólidos para explicar. Déjame intentarlo. Imagina que escribiste una clase de Factura que funciona perfectamente y no tiene errores. Hace un PDF de una factura.
Entonces alguien dice que quiere una factura HTML con enlaces. No cambia ningún código en Factura para satisfacer esta solicitud. En cambio, crea otra clase, HTMLInvoice, que hace lo que ahora quieren. Aprovecha la herencia para no tener que escribir mucho código duplicado en HTMLInvoice.
El código antiguo que usaba la antigua factura no está roto ni afectado de ninguna manera. El nuevo código puede usar HTMLInvoice. (Si también realiza la sustituibilidad de Liskov , la L de sólido, puede dar instancias HTMLInvoice al código existente que espera instancias de factura.) Todos viven felices para siempre.
La factura está cerrada a modificación, abierta a extensión. Y tiene que escribir la factura correctamente de antemano para que esto funcione, por cierto.
¿Has leído el artículo El principio abierto-cerrado de los amigos del tío Bob en ObjectMentor? Creo que es una de las mejores explicaciones por ahí.
fuente
La respuesta de Kate Gregory es muy buena, pero considere una situación diferente en la que un nuevo requisito puede satisfacerse con un cambio relativamente pequeño en la
Invoice
clase existente . Por ejemplo, supongamos que se debe agregar un nuevo campo al PDF de la factura. Según OCP, aún deberíamos crear una nueva subclase, incluso si el nuevo campo pudiera agregarse en la implementación existente cambiando algunas líneas de código.En mi opinión, OCP refleja la realidad de los años 80 y principios de los 90, donde los proyectos a menudo ni siquiera usaban el control de versiones, y mucho menos tenían pruebas de regresión automatizadas o el beneficio de sofisticadas herramientas de refactorización. OCP fue un intento de evitar el riesgo de romper el código que había sido probado manualmente y puesto en producción. Hoy, tenemos mejores formas de gestionar el riesgo de romper el software de trabajo (a saber, sistemas de control de versiones, TDD y pruebas automatizadas, y herramientas de refactorización).
fuente
Personalmente, creo que este principio debe tomarse con una pizca de sal. El código es orgánico, las empresas cambian y el código cambia según las necesidades de una empresa a medida que pasa el tiempo.
Me resulta muy difícil entender el hecho de que la abstracción es clave. ¿Qué pasa si la abstracción estaba originalmente equivocada? ¿Qué pasa si la función comercial ha cambiado significativamente?
Este principio esencialmente garantiza que las intenciones y el comportamiento ORIGINALES de un diseño nunca deben cambiar. Eso probablemente funcione para aquellos que tienen API públicas y sus clientes tienen problemas para mantenerse al día con las nuevas versiones y algunos otros casos extremos. Sin embargo, si una empresa posee TODO el código, entonces cuestiono este principio.
Tener una buena cobertura de prueba de su código debería facilitar la refactorización de su base de código. Significa que está bien equivocarse: sus pruebas ayudarán a guiarlo hacia un mejor diseño.
Dicho esto, si no hay pruebas, entonces este principio es sólido.
fuente