我在我的Java项目中使用SonarQube,并希望尽可能地消除代码中的代码重复。
我的问题是SonarQube的代码重复检测不考虑方法边界。它将文件的相同部分列为重复部分,并且经常发生重复从一个方法的中间开始,并在另一个方法的中间结束。这些很难重构。
下面是一个例子。单击右上角列表框中的mavenartifactrerepository .java文件,并查看页面下方的第4个复制块。
是否有任何方法参数化代码重复检测器插件,以显示语法上一致的重复?
目前您无法通过配置SonarQube本身来实现这一点。但是,您可以尝试我们的工具SourceMeter及其SonarQube插件,它实现了基于AST的克隆检测,因此它在SonarQube中呈现语法一致的重复。例如,您可以看一下在线演示。
你提到的问题在克隆研究社区是众所周知的,这也是为什么没有多少人在实践中使用克隆检测的主要问题之一。SonarQube实现了一个相当简单和幼稚的算法,该算法基于令牌序列检测代码重复,因此不了解方法是什么(除了许多其他问题)。所以你问题的答案是no
一种解决方案是寻找一种克隆检测算法,该算法基于抽象语法树(AST)检测代码复制。但据我所知,没有免费的工具。
另一种解决方案是使用ConQAT。ConQAT也使用基于令牌的克隆检测方法,但具有相当复杂的后处理步骤。其中之一是所谓的"ast对齐",即在检测后将重复的代码片段与源代码中的语法单元(如方法)对齐。