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