关于圈复杂度

提示:文章

文章目录

前言

前期疑问:
本文目标:


一、背景

最近

二、代码质量标准

圈复杂度和软件质量

圈复杂度代码状况可测性维护成本
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语句就是卫语句。


总结

未完待续

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值