写代码并非仅仅是为了让机器实现运行,其实更是特意写给后续将要进行维护的人员所阅读的那种“说明书”,一份具备清晰特性以及整洁特质的代码能够使得你跟同事都会相应减少掉头发的情况。优良的编程规范并非是一种束缚,反而是用以提升效率并且减少程序错误数量的带有实战性质的有效工具,下面所呈现的内容直接对涉及到你每一天编写代码时所具备的质量以及速度产生关联影响。
空行分隔与代码布局
能让代码产生呼吸感的缘由在于空行的恰当运用,在诸如函数内部不同逻辑段这般相对独立的程序块中间,以及于变量说明完毕之后,务必要增添空行,这恰似文章的段落划分,可使阅读之人一眼就能分辨出初始化部分与业务逻辑部分,防止所有代码全都挤作一团。
如果有一个函数,它连续几十行都不存在任何间隔,那么找起 Bug 来将会非常痛苦。借助强制空行,你是在告知后来的维护者,此处在表明一个逻辑单元已然结束,而下面则是全新的开始。这样一种视觉方面的缓冲,能够极大地去提升代码的可读性以及可维护性。
长表达式与参数的划分
当循环语句或者判断语句之中出现长得式子时,这时候务必于低优先级这个操作符的地方进行换行,也就是说要把操作符至于新行的首部位置。比如说有一个复杂的if条件,是在“&&”或者“||”这个地方断开,这样一来能够使得二者的逻辑关系清晰明了,而不是如同面条那样相互缠绕在一起,变成一团糟。
函数参数也适用相同的原则,要是参数列表过长,那就应当予以适当划分,每个参数单独占一行或者依据逻辑进行分组,如此做下来,不但契合视觉习惯,还能够在版本控制之际清晰地展现出究竟是哪个参数被修改了,防止了因一行出现改动而致使整个函数签名的变更历史变得模糊不清。
Function: // 函数名称Description: // 函数功能、性能等的描述Calls: // 被本函数调用的函数清单Called By: // 调用本函数的函数清单Table Accessed: // 被访问的表(此项仅对于牵扯到数据库操作的程序)Table Updated: // 被修改的表(此项仅对于牵扯到数据库操作的程序)Input: // 输入参数说明, 包括每个参数的作用、取值说明及参数间关系Output: // 对输出参数的说明Return: // 函数返回值的说明
缩进风格的一致性
函数体开始部分,结构体定义部分,循环判断语句里的代码,都得采用统一的缩进风格。对于switch语句下的case处理,也要遵循缩进要求,使得代码的层次结构借由缩进清晰地映照到屏幕上。
缩进是代码的支架,要是if里的代码于if外的代码掺和一块,视觉上难以分辨,这样在嵌套多层逻辑那会儿,你极易迷失于花括号的汪洋里,统一的缩进仿若给代码勘定好了楼层,能让你明晰晓得当下代码归属于哪个控制块。
操作符空格的艺术
在针对两个以及超过两个的关键字、变量、常量去开展对等操作之际,操作符在前后都要添加空格,就像赋值号“=”、比较符“==”那样。然而对于关系紧密相连的立即操作符,像结构体指针指向成员的“->”,在其后面是不应该添加空格的,目的是维持其紧密程度。
这种细节方面的区分展现出了专业性,添加空格会使得表达式更加舒展从而易于阅读,然而取消空格却暗示着操作符具有较高层级的优先级以及较强的关联性,你能够在“a = b + c”以及“p->member”当中体会到这种不一样的差异,前者是需要呼吸的,后者却是呈现出浑然一体的状态。
注释的规范与覆盖范围
有的、全部的头文件以及源文件的头部,都必然得包含版权、版本、作者、功能以及修改日志等完整的注释。函数的头部,就要列清楚功能、输入输出参数、返回的数值以及调用得关系了。对那些全局变量以及命名不太够自注释的变量而言,声明时候必定得说明它的物理含义才成~
不是写给机器看成为注释的目的,写注释供六个月后的自己阅览才是其意义所在。函数的承诺是什么,就一定要精准无误地去达成,注释也就是对于这份承诺的书面层面的记载。尤其是在switch语句这种情况当中,要是蓄意让case出现穿越的状况,那就得在代码之处添加明晰的注释,不然就会被当作Bug来进行处理。
变量命名与运算符优先级
RELATION System_Init Input_Rec Print_Rec Stat_ScoreStudent Create Modify Access AccessScore Create Modify Access Access, Modify
禁止变量命名取单个字符,除了用作局部循环变量的i、j、k外,其他变量名得能表明其含义与类型。并且,要随时留意运算符优先级,用括号明确表达式的操作顺序,别依赖默认优先级去赌编译器行为。
类似于“tmp”这种模糊的名字,过上两周你就会忘掉它所存储的内容。直接的物理常量绝对不能够使用魔法数字去替代,一定要采用具有意义的宏或者枚举。当你书写像“if (a & b == c)”这般不加括号的代码之时,实际上是在给项目埋下隐患。
公共变量与函数设计
公共变量跟操作它的函数之间的关系得明确,创建它的是谁、修改它的是谁、访问它的是谁都得清晰。给公共变量赋值的时候要做合法性检查,防止引入非法数据。编写可重入函数的时候,全局变量的保护机制得格外留意。
函数进行设计之时,务必要精准地达成其功能,绝不能够处于那种基本差不多可又未达准确状态。针对于接口参数的合法性予以检查这一情况而言,在团队内部是需要存在统一的规则约定:明确到底是由调用者来负责此项检查呢,还是由函数自身担当此责。在C/C++里,引用没有进行赋值操作之后的指针,是出现崩溃最为常见的根子所在,在这样编码的时候时时刻刻绝对得保持警觉。
代码效率与逻辑优化
unsigned int example( int para ){unsigned int temp;Exam = para; // ()temp = Square_Exam( );return temp;}
于确保正确性、具备可读性的前提条件之下,进而再去谈论代码效率。切莫耗费过多时间去优化那些调用次数很少的函数,而是要把精力投放于频繁执行的热点路径方面。在有必要的时候能够运用汇编来构建性能要求极为之高的函数。
与此同时,于逻辑结构方面而言,需防止循环体内含有判断语句。尽可能将近条件性的判断置换到循环的外部,借由在判断语句的代码块内存放循环,以此来削减没必要的分支预测所产生的开销。此等结构的优化,不但能够让代码维系清晰,而且还能够带来切切实实的性能提升。
unsigned int example( int para ){unsigned int temp;[申请信号量操作] // 若申请不到“信号量”, 说明另外的进程正处于Exam = para; // 给Exam赋值并计算其平方过程中(即正在使用此信号), 本进程必须等待其释放信号后, 才可继续执行。若申请到信号, 则可继续执行, 但其它进程必须等待本进程释放信号量后, 才能再使用本信号。temp = Square_Exam( ); // [释放信号量操作]return temp;}
读完这八条扎实规范,你最为想要吐槽或者最为认可的是其中哪一条呢?你于实际项目里由于未遵循哪条规范从而踩过最为严重的坑是什么呢?欢迎在评论区域分享你的惨痛经历,点赞促使更多同仁看见这份避坑导引,一同撰写出能让他人看得明白、改得了的清晰代码。

Comments NOTHING