Codigo limpio y refactorización

Cuando un código tiene demasiados if o for anidados, se vuelve difícil de leer, entender y mantener. Este antipatrón crea complejidad innecesaria y aumenta el riesgo de errores. El problema se puede resolver mediante refactorización, aplicando principios como divide y vencerás, extracción de métodos, o patrones de diseño.


Ejemplo Malo: Muchos if y for Anidados

1public class ReportGenerator {
2    public void generateReport(List<String> users, Map<String, List<Integer>> userScores) {
3        for (String user : users) {
4            if (userScores.containsKey(user)) {
5                List<Integer> scores = userScores.get(user);
6                for (Integer score : scores) {
7                    if (score > 90) {
8                        System.out.println(user + " has a high score: " + score);
9                    } else if (score > 70) {
10                        System.out.println(user + " has a medium score: " + score);
11                    } else {
12                        System.out.println(user + " has a low score: " + score);
13                    }
14                }
15            } else {
16                System.out.println("No scores available for user: " + user);
17            }
18        }
19    }
20}

Problemas en los Ejemplos Malos

  1. Complejidad: Los múltiples niveles de anidación hacen difícil seguir el flujo del código.
  2. Mantenibilidad: Si se necesitan cambios, se debe modificar cada nivel de lógica, aumentando el riesgo de errores.
  3. Reusabilidad: La lógica está mezclada en un solo lugar, dificultando su reutilización en otros contextos.

Ejemplo Corregido: Refactorización para Mejorar Claridad

Beneficios

  1. Modularidad: Cada responsabilidad está separada en su propio método o función.
  2. Legibilidad: Reducir la profundidad de anidación facilita seguir el flujo del programa.
  3. Reutilización: Las funciones más pequeñas y específicas pueden reutilizarse en otros contextos.
  4. Mantenibilidad: Es más fácil realizar cambios en una parte del código sin afectar el resto.
1public class ReportGenerator {
2    public void generateReport(List<String> users, Map<String, List<Integer>> userScores) {
3        for (String user : users) {
4            processUserScores(user, userScores.getOrDefault(user, List.of()));
5        }
6    }
7
8    private void processUserScores(String user, List<Integer> scores) {
9        if (scores.isEmpty()) {
10            System.out.println("No scores available for user: " + user);
11        } else {
12            scores.forEach(score -> categorizeScore(user, score));
13        }
14    }
15
16    private void categorizeScore(String user, int score) {
17        if (score > 90) {
18            System.out.println(user + " has a high score: " + score);
19        } else if (score > 70) {
20            System.out.println(user + " has a medium score: " + score);
21        } else {
22            System.out.println(user + " has a low score: " + score);
23        }
24    }
25}
  • Loading...