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 principio abierto-cerrado se ha utilizado de dos maneras. Ambas formas utilizan generalizaciones (por ejemplo, herencia o funciones delegadas) para resolver el aparente dilema, pero los objetivos, técnicas y resultados son diferentes.
El principio abierto-cerrado es uno de los cinco principios SÓLIDOS del diseño orientado a objetos.
A Bertrand Meyer se le atribuye generalmente el mérito de haber originado el término principio abierto-cerrado , [2] que apareció en su libro de 1988 Construcción de software orientada a objetos . [1] : 23
- Se dirá que un módulo está abierto si todavía está disponible para su extensión. 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 dirá que un módulo está cerrado si está disponible para que lo utilicen otros módulos. Esto supone que al módulo se le ha dado una descripción estable y bien definida (la interfaz en el sentido de ocultar información).
En el momento en que Meyer estaba escribiendo, agregar campos o funciones a una biblioteca inevitablemente requería cambios en cualquier programa que dependiera de esa biblioteca. [ cita necesaria ] La solución propuesta por Meyer a este problema se basó en la noción de herencia orientada a objetos (específicamente herencia de implementación ): [1] : 229
Una clase está cerrada, ya que puede ser compilada, almacenada en una biblioteca, baselineada y utilizada por clases cliente. Pero también es abierto, ya que cualquier clase nueva puede usarlo como padre, agregando nuevas características. Cuando se define una clase descendiente, no es necesario cambiar la original ni 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í.
En contraste con el uso de Meyer, esta definición aboga por la herencia de clases base abstractas . Las especificaciones de interfaz se pueden reutilizar mediante herencia, pero no es necesario que la implementación lo sea. La interfaz existente está cerrada a modificaciones y las nuevas implementaciones deben, como mínimo, implementar esa interfaz.
El artículo de Robert C. Martin de 1996 "El principio abierto-cerrado" [2] fue uno de los escritos fundamentales en adoptar este enfoque. En 2001, Craig Larman relacionó el principio abierto-cerrado con el patrón de Alistair Cockburn llamado Variaciones protegidas , y con la discusión de David Parnas sobre el ocultamiento de información . [3]