Рефакторинг длинного сервлета условно - PullRequest
3 голосов
/ 15 августа 2011

У меня есть сервлет, который может принимать свыше двух десятков различных типов запросов (называемых командами в сервлете).Для обслуживания этих запросов было создано очень большое условие, структурированное так:

if (command.equals("Command1"))
    doSomething();
else if (command.equals("Command2))
    doSomethingElse();
else if (command.equals("Command3))
    doThisOtherThing();
 ......

Есть ли лучший способ написать этот код?Я читаю книгу о тестировании JUnit, в которой предлагается использовать полиморфизм над условными выражениями, но я просто не вижу, как это сделать в этом примере.У кого-нибудь есть идея получше?

Спасибо,

Эллиот

1 Ответ

4 голосов
/ 15 августа 2011

Учитывая, что вы используете сервлеты, вам нужен FrontController . Основная идея проста: каждая из этих командных строк может быть отображена в Map , и вы передадите действия этим командам.

Действительно простая реализация может выглядеть так:

Command commandAction = this.commands.get( command );
commandAction.doAction( request, response );

Это устраняет необходимость наличия переключателя if /, и каждая команда может быть определенным классом, что улучшает организацию вашего кода.

Очевидно, это изобретает колесо, поскольку все веб-фреймворки MVC в Java, такие как Struts, SpringMVC, VRaptor и Play, реализуют этот шаблон и предоставляют вам эту функциональность бесплатно, так что вы также можете подумать о переходе на фреймворк вместо того, чтобы остаться с чистыми сервлетами и созданием вашей собственной доморощенной веб-инфраструктуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...