Principio de abierto/cerrado
# Principio de abierto/cerrado

Dentro de la programación orientada a objetos, el principio de abierto/cerrado u OCP (siglas del inglés Open/Closed Principle) establece que «una entidad de software (clase, módulo, función, etc.) debe quedarse abierta para su extensión, pero cerrada para su modificación». Es decir, se debe poder extender el comportamiento de tal entidad pero sin modificar su código fuente.

La denominación abierto/cerrado ha sido utilizada de dos maneras: ambas se basan en la herencia para resolver el aparente dilema, pero sus objetivos, técnicas y resultados son diferentes.

## El principio de abierto/cerrado de Meyer

Se considera que Bertrand Meyer fue quien utilizó por primera vez la expresión principio de abierto/cerrado en su obra Object-Oriented Software Construction, de 1988.

* Se dice que un módulo está abierto si se puede extender. Por ejemplo, se deberían poder añadir campos a la estructura de datos que contiene dicho módulo o nuevas funcionalidades a su comportamiento.
* Se dice que un módulo queda cerrado si queda utilizable para otros módulos. Esto implica que dicho módulo goza de una descripción estable y bien definida (implicando a su interfaz pública, en el sentido de protección de la información).

En la época en que Meyer escribió esto, añadir campos o funciones a una librería implicaba, inevitablemente, tener que modificar todos los programas clientes de esa librería. La solución propuesta por Meyer descansaba en el concepto de herencia de la orientación a objetos (específicamente herencia de implementación):

   Una clase está cerrada, dado que puede ser compilada, almacenada en una librería y usada por otras clases de cliente. Pero también está abierta, dado que a partir de ella podríamos crear nuevas subclases que incorporaran características nuevas. Y al crear una subclase, no hay ninguna necesidad de modificar las clases cliente de la superclase.

## Principio de abierto/cerrado polimórfico

Durante los años noventa, el principio de abierto/cerrado se redefinió popularmente para referirse al uso de interfaces abstractas, en las que las implementaciones podían cambiar, incluso podría haber múltiples implementaciones y ser polimórficamente sustituidas unas por otras.

A diferencia de la acepción de Meyer, esta nueva definición defiende la herencia a partir de clases abstractas. Se pueden reutilizar especificaciones de interfaz mediante herencia pero no es necesario que exista una implementación. La interfaz existente queda cerrada a posibles modificaciones y las nuevas implementaciones deben implementar, como mínimo, esta interfaz.

El artículo de Robert C. Martin de 1996 «El principio de abierto/cerrado» fue uno de los textos primordiales que seguían este enfoque. En 2001, Craig Larman relacionó el principio de abierto/cerrado con el patrón de Alistair Cockburn, denominado Variaciones Protegidas, y con la discusión de David Parnas sobre ocultación de la información.

