如何在Java项目中查找未使用/无效的代码

时间:2020-03-06 15:01:43  来源:igfitidea点击:

我们使用什么工具在大型Java项目中查找未使用/无效的代码?我们的产品已经开发了几年,并且很难手动检测不再使用的代码。但是,我们确实尝试删除尽可能多的未使用的代码。

对于一般策略/技术(除特定工具之外)的建议也将受到赞赏。

编辑:请注意,我们已经使用了代码覆盖率工具(Clover,IntelliJ),但是这些帮助不大。无效代码仍具有单元测试,并显示为已覆盖。我猜一个理想的工具可以识别出几乎没有其他代码依赖的代码集群,从而可以对文档进行手动检查。

解决方案

Eclipse可以显示/突出显示无法访问的代码。 JUnit可以向我们显示代码覆盖率,但是我们需要进行一些测试,并且必须确定是否缺少相关测试或者代码是否确实未使用。

有一些工具可以分析代码并提供代码覆盖率数据。这样,我们可以查看(在运行代码时)调用了多少代码。我们可以使用这些工具中的任何一种来查明我们有多少孤立代码。

从理论上讲,我们无法确定性地找到未使用的代码。有一个数学上的证明(嗯,这是一个更一般的定理的特例)。如果我们好奇,请查看"停止问题"。

这可以通过多种方式在Java代码中体现出来:

  • 根据用户输入,配置文件,数据库条目等加载类;
  • 加载外部代码;
  • 将对象树传递给第三方库;
  • 等等。

就是说,我将IDEA IntelliJ用作我的首选IDE,它具有用于模块,未使用的方法,未使用的成员,未使用的类等之间的依赖关系的广泛分析工具。标记为未使用,但公共方法需要更广泛的分析。

我们已经开始使用"查找错误"来帮助识别代码库的目标丰富环境中的某些功能,以进行重构。我还将考虑使用结构101来识别代码库体系结构中过于复杂的点,以便我们知道真正的沼泽在哪里。

我将对正在运行的系统进行检测,以保留代码使用记录,然后开始检查几个月或者几年未使用的代码。

例如,如果我们对未使用的类感兴趣,则可以使用所有类来记录创建实例时的日志。然后,一个小的脚本可以将这些日志与类的完整列表进行比较,以找到未使用的类。

当然,如果我们使用方法级别,则应该牢记性能。例如,这些方法只能记录其首次使用。我不知道这是如何用Java最好完成的。我们是在Smalltalk中完成的,Smalltalk是一种动态语言,因此允许在运行时修改代码。我们使用日志记录调用对所有方法进行检测,并在首次记录方法后卸载日志记录代码,因此一段时间后,不再发生性能损失。也许可以使用静态布尔值在Java中完成类似的操作...

运行良好的Eclipse插件是Unused Code Detector。

它处理整个项目或者特定文件,并显示各种未使用/无效的代码方法,并建议可见性更改(即可以受保护或者私有的公共方法)。

用户覆盖工具,例如EMMA。但这不是静态工具(即它需要通过回归测试以及所有可能的错误情况来实际运行应用程序,这是不可能的:))

尽管如此,EMMA还是非常有用的。

使用测试覆盖率工具来检测代码库,然后运行应用程序本身,而不是测试。

艾玛(Emma)和埃克莱玛(Eclemma)将为我们提供有关任何给定代码运行量的百分比百分比的漂亮报告。

Emma,Cobertura和Clover等代码覆盖工具将对代码进行检测,并记录通过运行一组测试来调用其中的哪些部分。这非常有用,并且应该是开发过程中不可或者缺的一部分。它将确定测试套件覆盖代码的程度。

但是,这与识别实际无效代码不同。它仅标识测试涵盖(或者未涵盖)的代码。这可能会给我们带来误报(如果测试不能涵盖所有场景),也可能给我们带来误报(如果测试访问的代码实际上在实际场景中从未使用)。

我认为,真正识别无效代码的最佳方法是在实时运行的环境中使用覆盖率工具对代码进行检测,并分析长时间的代码覆盖率。

如果我们在负载平衡的冗余环境中运行(如果不是,为什么呢?),那么我认为只对应用程序的一个实例进行检测并配置负载均衡器是有意义的,这样可以使负载中的随机部分很小用户在检测实例上运行。如果我们在较长的时间内执行此操作(以确保已涵盖所有实际使用情况,例如季节性变化),则应该能够准确查看在实际使用情况下访问了代码的哪些区域以及哪些部分确实从未访问过,因此代码无效。

我从来没有亲眼目睹这件事的完成,也不知道如何使用上述工具来检测和分析未通过测试套件调用的代码,但我相信它们可以做到。

  • FindBugs在这种事情上非常出色。
  • PMD(项目混乱检测器)是可以使用的另一种工具。

但是,都找不到在工作空间中未使用的公共静态方法。如果有人知道这种工具,请告诉我。

我已经知道在Eclipse上的一个类中要做的一件事是将其所有方法都更改为私有方法,然后查看我收到的投诉。对于使用的方法,这会引发错误,我将它们返回到可以达到的最低访问级别。对于未使用的方法,这将引发关于未使用方法的警告,然后可以将其删除。另外,我们经常会发现一些可以并且应该设为私有的公共方法。

但这是非常手动的。

IntelliJ具有代码分析工具,用于检测未使用的代码。我们应该尝试使尽可能多的字段/方法/类尽可能不公开,这将显示更多未使用的方法/字段/类

我还将尝试查找重复的代码,以减少代码量。

我的最后一个建议是尝试找到开放源代码,如果使用开放源代码,它将使代码更简单。

Structure101切片透视图将给出与"主"群集无关的类或者程序包的任何"孤立"或者"孤立组"的列表(和依赖图)。