【问题标题】:Code complexity analysis tools beyond cyclomatic complexity [closed]超越圈复杂度的代码复杂度分析工具
【发布时间】:2009-07-17 12:54:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: java complexity-theory


    【解决方案1】:

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

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

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

    • 实际上执行了很多次的代码(分析器对此非常有用,只需忽略计时信息,而是查看命中计数)。
    • 代码覆盖率非常适合查找(几乎)死代码。防止您花费时间重构很少执行的代码。

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

    【讨论】:

      【解决方案2】:

      Google Testability Explorer 例如检查单例和其他静态的东西,这些东西在设计中是难闻的。 Metrics 是一个 Eclipse 插件,可以测量人类已知的几乎所有代码指标。我用过并且可以轻松推荐两者。

      【讨论】:

        【解决方案3】:

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

        编辑外来电

        有一个 Sonar 站点 available 分析了很多开源项目。我认为这很好地表明了应用了多少规则,以及深入研究的程度。当然,您也可以禁用不感兴趣的规则。

        Here 是对指标的解释。

        【讨论】:

          【解决方案4】:

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

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

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

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

          【讨论】:

            【解决方案5】:

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

            Emma 提供代码覆盖率分析,虽然这确实是为了测试。

            【讨论】:

              【解决方案6】:

              用于 .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

              【讨论】:

              • 谢谢。它看起来像一个很好的产品。您是否让任何其他供应商或团队采用 CQL 并为其他语言构建它?
              • Jim,实际上我们发布了 Code Query and Rule over LINQ (CQLinq),它比 CQL 强大得多。到目前为止,我们是唯一一家提出类似 CQLinq 的供应商。这是大量研究和开发的成果,我们认为它已经成熟,可以在实际使用中使用。
              猜你喜欢
              • 2015-02-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-04
              • 1970-01-01
              • 1970-01-01
              • 2018-04-05
              • 1970-01-01
              相关资源
              最近更新 更多