У меня есть Service
и Controller
.
У каждого метода в сервисе свои предусловия, например:
public void doSomething(Parameter para1 , Parameter para2 ...) {
if ( something wrong ) {
throw new RuntimeException1();
}
if ( another thing wrong ) {
throw new RuntimeException2();
}
// continue do something
}
А на уровне контроллера есть два метода: один — showForm()
, который отображает форму для ввода пользователем; другой - doApplyForm()
, который принимает форму и вызывает подстилающий слой Service.doSomething()
.
Ниже приведен псевдокод (я исключил некоторые коды BindingResult
, attr.addFlashAttribute
):
@Injected Service service;
public String showForm() {
if ( something wrong ) {
throw new RuntimeException1();
}
if ( another thing wrong ) {
throw new RuntimeException2();
}
return "showForm";
}
public String doApplyForm(@Validated Form form) {
try {
service.doSomething(para1 , para2 ...);
return "redirect:/";
} catch (Exception e) {
// error handling
return "redirect:/error";
}
}
Работает хорошо, но я не доволен. Внутри плохой запах.
Проблема в showForm()
, который имеет те же предварительные условия, что и Controller.doSomething()
.
Если Service.doSomething()
добавит другие предварительные условия в будущем, Controller.showForm()
должен будет внести соответствующие изменения.
Интересно, существуют ли какие-либо шаблоны проектирования или фреймворки для устранения такого неприятного запаха?
Приветствуются функциональные решения Java8.
Спасибо.