提示:文章
文章目录
前言
前期疑问:
本文目标:
一、背景
最近
二、代码质量标准
圈复杂度和软件质量
圈复杂度 | 代码状况 | 可测性 | 维护成本 |
---|---|---|---|
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语句就是卫语句。
总结
未完待续