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的认知复杂度指标详解。的主要内容,如果未能解决你的问题,请参考以下文章