【问题标题】:What is Cognitive Complexity in sonar report?声纳报告中的认知复杂性是什么?
【发布时间】:2019-03-15 10:53:25
【问题描述】:

现在有一天,我切换到声纳报告来进行静态代码审查和性能改进。在规则部分我发现我的方法的认知复杂度很高。

您可以在声纳中发现认知复杂性错误: 转到项目->问题选项卡->规则下拉菜单->认知复杂性

以下屏幕截图为您提供声纳项目的参考:

我没有得到任何方法来计算和降低我的方法的认知复杂性。最后我找到了计算复杂度的准确方法,我将在下面的帖子中回答这个问题。请查看。

【问题讨论】:

    标签: optimization kotlin sonarqube code-readability


    【解决方案1】:

    在我的情况下,认知复杂性是由于许多 if 条件造成的。 我的 SonarQue 只允许 15 个 if 和 else if 条件

    if()       =>1
    else if()  => 2
    .
    .
    .
    else     => 15
    

    假设 if 超过 15 个条件,它向我展示了认知复杂性。

    【讨论】:

      【解决方案2】:

      Sonar Cognitive Complexity中的更多解释答案

      基本标准和方法 认知复杂度得分是 根据三个基本规则进行评估:

      1. 忽略允许将多个语句简写为一个的结构
      2. 代码线性流中的每个中断都增加(加一)
      3. 嵌套流动破坏结构时增加

      此外,复杂度分数由四种不同类型的增量组成:

      • 嵌套 - 评估每个内部的嵌套控制流结构 其他
      • 结构 - 评估控制流结构 受到嵌套增量的影响,并且增加了嵌套计数
      • 基本 - 在不受嵌套约束的语句上评估 递增
      • 混合 - 评估的控制流结构不是 受嵌套增量的影响,但确实增加了嵌套 计数

      虽然增量的类型在数学上没有影响 - 每个增量都会在最终得分上加一 - 区分被计算的特征类别可以更容易地理解嵌套增量适用和不适用的地方。这些规则及其背后的原则将在以下部分中进一步详述。

      【讨论】:

        【解决方案3】:

        认知复杂性

        在搜索了一些博客并与声纳团队交谈后,我发现了一个简单的认知复杂度定义和计算,如下所示:

        定义:

        认知复杂性,因为可测试性!= 可理解性

        你写的代码一定要像上面的定义一样简单易懂,简单。

        更少的认知复杂性更多可读性

        我们来看一个计算CC的方法,现在我指的是kotlin语言,见下图:

        在上图中,有一个方法getAppConfigData(),正在测量其认知复杂度。现在这个方法的CC是18。正如您可以在上面的屏幕截图中看到的那样,有一个警告,它表明最大复杂度的限制是 15,低于此方法的当前 CC。

        现在实际的问题是:我如何计算我的方法在开发时的CC?

        按照以下规则获取任何方法或类的CC:

        • 当线性(从上到下, 从左到右)代码流
        • 结构破坏时增加 流是嵌套的
        • 忽略可读的“速记”结构 将多行代码压缩成一行

        因此,每当上述规则匹配时,只需将 + 计数添加到您的 CC 并记住计数将根据代码中断的级别增加,例如“if”条件如果是第一个代码中断但如果您使用了如果再嵌套一个,则内部“if”将是+2,如下图所示。

        这就是我在认知复杂性方面得到的全部。

        您可以在sonar blog找到与 CC 相关的所有内容

        谢谢

        【讨论】:

        • 我有(&& 或 ||)在 where 语句意味着引发认知复杂性如何解决该问题请建议我
        猜你喜欢
        • 2022-07-09
        • 2021-07-04
        • 1970-01-01
        • 2013-02-15
        • 2018-10-01
        • 2019-02-09
        • 1970-01-01
        • 2012-11-24
        • 2023-04-01
        相关资源
        最近更新 更多