Dependency injection “如何忽略”;“参数太多”;关于使用注入的构造函数

Dependency injection “如何忽略”;“参数太多”;关于使用注入的构造函数,dependency-injection,sonarlint,Dependency Injection,Sonarlint,如果您使用的是依赖项注入,那么构造函数有许多参数是完全正常的 Sonarint是否可能没有为使用注入的构造函数显示“太多参数”代码气味警告?正如之前其他海报所述,方法或构造函数的太多参数表明某种程度上违反了关注点分离原则。最好采用以下解决方案: 对于构造器:构造器模式 对于方法:使用请求参数,如果有太多参数,则使用生成器 这避免了参数的混淆,即“x、y或z是第一个参数?” 如果所有尝试都失败,请在要忽略的方法/构造函数顶部注释@SuppressWarnings(“squid:S00107”)

如果您使用的是依赖项注入,那么构造函数有许多参数是完全正常的


Sonarint是否可能没有为使用注入的构造函数显示“太多参数”代码气味警告?

正如之前其他海报所述,方法或构造函数的太多参数表明某种程度上违反了关注点分离原则。最好采用以下解决方案:

  • 对于构造器:构造器模式
  • 对于方法:使用请求参数,如果有太多参数,则使用生成器
这避免了参数的混淆,即“x、y或z是第一个参数?”


如果所有尝试都失败,请在要忽略的方法/构造函数顶部注释
@SuppressWarnings(“squid:S00107”)
。这只能是最后一个资源

在我的例子中,Spring服务需要很多其他服务来完成它的工作。所以rule
squid:S00107
启动了,并在SonarCube中给了我一个错误。我找到了解决这个问题的方法,如下所示:

之前:

@Component
public class EventService {

  private final String param1;
  private final String param2;
  private final String param3;
  private final String param4;
  private final String param5;
  private final String param6;
  private final String param7;
  private final String param8;
  private final String param9;

  public EventService(String param1, String param2, String param3, String param4, String param5, String param6, String param7, String param8, String param9) {
    this.param1 = param1;
    this.param2 = param2;
    this.param3 = param3;
    this.param4 = param4;
    this.param5 = param5;
    this.param6 = param6;
    this.param7 = param7;
    this.param8 = param8;
    this.param9 = param9;
  }

  ...
之后:

@Component
@RequiredArgsConstructor
public class EventService {

  private final String param1;
  private final String param2;
  private final String param3;
  private final String param4;
  private final String param5;
  private final String param6;
  private final String param7;
  private final String param8;
  private final String param9;

  ...

DI不应该成为构造函数拥有许多参数的借口。太多的依赖关系可能意味着您的设计不受尊重,因此Sonarint警告您IMHO是正确的。像@sp00m一样,太多的依赖关系可能意味着您的服务承担了太多的责任,您的服务应该分解为更小的服务。查看下面的链接以查看如何重构代码的示例:如果Spring服务构造函数中有大量的
@Autowired
参数,该怎么办?在测试环境中,您可以使用PowerMockito Whitebox.setInternalField(…)方法。