代码复杂性分析工具超越了圈复杂性

时间:2009-07-17 12:54:43

标签: java complexity-theory

虽然圈复杂度是一个值得衡量的指标,但我倾向于发现它是识别难以维护的代码的糟糕工具。特别是,我倾向于发现它只突出了某些类型的代码(例如解析器),并且错过了很难的递归,线程和耦合问题以及许多已经定义的反模式。

还有哪些其他工具可用于识别有问题的Java代码?

注意,我们已经使用了PMD和FindBugs,我认为它们非常适合方法级问题识别。

6 个答案:

答案 0 :(得分:11)

我的经验是,在查看代码可维护性时最重要的指标是:

  • Cyclomatic Complexity,用于识别可能难以理解/修改的大块代码。
  • 嵌套深度,找到类似的点(高嵌套深度自动高CC,但不一定相反,因此对两者的评分很重要)。
  • 扇入/退出,以更好地了解方法/类之间的关系以及各个方法的实际重要性。

在检查由他人编写的代码时,包含动态技术通常很有用。只需通过分析器/代码覆盖工具运行常见的使用场景即可发现:

  • 实际执行的代码很多(分析器非常适用于此,只需忽略时序信息并查看命中计数)。
  • 代码覆盖很容易找到(几乎)死代码。为了防止你花时间重构很少执行的代码。

任何分析器,代码覆盖率和指标工具等常见嫌疑人通常会帮助您获取进行这些评估所需的数据。

答案 1 :(得分:7)

Google Testability Explorer检查单身人士和其他静态事物,例如设计中的难闻气味。 Metrics是一个Eclipse插件,可以测量人类已知的几乎所有代码度量。我用过,很容易推荐两者。

答案 2 :(得分:5)

Sonar尝试结合各种开源工具(包括PMD和Findbugs)的结果来识别复杂性和可维护性的“热点”。它与Maven和CI服务器(尤其是Hudson)很好地集成。

编辑 by extraneon

有一个Sonar网站available,其中分析了许多开源项目。我认为这表明应用了多少规则以及深入研究的程度。当然,你也可以禁用那些你觉得不那么有趣的规则。

Here是指标的解释。

答案 3 :(得分:1)

我从未使用它,但我觉得这很有趣并且很有用:

http://erik.doernenburg.com/2008/11/how-toxic-is-your-code/

我使用了这个,发现它非常有用,因为依赖性的可视化很好

http://www.headwaysoftware.com/products/structure101/index.php

答案 4 :(得分:0)

您已经使用的静态分析工具非常标准。如果您正在使用Eclipse,请尝试查看here以获取更多代码分析工具。

Emma提供了对代码覆盖率的分析,尽管这非常适合测试。

答案 5 :(得分:0)

.NET代码的工具NDepend可让您分析代码复杂性的许多方面,包括代码指标,如: 环形复杂性,嵌套深度,方法的内聚缺乏,测试覆盖率......

...包括依赖关系分析,包括致力于询问的Code Rules over LINQ Queries (CQLinq),代码中的复杂内容以及编写规则。提供200 default Code Rules周围。它们涉及Singleton等反模式,threading problems的检测,UI layer shouldn't use directly DB types等耦合问题的检测......

前段时间,我写了一篇文章,总结了代码复杂性的几个方面: Fighting Fabricated Complexity