gpt4 book ai didi

java - 在 Controller 和服务之间共享相同的方法前提逻辑?

转载 作者:行者123 更新时间:2023-11-30 08:44:45 25 4
gpt4 key购买 nike

我有一个 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
}

而在Controller层,有两个方法,一个是showForm(),显示表单供用户输入;另一个是 doApplyForm(),它接受表单并调用底层 Service.doSomething()

以下是伪代码(我去掉了一些BindingResultattr.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 的函数式解决方案。

谢谢。

最佳答案

您可以定义一个名为 Preconditions 的实用程序类,并将所有验证逻辑移到那里。这是一种常见的模式,有许多框架都在使用它。例如 Guava :Preconditions docs .

至少这样你的if (condition) throw new exception将被封装并且更容易管理。

关于java - 在 Controller 和服务之间共享相同的方法前提逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33650082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com