声纳报告中的认知复杂性是什么?

What is Cognitive Complexity in sonar report?

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

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

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

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

认知复杂度

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

定义:

Cognitive Complexity, Because Testability != Understandability

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

less Cognitive Complexity more Readability

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

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

现在真正的问题是:如何在开发时计算方法的 CC?

遵循以下规则 获取任何方法的 CC 或 class 作为:

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

所以每当上述规则匹配时,只需将 + 计数添加到您的 CC 并记住计数将根据代码中断的级别增加,例如 "if" 如果它是第一个代码中断,则条件获得 +1 但是如果你再使用一个嵌套的 if 那么它会为那个内部 "if" +2,如下图所示。

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

您可以在 sonar blog

找到与 CC 相关的所有内容

谢谢

声纳中的更多解释答案Cognitive Complexity

Basic criteria and methodology A Cognitive Complexity score is assessed according to three basic rules:

  1. Ignore structures that allow multiple statements to be readably shorthanded into one
  2. Increment (add one) for each break in the linear flow of the code
  3. Increment when flow-breaking structures are nested

Additionally, a complexity score is made up of four different types of increments:

  • Nesting - assessed for nesting control flow structures inside each other
  • Structural - assessed on control flow structures that are subject to a nesting increment, and that increase the nesting count
  • Fundamental - assessed on statements not subject to a nesting increment
  • Hybrid - assessed on control flow structures that are not subject to a nesting increment, but which do increase the nesting count

While the type of an increment makes no difference in the math - each increment adds one to the final score - making a distinction among the categories of features being counted makes it easier to understand where nesting increments do and do not apply. These rules and the principles behind them are further detailed in the following sections.

在我的案例中,认知复杂性是由于许多 if 条件造成的。 我的 SonarQue 只允许 15 if 和 else if 条件

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

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