En la programación orientada a objetos , el principio abierto-cerrado (OCP) establece que " las entidades de software (clases, módulos, funciones, etc.) deben estar abiertas a la extensión, pero cerradas a la modificación "; [1] es decir, dicha entidad puede permitir que su comportamiento se extienda sin modificar su código fuente .
El nombre de principio abierto-cerrado se ha utilizado de dos maneras. En ambas se utilizan generalizaciones (por ejemplo, herencia o funciones delegadas) para resolver el aparente dilema, pero los objetivos, las técnicas y los resultados son diferentes.
El principio abierto-cerrado es uno de los cinco principios SOLID del diseño orientado a objetos.
A Bertrand Meyer se le atribuye generalmente la creación del término principio abierto-cerrado , [2] que apareció en su libro de 1988 Object-Oriented Software Construction . [1] : 23
- Se dirá que un módulo está abierto si todavía está disponible para extensiones. Por ejemplo, debería ser posible agregar campos a las estructuras de datos que contiene o nuevos elementos al conjunto de funciones que realiza.
- Se dice que un módulo está cerrado si está disponible para que lo utilicen otros módulos. Esto supone que se le ha dado una descripción bien definida y estable (la interfaz en el sentido de ocultación de información).
En el momento en que Meyer escribía, agregar campos o funciones a una biblioteca inevitablemente requería cambios en cualquier programa que dependiera de esa biblioteca. [ cita requerida ] La solución propuesta por Meyer para este problema se basaba en la noción de herencia orientada a objetos (específicamente, herencia de implementación ): [1] : 229
Una clase es cerrada, ya que puede ser compilada, almacenada en una biblioteca, basada en una línea base y utilizada por clases cliente. Pero también es abierta, ya que cualquier clase nueva puede utilizarla como clase padre, agregando nuevas características. Cuando se define una clase descendiente, no hay necesidad de cambiar la original ni de molestar a sus clientes.
Durante la década de 1990, el principio abierto-cerrado se redefinió popularmente para referirse al uso de interfaces abstractas , donde las implementaciones se pueden cambiar y se pueden crear múltiples implementaciones y sustituirlas polimórficamente entre sí.
A diferencia del uso de Meyer, esta definición aboga por la herencia de las clases base abstractas . Las especificaciones de interfaz se pueden reutilizar mediante herencia, pero no es necesario que lo hagan las implementaciones. La interfaz existente está cerrada a modificaciones y las nuevas implementaciones deben, como mínimo, implementar esa interfaz.
El artículo de 1996 de Robert C. Martin "El principio abierto-cerrado" [2] fue uno de los escritos fundamentales que adoptaron este enfoque. En 2001, Craig Larman relacionó el principio abierto-cerrado con el patrón de Alistair Cockburn llamado Variaciones protegidas y con el análisis de David Parnas sobre el ocultamiento de información . [3]