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
- Complejidad: Los múltiples niveles de anidación hacen difícil seguir el flujo del código.
- Mantenibilidad: Si se necesitan cambios, se debe modificar cada nivel de lógica, aumentando el riesgo de errores.
- 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
- Modularidad: Cada responsabilidad está separada en su propio método o función.
- Legibilidad: Reducir la profundidad de anidación facilita seguir el flujo del programa.
- Reutilización: Las funciones más pequeñas y específicas pueden reutilizarse en otros contextos.
- 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...