1. 软件工程师培训系列教材
编程规范
2. 编程规范
3. 概述
基本要求
可读性要求
结构化要求
正确性与容错性要求
可重用性要求
命名规范
注释规范
编程风格
4. 总则
程序设计绝对是一门艺术,而不仅仅是一门技术。
程序设计的出发点是给别人看,可读、易理解、好维护,
如果你的程序只能自己来维护,到你离开这个程序时,你的程序也就与你一起离开了这个世界。
5. 模块1:编程要求
6. 基本要求
程序结构清晰简单易懂,单个函数的程序行数不得超过100行。
打算干什么,要简单,直接了当,代码精简,避免垃圾程序。
尽量使用标准库函数和公共函数
不要随意定义全局变量,尽量使用局部变量
使用括号以避免二义性
7. 可读性要求
可读性第一,效率第二。
保持注释与代码完全一致
每个源程序文件,都有文件头说明,说明规格见规范
每个函数,都有函数头说明,说明规格见规范
主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义
常量定义(DEFINE)有相应说明
8. 可读性要求
处理过程的每个阶段都有相关注释说明
在典型算法前都有注释
利用缩进来显示程序的逻辑结构,缩进量一致并以Tab键为单位
循环、分支层次不要超过五层
注释可以与语句在同一行,也可以在上行
9. 可读性要求
空行和空白字符也是一种特殊的注释
一目了然的语句不加注释
注释的作用范围可以为:定义、引用、条件分支以及一段代码
注释行数(不包括程序头和函数头说明部分)应占总行数的1/5到1/3
10. 结构化要求
禁止出现两条等价的支路
禁止GOTO语句
用IF语句来强调只执行两组语句中的一组。禁止ELSE GOTO和ELSE RETURN
用CASE实现多路分支
11. 结构化要求
避免从循环引出多个出口
函数只有一个出口
不使用条件赋值语句
避免不必要的分支
不要轻易用条件分支去替换逻辑表达式
12. 正确性与容错性要求
程序首先是正确,其次是优美
无法证明你的程序没有错误,因此在编写完一段程序后,应先回头检查
改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响
所有变量在调用前必须被初始化
13. 正确性与容错性要求
对所有的用户输入,必须进行合法性检查
不要比较浮点数的相等,如:10.0*0.1 == 1.0,不可靠
程序与环境或状态发生关系时,必须主动去处理发生的意外事件,如文件能否逻辑锁定,打印机是否联机等
单元测试也是编程的一部分,提交联调测试的程序必须通过单元测试
14. 可重用性要求
重复使用的完成相对独立功能的算法或代码应抽象为公共控件或类
公共控件或类应考虑OO思想,减少外界联系,考虑独立性或封装性
公共控件或类应建立使用模板
15. 模块2:编程规范
16. 命名规范
变量命名
函数命名
17. 变量命名
命名必须具有一定的实际意义,形式为xAbcFgh,x由变量类型确定,Abc、Fgh表示连续意义字符串,如果连续意义字符串仅两个,可都大写,如OK
含义清晰,不易混淆
不和其它模块、系统API的命名空间相冲突
18. 变量命名
有意识的为变量名、宏名加上本模块的关键字,就不至于和其它模块、系统API的命名空间相冲突
例如:宏的名称过短,如:"DEBUG"或"_DEBUG",很可能和别的模块、系统模块相冲突
局部变量尤其是循环变量,使用约定俗成的i,j,k
宏、常量、枚举enum,全部用大写字母
全局变量加上前缀"g",后面跟上首字母大写的单词,如:g_全局变量 g_bFlag
19. 函数命名
函数原型说明包括引用外来函数及内部函数,外部引用必须在右侧注明函数来源、模块名及文件名,如是内部函数,只要注释其定义文件名
第一个字母必须使用大写字母,要求用大小写字母组合规范函数命名,必要时可用下划线间隔,示例如下:
void UpdateDB_Tfgd(TRACK_NAME); //Module Name: r01/sdw.c
20. 函数命名
模块化
某一功能,如果重复实现三遍以上,即应考虑模块化,将它写成通用函数,并向小组成员发布。同时也要尽可能利用其它人的现成模块。
模块化的一些注意事项
1. 设计好模块接口,用面向对象的观点看,包括:函数接口和变量接口
2. 定义好接口以后不要轻易改动,并在模块开头(文件的开头或函数的开头)加以说明
3. 不要在外部使用接口以外的其它函数或变量
4. 注意全局变量也是一种接口
5. 接口即是罗列出一个模块的所有的与外部打交道的变量、函数等
21. 格式规范
缩进用Tab,不用空格
一个Tab定义为四个空格
标点符号的右边留一个空格(左括号除外)
赋值、判断、运算符号两边都要加一个空格
空行也是注释,适当的空行使逻辑更清楚,函数内部不应该有连续空行,函数之间至少有两个连续空行
22. 注释规范
文件注释
函数注释
变量注释
其它
23. 文件注释
文件开始注释内容包括:公司名称、版权、作者名称、时间、模块用途、背景介绍等,复杂的算法需要加上流程说明
文件开头的注释模板
/******************************************************************
**文件名:
**版权:
**创建人:
**日期:
**修改人:
**日期:
**描述:
**
**版本:
**-----------------------------------------------------------------
******************************************************************/
24. 函数注释
函数注释包括:输入、输出、函数描述、流程处理、全局变量、调用样例等,
复杂的函数需要加上变量用途说明:
函数开头的注释模板
/******************************************************************
**函数名:
**输入:a, b, c
**a---
**b---
**c---
**输出:x---
**x为1,表示...
**x为0,表示...
**功能描述:
**全局变量:
**调用模块:
**作者:
**日期:
**修改:
**日期:
**版本:
******************************************************************/
25. 同24,印刷错误
26. 变量及其它
变量:对于非通用的变量,请在定义时加以注释说明,变量定义尽可能放在最开始处。
其它:函数内各功能模块,如:循环、流程的各分支等,尽可能多的加以注释
27. 编程风格
严格采用梯形层次对应好各层次:
int main()
{
int i, j;
......
for(i == 0; i < 100; i ++)
{
......
......
if(i == 0)
{
......
......
}
......
......
}
......
}
28. 编程风格
注意错误处理:
编程中要考虑函数的各种执行情况,尽可能处理所有流程情况,将函数分两类:
一类为与屏幕的显示无关
二类为与屏幕的显示有关
对于与屏幕显示无关的函数,函数通过返回值来报告错误
对于与屏幕显示无关的函数,函数要负责向用户发出警告,并进行错误处理
29. 编程风格
错误处理代码一般放在函数末尾,如下(以VB程序为例):
......
On Error Goto errHandle
......
Exit Sub
errHandle:
Select Case Err
Case 1:
...
Case 2:
...
Case Else:
...
End Select
End Sub
对于通用的错误处理,可建立通用的错误处理函数,处理常见的通用的错误
30.