SonarQube的认知复杂度指标详解。

Posted CrissChan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SonarQube的认知复杂度指标详解。相关的知识,希望对你有一定的参考价值。

定义

认知复杂性(cognitive complexity)本来不是IT的概念,是指态度的形成或改变,涉及到对客体的许多特性及与其关联事物的众多认知。态度是伴随认知、感情和行为三种成分的持久倾向。其中认知成分是由对某种特殊的态度客体的一切认知所组成的,它既包含有事实信息、知识,也包含有信念。

类似,在IT的认知复杂度是指将一段代码被阅读和理解时的复杂程度,估算成一个具体数字。一个方法的认知复杂度基于以下三条简单规则:

  • 代码中用到一些语法糖,把多句话缩为一句,但是代码不会变得更复杂
  • 出现"break"中止了线性的代码阅读理解,如出现循环、条件、try-catch、switch-case、一串的and or操作符、递归,以及goto类跳转,因此代码因此更复杂
  • 多层嵌套结构使得代码因此更复杂

评价

认知复杂度的评估分数,是基下面三条基本规则:

  • 忽略简写:把多句代码缩写为一句可读的代码,不改变理解难度
  • 对线性的代码逻辑中,出现一个打断逻辑的东西,难度+1
  • 当打断逻辑的是一个嵌套时,难度+1
    进一步说,复杂度得分是来源于以下几种不同的类型:
  • A. Nesting:把一段代码逻辑嵌套在另一段逻辑中;
  • B. Structural:被嵌套的控制流结构;
  • C. Fundamental:不受嵌套影响的语句;
  • D. Hybrid:一些控制流结构,但不包含在嵌套中;

然而不同类型在数学上没有区别,都只是对复杂度加一。在要计算的不同类别之间进行区分,可以更轻松地了解某一处是否适用嵌套的逻辑。以下各节将进一步详细说明这些规则及其背后的原理。

认知复杂度制定的主要目标,是为方法计算出一个得分,准确地反应出此方法的相对理解难度。它的次要目标,是解决现代语言结构的问题,并产生在方法级别以上也有价值的指标。 可以证明,解决现代语言结构的目标已经实现。 其他两个目标在下面进行了检查。

以上是关于SonarQube的认知复杂度指标详解。的主要内容,如果未能解决你的问题,请参考以下文章

React 创建应用程序和 SonarQube 认知复杂性

重构此函数以将其认知复杂度从 17 降低到允许的 15

重构此方法以将其认知复杂度从 16 降低到允许的 15。如何重构和降低复杂度?

sonarqube-5.4 使用啥版本的mysql

SonarQube API - 所有组件/项目的多个指标

Sonarqube v.4 TFS 任务“发布分析结果”抛出错误“无法获取指标”