Ⅰ 写在前面
不知道大家有没有这样的感受:看到不规范(杂乱差)的代码,瞬间就没有看下去的欲望了。
相信大家看到标题都应该能明白编程的规范及原则对于每一个软件开发的工程师来说是多么重要。
初学者编写测试程序、小的模块程序也许不能感受它的重要性;但有经验及大型项目开发的人就知道程序的规范性对他们来说是有多么的重要。
Ⅱ 关于编程规范及原则
编程规范也就是编写出简洁、可维护、可靠、可测试、高效、可移植的代码,提高产品代码的质量。
本文针对嵌入式,主要结合C语言编程的规范给大家讲述。
1. 头文件
对于C语言来说,头文件的设计体现了大部分的系统设计,不合理的头文件布局是编译时间过长的原因。
有很多人将工程中所有的头文件包含在一个include.h文件中,然后在每一个.c源代码文件中包含include.h头文件,这样做可以让代码看上去简洁,但实际忽视了编译效率问题,而且代码的可移植性也不好。
原则:
A. 头文件中适合放置接口的声明,不适合放置实现;
B. 头文件应当职责单一;
C. 头文件应向稳定的方向包含。
规则:
A. 每一个.c文件应有一个同名.h文件,用于声明需要对外公开的接口;
B. 禁止头文件循环依赖;
C. .c/.h文件禁止包含用不到的头文件;
D. 头文件应当自包含;
E. 总是编写内部#include保护符( #define 保护);
F. 禁止在头文件中定义变量;
G. 只能通过包含头文件的方式使用其他.c提供的接口,禁止在.c中通过extern的方式使用外部函数接口、变量;
H. 禁止在extern "C"中包含头文件。
建议:
A. 一个模块通常包含多个.c文件,建议放在同一个目录下,目录名即为模块名。为方便外部使用者,建议每一个模块提供一个.h,文件名为目录名;
B. 如果一个模块包含多个子模块,则建议每一个子模块提供一个对外的.h,文件名为子模块名(降低接口使用者的编写难度);
C. 头文件不要使用非习惯用法的扩展名,如.inc;
D. 同一产品统一包含头文件排列方式。
2. 函数
函数设计的要点:编写整洁的函数,同时把代码有效组织起来。
函数整洁的要求:代码简单直接、不隐藏设计者的意图、用干净利落的抽象和直截了当的控制语句将函数有机组织起来。
原则:
A. 一个函数仅完成一件功能;
B. 重复代码应该尽可能提炼成函数.
规则:
A. 避免函数过长,新增函数不超过100行(非空非注释行);
B. 避免函数的代码块嵌套过深,新增函数的代码块嵌套不超过4层;
C. 可重入函数应避免使用共享变量;若需要使用,则应通过互斥手段(关中断、信号量)对其加以保护;
D. 对参数的合法性检查,由调用者负责还是由接口函数负责,应在项目组/模块内应统一规定;
E. 对函数的错误返回码要全面处理;
F. 设计高扇入,合理扇出(小于7)的函数;
G. 废弃代码(没有被调用的函数和变量)要及时清除。
建议:
A. 函数不变参数使用const;
B. 函数应避免使用全局变量、静态局部变量和I/O操作,不可避免的地方应集中使用;
C. 检查函数所有非参数输入的有效性,如数据文件、公共变量等;
D. 函数的参数个数不超过5个;
E. 除打印类函数外,不要使用可变长参函数;
F. 在源文件范围内声明和定义的所有函数,除非外部可见,否则应该增加static关键字。
3. 标识符命名与定义
程序命名是一个关键,如果命名不规范,自己写的代码,时间长了恐怕连自己都不知道是什么意思了。
3.1通用命名规则
常见命名风格:
A. 用下划线„_‟分割,如text_mutex;
B. 大小写字母混用,如ReadRFCText。
规则:
A. 标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解;
B. 除了常见的通用缩写以外,不使用单词缩写,不得使用汉语拼音;
C. 产品/项目组内部应保持统一的命名风格.
建议:
A. 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等;