我使用 Sonar 代码质量管理平台已经有一段时间了,在大多数情况下,我发现它对于揭示代码库中隐藏的设计缺陷非常有帮助。
然而,有一条规则比帮助更让我烦恼,那就是它检查“循环包引用”违规行为。
我想我完全理解包之间的这种依赖关系在哪里是一件坏事。例如,在典型的 3 层表示/服务/持久性分层设计中,让数据库处理代码引用回 UI 相关类几乎总是一个坏主意。我称其为“违规”没有问题。
但让我们考虑其他情况,例如设计类似 IDE 的应用程序。比如说,我们有一个包含Application
接口的主包,它定义List<View> Application.getViews()
了引用应用程序视图的方法。
然而,当View
接口有一个Application getApplication()
方法来引用它的父应用程序时,我相信这是一个很常见的设计,它会引入一个循环引用,前提是每个接口分别用com.myapp.ui
, 和分隔com.myapp.ui.view
。
当然,你也可以直接把View
接口放进com.myapp.ui
去打破循环。但是,当您在 中拥有各种其他与视图相关的 API 时com.myapp.ui.view
,其中许多是另一个抽象 API,例如AbstractView
、ContentView
、AbstractContentView
等。我想知道是否出于管理目的将它们放在单独的包中更为可取。
并且考虑到上述应用程序还有许多其他类似的情况,例如com.myapp.ui.action
,等,如果我们要将它们都放在那里com.myapp.ui.perspective
,这真的会使包变得拥挤。com.myapp.ui
那么,你建议用什么方法来处理这种情况呢?真的每个循环包都引用了一件坏事吗?或者如果我必须与他们一起生活,您如何配置 Sonar 以仅检查真实的、有问题的循环?