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