Codigo limpio y refactorización

Los bloques switch extensos pueden ser difíciles de mantener. Una alternativa más limpia es usar estructuras de datos como objetos o mapas.

Ejemplo Malo:

1switch (tipo) {
2    case "sumar":
3        return a + b;
4    case "restar":
5        return a - b;
6    default:
7        return 0;
8}

Problema: Los bloques switch o if-else extensos son propensos a errores y difíciles de escalar.

Solución: Usar estructuras como mapas permite que el código sea más escalable y limpio.

Ejemplo Bueno:

1Map<String, Function<Integer, Integer>> operaciones = Map.of(
2    "sumar", (a, b) -> a + b,
3    "restar", (a, b) -> a - b
4);
5return operaciones.getOrDefault(tipo, (a, b) -> 0).apply(a, b);

Ejemplo, eliminación de switch mediante clases y herencia.

Ejemplo Malo:

1public void calcularGolpe(Jugador atacante, Jugador atacado) {
2    double golpe = 0;
3
4    switch (atacante.tipo) {
5        case "guerrero":
6            golpe = 10 * atacante.experiencia * Math.random();
7            break;
8        case "mago":
9            golpe = 8 * atacante.experiencia * Math.random();
10            break;
11        case "ladron":
12            golpe = 4 * atacante.experiencia * Math.random();
13            break;
14        default:
15            System.out.println("Tipo de atacante no reconocido");
16            return;
17    }
18}

Ejemplo Bueno:

Mediante Herencia y Polimorfismo creamos una clase base Jugador y subclases específicas para cada tipo de personaje. Cada subclase implementa su propia lógica para calcular el golpe, eliminando la necesidad de usar un switch.

1abstract class Jugador {
2    protected String tipo;
3    protected int experiencia;
4    protected double vida;
5
6    public Jugador(String tipo, int experiencia, double vida) {
7        this.tipo = tipo;
8        this.experiencia = experiencia;
9        this.vida = vida;
10    }
11
12    public abstract double calcularGolpe();
13}
14
15class Guerrero extends Jugador {
16    public Guerrero(int experiencia, double vida) {
17        super("guerrero", experiencia, vida);
18    }
19
20    @Override
21    public double calcularGolpe() {
22        return 10 * experiencia * Math.random();
23    }
24}
25
26class Mago extends Jugador {
27    public Mago(int experiencia, double vida) {
28        super("mago", experiencia, vida);
29    }
30
31    @Override
32    public double calcularGolpe() {
33        return 8 * experiencia * Math.random();
34    }
35}
36
37class Ladron extends Jugador {
38    public Ladron(int experiencia, double vida) {
39        super("ladron", experiencia, vida);
40    }
41
42    @Override
43    public double calcularGolpe() {
44        return 4 * experiencia * Math.random();
45    }
46}
  • Loading...