OCP: Open Closed Principle // Principio Abierto/Cerrado
Open / Closed Principle
Principio abierto/cerrado
"Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification." - Robert C. Martin parafraseando a Bertrand Meyer
Traducción literal: "Las entidades de software (clases, módulos, funciones, etcétera) deberían estar abiertas a la extensión pero cerradas a la modificación."
Mi traducción: Cambia el comportamiento de una clase mediante herencia y composición.
Empecemos con un ejemplo sencillo y típico:
Empecemos con un ejemplo sencillo y típico:
public interface IForma
{
int GetTipo();
}
public class Rectangulo : IForma
{
public int GetTipo()
{
return 1;
}
}
public class Circulo : IForma
{
public int GetTipo()
{
return 2;
}
}
public class EditorGrafico
{
public void DibujarForma(IForma forma)
{
switch (forma.GetTipo())
{
case 1:
DibujaUnRectangulo((Rectangulo)forma);
break;
case 2:
DibujaUnCirculo((Circulo)forma);
break;
}
}
public void DibujaUnCirculo(Circulo c)
{
//pinta un círculo...
}
public void DibujaUnRectangulo(Rectangulo r)
{
//pinta un rectángulo
}
}
¿Por qué éste es un mal ejemplo?
Porque si quisiéramos añadir una nueva forma, es decir, extender la clase, tendríamos que modificar ésta clase, es decir, no está abierta a la extensión. ¿Cómo solucionamos ésto? Muy fácil:
public abstract class Forma
{
public abstract void Dibujar();
}
public class Rectangulo : Forma
{
public override void Dibujar()
{
// Dibuja un Rectangulo
}
}
public class Circulo : Forma
{
public override void Dibujar()
{
// Dibuja un círculo
}
}
public class EditorGrafico
{
public void DibujarForma(Forma forma)
{
forma.Dibujar();
}
}
¿No es genial? De una forma elegante hemos ganado en simplicidad, sólo hemos utilizado una clase abstracta con un método abstracto que será implementado por cada clase hija. Voy a insistir en mi propia traducción de éste principio, si has de cambiar una clase hazlo usando herencia y polimorfismo. No debes temer el uso de clases abstractas ni interfaces sino al revés ya que son una ayuda contra el acoplamiento de tu software que te protegen frente a cambios.
Juan García Carmona
Comentarios
Publicar un comentario
Cualquier comentario, duda o pregunta es bienbenido. Adelante