【问题标题】:Annotations for enforcing cyclomatic complexity and LCOM constrains用于执行圈复杂度和 LCOM 约束的注释
【发布时间】:2010-05-27 19:45:47
【问题描述】:

在工作中,我们使用多种工具来捕获多种指标(主要是圈复杂度和 LCOM)。我们使用这些来获取警告标志并指导先发制人的重构工作。这对提高代码质量非常有益。

但是,该过程与构建过程无关。它是分开进行的。此外,我正在寻找可以成为源代码固有的东西(而不是在其上运行的外部进程。)

是否有人知道可以从编译器运行的一组注解和可配置的注解处理器,如果代码不符合阈值圈/LCOM 指标,它们会导致构建失败?

我想我可以从 maven/ant 运行 ckjm、checkstyle 和 pmd,但有些工作在源代码上,而另一些工作在字节码上。在编译开始之前有一个可以处理源代码的综合工具会很好。

另一件事是,如果有一组注释可以驱动这一点,那就太好了(允许在极端情况下不可避免地需要定制。)

@LCOM3(Threshold=1.5)
public class SomeDumbPojo {... buch of gets/sets...}

// by default would be measured against a strict LCOM3
public class ActualBizClass
{
   @CYCLOMATIC_COMPLEXITY(Threshold=15)
   public void someFatIrreducibleMethod(){...}
}

然后,当我们运行该工具时,默认情况下会应用严格的(和可配置的)度量阈值,但那些使用(希望记录和合法的)更宽松阈值注释的工件除外。对于一些不能/不应该减少的方法,宽松的圈复杂度是有意义的。对于没有行为的普通 POJO,LCOM 需要放宽......等等。

尽我所能寻找和谷歌搜索,我无法找到任何东西(希望是开源的)。但我不妨在这里问一下,以防万一有人知道这种情况。

谢谢。

【问题讨论】:

    标签: java annotations metrics cyclomatic-complexity


    【解决方案1】:

    如果有一个在编译开始之前就可以处理源代码的整合工具会很好。

    我不太确定这意味着什么,因为必须将代码编译成 something 才能使静态分析起作用。所有这些工具都需要能够将您的代码编译成字节码或某种语法树。

    我建议保持简单:如果任何有关 Cyclomatic Complexity 或其他指标的警告超过给定阈值,则将 PMD 配置为使构建失败。不要用允许的复杂度来注释方法(你将如何得出一个可接受的值?如何防止有人意外地将复杂度从 12 增加到 15 以增加注释),而是对其进行注释以完全抑制警告

    @SuppressWarnings("PMD.CyclomaticComplexity")
    public void someFatIrreducibleMethod() { ... }
    

    然后您可以定期在代码库中搜索带有隐藏警告的方法,您可能希望删除和重构这些方法。

    另外,如果您希望提供某种可追溯性,PMD 还支持在代码中以特定语法保留 cmets,以标记谁审核了警告以及何时审核。

    【讨论】:

    • 我的错,“编译”是指 javac 开始输出字节码的步骤。我们在工作中使用专有工具扫描 Java 源代码并从中获取指标(无需编译),但该工具不适合使其成为构建过程的一部分。至于使用注释添加给定阈值的想法,这或多或少是过程的产物。如果一个类的方法的圈复杂度超过 10 个,则构建将中止,但提交、审查和接受的文档案例除外(因此以这种方式注释以使构建继续进行。)
    【解决方案2】:

    SD Java Metrics 工具计算大多数基本指标(不是 LCOM,但肯定是圈复杂度),并从命令行运行。

    它会生成一个 XML 输出文件,其中包含有关方法的详细指标和高于该层次结构(类、包、子系统)的汇总摘要。使用 XLST(或 awk 或 perl 或...)很容易提取完整摘要或单个方法所需的指标,并检查您的阈值。

    【讨论】:

    • 有趣!非常感谢!
    猜你喜欢
    • 2016-02-10
    • 2012-10-29
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多