java - 这是什么意思以及如何修复 SonarQube Java 问题 "Cycles between packages should be removed"(鱿鱼 :CycleBetweenPackages)

标签 java architecture sonarqube circular-dependency

当这些包中的类之间存在使用或导入类型的依赖时,包之间就存在循环。

考虑以下示例。假设有 4 个类:Truckorg.example.car 包中的接口(interface) Car 以及 NavigationCPU 在包 org.example.part 中。在包 org.example.carorg.example.part 中,我们有类 Truck --> Car 和类 之间的使用关系导航 --> CPU。假设 Truck 类使用 Navigation 类,所以我们有数据包之间的关系 org.example.car --> org.example.part .然后假设类CPU也使用了Car接口(interface),这给了我们包之间的关系org.example.part --> org.example.car。尽管 Navigation 类不使用任何类的数据包 org.example.car 我们在包中的相邻类(CPU 类)上有一个循环.

这个例子如下图所示:

dependency-cycles-in-packages

当一个循环中涉及多个包时,这意味着这些包高度耦合,如果不导入所有其他包,就无法重用/提取其中一个包。这样的循环可能会迅速增加维护应用程序和接受业务变更所需的工作量。

最佳答案

要修复包中的依赖循环,您应该引入额外的包并将几个依赖类/接口(interface)移动到新创建的包中。

如下图所示:

dependency-cycles-fixed

在我们的示例中,让我们选择将接口(interface)Car 移动到新创建的包org.example.api。这打破了依赖循环并降低了我们应用程序中的技术部门。现在,所有包仅以一种方式具有依赖关系,并且可以根据需要将它们拆分为不同的工件。

关于java - 这是什么意思以及如何修复 SonarQube Java 问题 "Cycles between packages should be removed"(鱿鱼 :CycleBetweenPackages),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34899712/

相关文章:

angular - SonarQube/AngularJS - 如何启动并运行 SonarQube 以集成/分析我的 Angular 项目?

java - 从 Jenkins/Hudson 插件运行时如何从 Sonar 报告中的 cobertura 分析中排除类?

java - 将 JSONArray 转换为 POJO 类 List<type>,无法转换

java - 如何使用底部导航 Activity 更改 fragment ?

java - 如何在不重新实例化 Bufferedreader 的情况下返回到文件的第一行?

laravel - 简化存储库模式和SOA的实现

dll - 在我的 C# 解决方案中,解耦架构中的接口(interface)应存储在哪里?

java - 应用设计: Hundreds of File Polling in Spring Integration

java - 使用复选框显示所有电话联系人

jenkins - SonarQube 5.1.1 加载项目存储库时发生读取超时错误