Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactorización - Reemplazar Condicional con polimorfismo #17

Open
vic28code opened this issue Aug 11, 2024 · 0 comments
Open

Refactorización - Reemplazar Condicional con polimorfismo #17

vic28code opened this issue Aug 11, 2024 · 0 comments

Comments

@vic28code
Copy link

Problema identificado: El método main utiliza un gran switch para manejar diferentes opciones de menú, donde cada caso llama a un método específico de la clase Urbanizacion. Este enfoque no es muy flexible; si se agregan nuevas opciones de menú, se requiere modificar el switch en varios lugares. Además, el switch hace que el código sea menos orientado a objetos y más propenso a errores si no se actualiza correctamente.
Técnica de refactorización aplicada: Reemplazar Condicional con polimorfismo.
Beneficios de la refactorización:
• Flexibilidad y Extensibilidad: Puedes agregar nuevas opciones de menú simplemente creando nuevas clases que extienden de una clase base o implementan una interfaz, sin necesidad de modificar un switch.
• Eliminación de Código Repetido: Elimina la necesidad de mantener un switch o múltiples condicionales, haciendo que el código sea más limpio y fácil de entender.
• Mayor Cohesión: Cada opción del menú se maneja por separado en su propia clase, lo que facilita el mantenimiento y la prueba de cada opción de manera independiente.
Solución aplicada:
• Antes:

imagen

• Después:
Se crea una clase por cada opción del switch y al final se lo implementa correctamente en el main de Sistema.
public abstract class MenuOpcion {
protected Urbanizacion urbanizacion;
public MenuOpcion(Urbanizacion urbanizacion) {
this.urbanizacion = urbanizacion;
}
public abstract void ejecutar();
}
public class MenuUrbanizacion extends MenuOpcion {
public MenuUrbanizacion(Urbanizacion urbanizacion) {
super(urbanizacion);
}
@OverRide
public void ejecutar() {
System.out.println("\tUrbanizacion\n");
urbanizacion.menuUrbanizacion();
}
}
public class MenuResidentes extends MenuOpcion {
public MenuResidentes(Urbanizacion urbanizacion) {
super(urbanizacion);
}
@OverRide
public void ejecutar() {
System.out.println("\tResidentes\n");
urbanizacion.menuResidentes();
}
}
Otras clases para cada opción.
public class Sistema {
public static void main(String[] args) {
Urbanizacion u1 = inicializarSistema();
Map<Integer, MenuOpcion> opcionesMenu = new HashMap<>();
opcionesMenu.put(1, new MenuUrbanizacion(u1));
opcionesMenu.put(2, new MenuResidentes(u1));
...
int valorMenu;
do {
System.out.println("-----Menú del Sistema-------");
// Mostrar el menú...
System.out.print("Elija una opción: ");
valorMenu = entra.nextInt();
entra.skip("\n");
MenuOpcion opcion = opcionesMenu.get(valorMenu);
if (opcion != null) {
opcion.ejecutar();
} else {
System.out.println("Ese numero no se encuentra entre las opciones del menú");
}
} while (valorMenu != 8);
}
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant