【问题标题】:How does OpenClover count complexity for method?OpenClover 如何计算方法的复杂度?
【发布时间】:2020-01-20 16:55:35
【问题描述】:

我在一个类中有一个方法:

    public boolean tryFile() throws IOException {
        File file = File.createTempFile("test", "dat");
        file.deleteOnExit();
        try (FileOutputStream fos = new FileOutputStream(file)) {
            fos.write(20);
        }
        return file.exists();
    }

根据 OpenClover 文档:

方法复杂度

单个方法的圈复杂度。计算如下:

空方法复杂度 == 1
简单语句复杂度 == 0
切换块复杂度 == 案例语句数
尝试 catch 块复杂度 == catch 语句数
三元表达式复杂度 == 1
布尔表达式复杂度 == && 或 || 的数量在表达

在 OpenClover(4.4.1 版)生成的报告中,此方法的复杂度等于 3。为什么?它是如何计算的?

PS。例如,在 JaCoCo 报告中,我看到此方法的 Ctx=1。

【问题讨论】:

    标签: java clover


    【解决方案1】:

    Try-with-resources 是有效的语法糖。生成了一些捕获和条件块。见JLS section 14.20.3.1

    Clover 不知道使用了 try-with-resources。它可能正在查看已经将 try-with-resources 转换为等效的 try-catch-finally 的 AST。这意味着没有任何特定语言结构的踪迹,也没有办法为其提供特殊情况,即使 Clover 开发人员想要有一个。

    【讨论】:

    • 没有。 Clover 从不看字节码。 JaCoCo 正在研究字节码。顺便说一句,JaCoCo 对此案例有一个过滤器,JaCoCo 报告中此方法的圈复杂度 (CTX) 为 1。
    • @AlekseyUlasevich 字节码是一个错误,抱歉。我显然不知道 Clover 的实现细节,但它们可能不是直接解析源代码,而是通过 AST 并且没有什么可以说 AST 解析器尚未将 try-with-resources 转换为等效的 try-赶上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2011-04-20
    • 2016-04-06
    相关资源
    最近更新 更多