Hay algo muy satisfactorio sobre este código:método de fábrica de Java Refactoring
/*
Given a command string in which the first 8 characters are the command name
padded on the right with whitespace, construct the appropriate kind of
Command object.
*/
public class CommandFactory {
public Command getCommand(String cmd) {
cmdName = cmd.subString(0,8).trim();
if(cmdName.equals("START")) {
return new StartCommand(cmd);
}
if(cmdName.equals("END")) {
return new EndCommand(cmd);
}
// ... more commands in more if blocks here
// else it's a bad command.
return new InvalidCommand(cmd);
}
}
estoy arrepentido acerca de los múltiples puntos de salida - la estructura es clara. Pero no estoy contento con la serie de declaraciones if casi idénticas. He pensado en hacer un mapa de Cuerdas de Comandos:
commandMap = new HashMap();
commandMap.put("START",StartCommand.class);
// ... etc.
... a continuación, utilizando la reflexión para que las instancias de la clase apropiada levantó la vista del mapa. Sin embargo, aunque conceptualmente elegante, esto implica una buena cantidad de código de reflexión que quien herede este código podría no apreciar, aunque ese costo podría ser compensado por los beneficios. Todas las líneas de los valores de hardcoding en el commandMap huelen casi tan mal como el bloque if.
Sería aún mejor si el constructor de la fábrica pudiera escanear el classpath para las subclases de Command, consultarlas para las representaciones de String y agregarlas automáticamente a su repertorio.
Entonces, ¿cómo debo proceder para refactorizar esto?
Creo que algunos de los frameworks que hay me dan este tipo de cosas gratis. Supongamos que no estoy en condiciones de migrar este material a un marco así.
http://refactormycode.com/ es también un buen lugar para hacer este tipo de preguntas. – Auron