Codigo limpio y refactorización
El Principio de Abierto/Cerrado (OCP) establece que las clases, módulos o funciones deben estar abiertas para la extensión, pero cerradas para la modificación. Esto significa que puedes extender su funcionalidad sin cambiar su código existente.
- ¿Por qué es importante?
Permite agregar nuevas funcionalidades sin afectar el comportamiento ya implementado, reduciendo el riesgo de errores y facilitando el mantenimiento.
Ejemplo 1: Una Clase sin Cumplir el OCP
Código Malo (Violación del OCP)
Problema: Si necesitas agregar una nueva operación (por ejemplo, multiplicación o división), tendrías que modificar el método
calcular. Esto viola el principio porque el código no está cerrado para modificaciones.
1public class Calculadora { 2 public double calcular(String operacion, double a, double b) { 3 if (operacion.equals("sumar")) { 4 return a + b; 5 } else if (operacion.equals("restar")) { 6 return a - b; 7 } else { 8 throw new IllegalArgumentException("Operación no soportada"); 9 } 10 } 11}
Código Bueno (Aplicando el OCP)
Solución: Ahora, puedes agregar nuevas operaciones (como multiplicación o división) creando nuevas clases que implementen la interfaz
Operacion(o hereden de la clase base en JavaScript y Python). No necesitas modificar la claseCalculadora.
1public interface Operacion { 2 double ejecutar(double a, double b); 3} 4 5public class Sumar implements Operacion { 6 @Override 7 public double ejecutar(double a, double b) { 8 return a + b; 9 } 10} 11 12public class Restar implements Operacion { 13 @Override 14 public double ejecutar(double a, double b) { 15 return a - b; 16 } 17} 18 19public class Calculadora { 20 public double calcular(Operacion operacion, double a, double b) { 21 return operacion.ejecutar(a, b); 22 } 23}
Ejemplo 2: Extensión sin Modificación
Código Malo (Violación del OCP)
Problema: Si quieres agregar soporte para otro tipo de documento, tendrías que modificar el método
imprimir, lo cual no cumple con el OCP.
1public class Impresora { 2 public void imprimir(String tipoDocumento) { 3 if (tipoDocumento.equals("PDF")) { 4 System.out.println("Imprimiendo PDF..."); 5 } else if (tipoDocumento.equals("DOCX")) { 6 System.out.println("Imprimiendo DOCX..."); 7 } else { 8 throw new IllegalArgumentException("Tipo de documento no soportado"); 9 } 10 } 11}
Código Bueno (Aplicando el OCP)
Solución: Cada tipo de documento tiene su propia implementación de impresión, y la clase
Impresorasolo delega la responsabilidad. Esto cumple con el OCP porque agregar un nuevo tipo de documento no requiere modificar la claseImpresora.
1public interface Documento { 2 void imprimir(); 3} 4 5public class PDF implements Documento { 6 @Override 7 public void imprimir() { 8 System.out.println("Imprimiendo PDF..."); 9 } 10} 11 12public class DOCX implements Documento { 13 @Override 14 public void imprimir() { 15 System.out.println("Imprimiendo DOCX..."); 16 } 17} 18 19public class Impresora { 20 public void imprimir(Documento documento) { 21 documento.imprimir(); 22 } 23}
Beneficios de Aplicar el OCP
- Escalabilidad: Agregar nuevas funcionalidades es más fácil.
- Menor riesgo de errores: No necesitas modificar el código existente.
- Mantenimiento más sencillo: Cada clase o módulo tiene una única responsabilidad y es extensible.
Aplicando el Principio de Abierto/Cerrado, puedes desarrollar sistemas más robustos y flexibles, listos para adaptarse a futuros cambios sin comprometer su estabilidad. 😊
- Loading...