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í?

[java]
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")));
}
}
[/java]

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

[java]
public interface MiMetodo {
public String call();
}
[/java]

Implementación

[java]
public class MetodoUno implements MiMetodo {

}
[/java]

Mapping & Llamada

[java]
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();
}
[/java]

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