Como evitar el uso excesivo de if/else

por | noviembre 4, 2014

Necesitamos llamar a varios métodos y tenemos un método central que dependiendo de alguna condición deberemos dirigir hacia una u otra función de nuestro sistema. ¿Quién no ha sido testigo mudo de algún código que por poca fortuna está en nuestras manos y se parece a algo así?

public String methodCaller(String nombreMetodo) throws IOException {
    if(nombreMetodo.equals("metodo1")) {
        return metodo1(atributo("algo"));
    }
    else if(nombreMetodo.equals("metodo2")) {
        return metodo2(atributo("algo mas"));
    }
    else if(nombreMetodo.equals("metodo3")) {
        return metodo3(atributo("algo menos"));
    }
    else if(nombreMetodo.equals("metodo4")) {
        return metodo4(atributo("algo mas"));
    }
    else if(nombreMetodo.equals("metodo6")) {
        return metodo6(atributo("algo mas"),
			Integer.parseInt(atributo("cantidad")));
    }
}

Veamos como podemos mejorar este código y evitar el uso excesivo de if else.
Se puede hacer de nuestros métodos sean objetos que implementen una interfaz, veamos como hacerlo y como nos ayudará

Interfaz

public interface MiMetodo {
   public String call();
}

Implementación

public class MetodoUno implements MiMetodo {

}

Mapping & Llamada

private Map<String, MiMetodo> mappings = new HashMap<String,MiMetodo>();

static {
    mappings.put("metodo1", new MetodoUno());
   //.. otros mappings
}

public String methodCaller(String nombreMetodo) throws IOException {
    MiMetodo miMetodo = mappings.get(nombreMetodo);
    return miMetodo.call();
}

Con esto nuestros métodos implementaran la interfaz y definirán el contrato, recuperamos el objeto del mapa dependiendo del nombre del método y la llamada a call que sea implementada por cada clase se ejecuta.

Fácil de leer, mantener y no hemos afectado el funcionamiento de nuestro sistema.

Fuente: http://stackoverflow.com/questions/13451840/using-large-if-else-string-comparison-to-call-different-methods-more-efficient#494