【问题标题】:Dupliate code in controller to be used in other controller控制器中的重复代码将在其他控制器中使用
【发布时间】:2019-09-06 07:43:55
【问题描述】:

我注意到一个控制器中有一些代码我必须在另一个控制器中使用。所以这就是场景。

类控制器A{

@PostMapping("/testcase")
public RedirectView saveResult(Model model, @ModelAttribute)
{
        func();

}


public static func()
{
    //Code Comes here
}

}

类控制器B{

  @PostMapping("")
  {
       ControllerA.func();
  }

}

如您所见,我将重复的代码放在一个静态公共方法中,这样它也可以在 ControllerB 中访问。你认为这是一个好方法吗?

【问题讨论】:

    标签: spring controller


    【解决方案1】:

    乍一看,我会说这是不可取的。我更愿意将共享功能放在您可以继承的基本控制器类中。

    这里是一个例子:https://www.mkyong.com/spring-mvc/spring-abstract-controller-example/

    根据问题的类型,您还可以选择使用共享帮助程序类或将共享功能置于服务层中来解决您的问题。

    【讨论】:

      【解决方案2】:

      我认为这不是一个好主意,因为它在两个控制器之间引入了依赖关系(直接耦合),这违背了低耦合和高内聚的概念,因为两个控制器应该独立运行。

      这样想:当有人要更改ControllerA中的方法时,他自然会觉得有必要检查其他用法吗?

      很可能,答案是否定的,因为控制器方法通常仅由 Web 框架或控制器本身的其他方法调用。

      那应该怎么做呢?

      如果有意义的话,您可以引入一个包含所需方法的控制器实用程序类或将方法移至服务层。或者您可以将代码复制到两个文件中。哪种解决方案更好取决于几个因素:

      • 对于所有类,方法始终以相同的方式运行是否至关重要?
      • 两个类的实现保持不变的可能性有多大?
      • 该方法在其他类中被重用的可能性有多大?
      • 重复了多少代码?

      【讨论】:

        【解决方案3】:

        您可以使用包含所有重复方法的抽象类,并且它不能被实例化:

            public abstract class AbstractController
              {
        
                  public void func()
                     {
                             //Code Comes here
                     }
        
              }
        

        还有

           class ControllerA extends AbstractController
        {
        
            @PostMapping("/testcase")
            public RedirectView saveResult(Model model, @ModelAttribute)
               {
                    func();
        
               }
        
         }
        

        还有

            class ControllerB extends AbstractController
        {
        
              @PostMapping("")
              {
                  func();
              }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-16
          • 1970-01-01
          • 2023-04-09
          相关资源
          最近更新 更多