有趣的地方

有趣的地方

关于圈复杂度

提示:文章

文章目录

前言

前期疑问:
本文目标:


一、背景

最近

二、代码质量标准

圈复杂度和软件质量

圈复杂度 代码状况 可测性 维护成本
1-10 清晰、结构化
10-20 复杂
20-30 非常复杂
>30 不可读 不可测 非常高
圈复杂度 说明
1-10 代码是ok的,质量还行
11-15 代码已经较为复杂,但也还好,可以设法对某些点重构一下
16-无穷 代码已经非常的复杂了,可维护性很低,维护的成本也大,此时必须要进行重构

这里只介绍最简单的一种,节点判定法,因为包括有的工具其实也是按照这个算法去算法的,其计算的公式如下。

圈复杂度 = 节点数量 + 1
节点数量代表什么呢?就是下面这些控制节点。
if、for、while、case、catch、与、非、布尔操作、三元运算符
大白话来说,就是看到上面符号,就把圈复杂度加1。

举个例子:

int getSum(int fast, int num, char* inputStr, int len)
{
    int sum = 0;
    for(int i = 0; i < num; i++)
    {
        if(fast + i < len)
        {
            sum += inputStr[fast + i] - '0';
        }
    }

    return sum;
}

int GetCorrectSubstrNum(char *inputStr)
{
    int len = strlen(inputStr);

    int count = 0;

    for(int i = 0; i < len; i++)
    {
        int slow = i;
        int fast = i + 1;
        while(fast < len)
        {
            if(inputStr[slow] != inputStr[fast])
            {
                int distance = (fast - slow);
                int num = (fast - slow)* (inputStr[slow] - '0');
                int sum = getSum(fast, distance, inputStr, len);
                if(fast + distance > len)
                {
                    break;
                }
                if(abs(num - sum) == distance)
                {
                    count++;
                }
                break;
            }
            fast++;
        }
    }

    printf("%d",count);
    return count;
}

int main()
{
    char str[] = "110101001101";
    GetCorrectSubstrNum(str);
    return 0;
}
最大圈复杂度 6
最大单函数代码行数 6
最大单函数代码行数 29
最大代码嵌套深度 5

2023年9月8日15:29:52更新

最大代码嵌套深度是什么?

百度竟然没百度到,自己觉得应该就是花括号对的数量吧,待确定。

总结:

最大圈复杂度 圈复杂度 = 节点数量 + 1
最大嵌套深度 最大嵌套深度 = 花括号对数
最大嵌套深度 = 最大圈复杂度 - 1

更新规范

函数行数建议不超过50行
函数的参数建议不超过5个
函数最大代码块嵌套深度不超过4层。
行宽不超过120个字

二、提升方法

2.1 解决代码嵌套深度
卫语句

卫语句就是把复杂的条件表达式拆分成多个条件表达式,减少嵌套。嵌套了好几层的if - then-else语句,转换为多个if语句,实现它的逻辑,这多条的if语句就是卫语句。


总结

未完待续

发表评论:

Powered By Z-BlogPHP 1.7.3

© 2018-2020 有趣的地方 粤ICP备18140861号-1 网站地图