C编码规范
-
宏定义:除去返回值,其它使用宏定义或者枚举定义数字
#define MAX 1
-
输入参数校验:每次传入的参数都要进行判别参数是否有问题。
-
结构分配内存后,要进行初始化,不然其指针会指向异常区域并不为空
-
数据库最好要名字大写,可读性高
-
使用宏定义,定义基础的函数比如SQL语句
-
使用链表,所有的结点要进行堆分配,然后手动释放
-
global_dmac = ethdr->d_addr.addr_bytes; // 直接赋值可能只会复制为指针的引用或指针,采用memcpy进行复制。比如指针赋给指针,并没有复制内容,只是使另一个指针也指向相同的内存。所以遇到数组需要考虑是否需要进行复制内容。
-
使用宏定义完成补丁,补丁不影响原本的代码
-
使用宏定义完成基础的操作,例如链表的基本操作、SQL语句
-
圈复杂度
cyclomatic complexity
计算 = e - n + 2*P,e是边的数量,n是节点的数量(多个end只计算一次),P表示程序中独立组件、不相互调用的模块数量。圈复杂度与分支结构的数量成正比,用于描述一段代码“可测性”很好。e : 边的数量 n : 结点的数量 V(G) \in [0, 10] : 代码质量不错,清晰结构化,可测性高、维护成本低 V(G) \in [11, 15] :可能存在需要拆分的代码,需要进行重构 V(G) \in [16, \infinite): 必须进行重构,代码复杂 v - [20, 30] 非常复杂,可测性低,维护 V > 30 不可读,不可测,维护成本非常高 switch(day){ case Day::Red: break; // 1 case Day::Green: break; // 2 default: break; // 3 }
-
降低圈复杂度的重构计数
Extract Method
提炼函数 -
认知复杂度:打断
1
次逻辑,认知复杂度加1
;打断的是逻辑嵌套,认知复杂度加1
。for (){ // +1 for (){ // +2 for (){ // +3 if (){ // +4 continue; // +1 打断1次加1 } } } } // coComplex: 11