Open/Close
El principio de abierto/cerrado (OCP) es otro de los cinco principios SOLID de la programación orientada a objetos. Establece que las clases deben ser abiertas para la extensión, pero cerradas para la modificación.
En otras palabras, las clases deben diseñarse de forma que permitan añadir nuevas funcionalidades sin necesidad de modificar el código existente.
Este principio tiene varias ventajas, entre ellas:
- Mejora la mantenibilidad: Si una clase es cerrada para la modificación, es más fácil realizar cambios en el código existente sin introducir errores.
- Mejora la reusabilidad: Las clases que cumplen el principio OCP son más fáciles de reutilizar en otros contextos.
- Mejora la flexibilidad: Las clases que cumplen el principio OCP son más fáciles de modificar para adaptarse a nuevos requisitos.
Ejemplo 1:
public class Figura {
public abstract double CalcularArea();
}
public class Cuadrado : Figura {
private double lado;
public Cuadrado(double lado) {
this.lado = lado;
}
public override double CalcularArea() {
return lado * lado;
}
}
public class Circulo : Figura {
private double radio;
public Circulo(double radio) {
this.radio = radio;
}
public override double CalcularArea() {
return Math.PI * Math.pow(radio, 2);
}
}
En este ejemplo, la clase Figura
es abierta para la extensión, ya que permite que se creen nuevas clases que hereden de ella. La clase Cuadrado
y la clase Circulo
son ejemplos de clases que extienden de Figura
.
La clase Figura
es cerrada para la modificación, ya que no se requiere modificar su código para añadir nuevas funcionalidades. Por ejemplo, si se desea añadir una nueva figura, como un triángulo, se puede crear una nueva clase que herede de Figura
.
Ejemplo 2:
public class ConexionBD {
public abstract void Consultar(string consulta);
}
public class ConexionMySql : ConexionBD {
public override void Consultar(string consulta) {
// ...
}
}
public class ConexionOracle : ConexionBD {
public override void Consultar(string consulta) {
// ...
}
}
En este ejemplo, la clase ConexionBD
es abierta para la extensión, ya que permite que se creen nuevas clases que hereden de ella. La clase ConexionMySql
y la clase ConexionOracle
son ejemplos de clases que extienden de ConexionBD
.
La clase ConexionBD
es cerrada para la modificación, ya que no se requiere modificar su código para añadir nuevas funcionalidades. Por ejemplo, si se desea añadir soporte para una nueva base de datos, como PostgreSQL, se puede crear una nueva clase que herede de ConexionBD
.
Ejemplo 3:
public class Controlador {
public void MostrarVista(string vista) {
// ...
}
}
public class ControladorDatos {
public void ObtenerDatos(string consulta) {
// ...
}
}
public class ControladorProcesamiento {
public void ProcesarDatos(IEnumerable<object> datos) {
// ...
}
}
En este ejemplo, las clases Controlador
, ControladorDatos
y ControladorProcesamiento
son todas abiertas para la extensión. Esto se debe a que cada una de ellas define una interfaz que puede ser implementada por otras clases.
Por ejemplo, si se desea añadir una nueva funcionalidad al controlador, como la capacidad de enviar un correo electrónico, se puede crear una nueva clase que implemente la interfaz IControlador
.
Como se puede ver en estos ejemplos, el principio OCP puede aplicarse a cualquier tipo de código, desde clases simples hasta sistemas complejos.