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 clase Calculadora.

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 Impresora solo delega la responsabilidad. Esto cumple con el OCP porque agregar un nuevo tipo de documento no requiere modificar la clase Impresora.

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

  1. Escalabilidad: Agregar nuevas funcionalidades es más fácil.
  2. Menor riesgo de errores: No necesitas modificar el código existente.
  3. 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...