Saltar a contenido

OCP - Principio de Abierto/Cerrado

Principio de Abierto/Cerrado -- (Open/Closed Principle) OCP :

La definición del principio abierto/cerrado:

El Principio Abierto/Cerrado (OCP) fue formulado por Bertrand Meyer en 1988 y establece:

Una entidad de software debe estar abierta a extensiones, pero al mismo tiempo cerrada a modificaciones.

Entidad de software: Esto significa una clase, bloque de función, módulo, método, servicio, etc...

Abierto: el comportamiento de los módulos de software debe ser extensible.

Cerrado: la capacidad de expansión no debe lograrse cambiando el software existente.

Cuando Bertrand Meyer definió el Principio Abierto/Cerrado (OCP) a fines de la década de 1980, la atención se centró en el lenguaje de programación C++. Usaba herencia, bien conocida en el mundo orientado a objetos. La disciplina de la orientación a objetos, que aún era joven en ese momento, prometía grandes mejoras en la reutilización y la mantenibilidad al permitir que clases concretas se usaran como clases base para nuevas clases.

Cuando Robert C. Martin se hizo cargo del principio de Bertrand Meyer en la década de 1990, lo implementó técnicamente de manera diferente. C ++ permite el uso de herencia múltiple, mientras que la herencia múltiple rara vez se encuentra en los lenguajes de programación más nuevos. Por este motivo, Robert C. Martin se centró en el uso de interfaces. Se puede encontrar más información al respecto en el libro (enlace publicitario de Amazon *) Arquitectura limpia: el manual práctico para el diseño de software profesional.

Resumen:

Sin embargo, adherirse al principio abierto/cerrado (OCP) conlleva el riesgo de un exceso de ingeniería. La opción de extensiones solo debe implementarse donde sea específicamente necesario. El software no puede diseñarse de tal manera que todas las extensiones imaginables puedan implementarse sin realizar ajustes en el código fuente.

Ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FUNCTION_BLOCK Vehiculo
VAR_INPUT
    velocidad : REAL;
END_VAR

// método para obtener la velocidad
getVelocidad() : REAL;
END_FUNCTION_BLOCK

FUNCTION_BLOCK Coche EXTENDS Vehiculo // extiende la función Vehiculo
VAR_INPUT
    velocidadMaxima : REAL;
END_VAR

// método para obtener la velocidad máxima
getVelocidadMaxima() : REAL;
END_FUNCTION_BLOCK

FUNCTION_BLOCK Moto EXTENDS Vehiculo // extiende la función Vehiculo
VAR_INPUT
    aceleracion : REAL;
END_VAR

// método para obtener la aceleración
getAceleracion() : REAL;
END_FUNCTION_BLOCK
SOLID_OCP

De esta manera, la clase "Vehiculo" está cerrada para modificaciones directas y abierta para extensiones a través de las nuevas clases "Coche" y "Moto". Cada nueva clase agrega funcionalidades específicas sin modificar directamente la clase original.