Там что-то очень неудовлетворительно об этом коде:рефакторинга Java фабричный метод
/*
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);
}
}
Я раскаивается в нескольких точках выхода - структура ясна. Но я не доволен серией почти идентичных утверждений if. Я думал сделать Карту Струны для команд:
commandMap = new HashMap();
commandMap.put("START",StartCommand.class);
// ... etc.
... затем с помощью отражения сделать экземпляры соответствующего класса оторвался от карты. Однако, хотя концептуально изящный, это включает в себя довольно много кода отражения, что тот, кто наследует этот код, может не оценить - хотя эта стоимость может быть компенсирована преимуществами. Все значения hardcoding строк в запасе commandMap почти так же плохи, как и блок if.
Еще лучше было бы, если бы конструктор фабрики мог сканировать путь класса для подклассов Command, запрашивать их для представления String и автоматически добавлять их в свой репертуар.
Итак - как мне следует пересмотреть это?
Я предполагаю, что некоторые из фреймворков дают мне такие вещи бесплатно. Предположим, что я не в состоянии перенести этот материал в такую структуру.
http://refactormycode.com/ также является хорошим местом, чтобы задать такие вопросы. – Auron 2008-09-22 15:04:48