基本的代码规范
来源:互联网 发布:matlab协方差矩阵 编辑:程序博客网 时间:2024/05/16 10:28
1 排版
排版可以使程序结构清晰,观者心怡,对于增强程序的可读性和可维护性起着至关重要的作用,因此程序员应该注意排版,这也会给以后的工作(修改、维护程序的工作)带来极大的方便。排版需要注意的内容如下:
1-1 缩进
规则
规则
程序示例
void main ()
{
cout << "Hello World!" << endl; // 函数的开始部分采用缩进风格
// 编写的代码,规则
}
1-2 空行
规则
程序示例
class Car
{
...
}
// 这一空行表示Car类定义的结束,规则
class Bike
{
......
}
// 这一空行表示Bike类定义的结束,规则
规则
规则
规则
程序示例
#include <iostream.h>
// 这一空行将注释与其上面的代码隔开,规则
/*以下为主函数,……*/
int main()
{
char cName;
int iAge;
// 这一空行表示变量声明结束,规则
if (age > 18)
{
......
}
// 这一空行表示上下两段语句在逻辑上不相关,规则
return 0;
}
1-3 空格
规则
规则
规则
规则
规则
规则
规则
说明
说明
程序示例
#include <iostream.h> // 关键字"include"后留空格,规则
// "<"后和">"前不留空格,说明
int main() // 函数名"main"后不留空格,规则
{
int aArray[5] = {1, 2, 3, 4, 5}; // 逗号前面不留空格,后面留空格,规则
// "[]"前后不加空格,规则
// "="前后加空格,规则
for (int i=0; i<5; i++) // 为紧凑起见,省去for语句中的一些空格,说明
// 一元操作符"++"前后不加空格,规则
{
cout << aArray[i] - 1 << endl; // 位域操作符"<<"的前后加空格,规则
}
return 0;
}
1-4 对齐
规则
规则
规则
规则
注:规则
说明
程序示例
do
{
……
} while ();
技巧
1-5 语句
规则
程序示例
for (i = 0, j = 0;
(i < ifirstWord) && (j < isecondWord);
i++, j++)
{
……
}
规则
规则
程序示例
#include <iostream.h>
int main()
{
int iAge = 18;
char cSex = 'M'; // 定义变量对齐,规则
if (iAge >= 18) // if语句独占一行,规则
else // else与if对齐,规则
{
cout << "child" << endl;
}
switch (cSex)
{
case 'M':
{
cout << "BOY" << endl;
}
break; // break缩进,规则
case 'F':
{
cout << "GIRL" << endl;
}
break; // 一行只准书写一条语句,规则
default:
{
cout << "I don't know your sex" << endl;
}
break;
}
return 0;
}
1-6 类
之所以把类拿到这里来单独讨论,是因为类的版式主要有两种方式:一是将private类型的数据写在前面,而将public类型的函数写在后面,
代码示例A
class A
{
private:
int m_iV1;
float m_fV2;
…
public:
void Func1(void);
void Func2(void);
…
}
采用这种版式的程序员主张类的设计“以数据为中心”,重点关注类的内部结构。
还有一种是将public类型的函数写在前面,而将private类型的数据写在后面
代码示例B
class B
{
public:
void Func1(void);
void Func2(void);
…
private:
int m_iV1;
float m_fV2;
…
}
采用这种版式的程序员主张类的设计“以行为为中心”,重点关注的是类应该提供什么样的接口(或服务)。
在这里建议采用“以行为为中心”(代码示例B)的书写方式,即首先考虑类应该提供什么样的函数,这通常也是我们接触到一个类时最关心的问题。
2 注释
注释的主要作用是帮助理解程序,注释语言必须含义准确、简单明了,一定要防止注释的二义性。注释的数量不宜太多或者太少,一般情况下,源程序有效注释量必须在源程序的20%以上,推荐在20%——30%之间。总的来说,注释首先要遵循以下的一些原则。
注释原则1尽量避免在注释中使用缩写,特别是不常用缩写。
注释原则2不要在一行代码或表达式的中间插入注释。
注释原则3注释应与其描述的代码相近,对单条语句的注释要放在其上方或右方相邻的位置,不可放在语句下方,并使用"///>"进行注释;对多行语句或程序块的注释要放在其上方相邻的位置,同样不可放在语句下方,并使用"/**"和"*/"进行注释。
注释原则4一定要边写代码边写注释,修改代码的同时也要修改相应的注释,以保证注释与代码的一致性。不再有用的注释要及时删除。
此外,出于对维护人员的考虑,建议使用中文进行注释。
2-1 常、变量
规则
代码示例
#define MAX_ACT_TASK_NUMBER 1000;///> 活动任务的统计数值,规则
规则
代码示例
/**
@brief 用来表示数据传输中的状态的,取值范围为0, 1, 2
0-表示传输成功 1-表示传输失败 2-表示没有数据传输
通过函数SCCPTranslate()可以修改它的状态,
函数GetGTTransErrorCode()仅可以对它进行只读访问
*/
int g_GTTranErrorCode;
规则
2-2 代码
规则
代码示例
/**
@brief 对输入的年份是否是闰年进行判断,如果是闰年,输出"闰年"
字样,如果不是闰年,则输出还差几年才到下一个闰年
@param iYear 年份
@retval 1=闰年
@retval 0=非闰年
*******************************************************/
int LeapYear( int iYear )
{
...
if ()
{
...
} ///> 判断是否是闰年结束
...
}
规则
2-3 数据结构
规则
代码示例
/**
@brief 本数据结构的说明
struct ADDR
{
char m_cName[4];
long m_lTel;
char m_cStreet[30];
char m_aCity[20];
char m_aCountry[30];
long m_lPostcode; // 邮政编码,规则
};
2-4 函数
规则
函数注释参考形式如下:
/**
@brief // 函数功能、性能的描述
// 调用哪些函数
@param 参数列表
@param
….. 多个参数
@retval 返回值
修改日志:
备 注: // 其它有用的信息
*/
参见2-2代码示例
2-5 头文件、源文件
规则
说明性文件注释参考形式如下:
/*!
版权声明:
@file: 文 件 名
文件信息: // 用于详细说明此程序文件完成的主要功能,与其他模块
// 或函数的接口,输出值、取值范围、含义及参数间的控
// 制、顺序、独立或依赖等关系
@author: 作者
@version 版本
@date 完成日期:
备 注: // 其它内容的说明,例如特殊缩写与约定
函数列表: // 主要函数列表
函数名称 功能描述
1. ..... ....
2. ..... ....
修改历史:
作者 修改时间 版本 修改内容
... ... ... .....
*/
3 命名规则
为变量、函数、数据结构等命名时,最基本的要求有以下几个:
基本要求3-1命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。
基本要求3-2命名中若使用特殊约定或缩写,则要有注释说明,通常放在源文件开始的地方。
基本要求3-3除非必要,否则禁止使用数字或较奇怪的字符来定义标识符。
以下规定的各项命名规则仅适用于基于Windows平台的开发过程,对于Unix平台下的命名规则暂时不予考虑。
3-1 常、变量与参数
规则
代码示例
float fValue;
float fOldValue;
float fNewValue;
规则
建议
步骤1确定变量作用的范围,如果是类或者结构的成员变量,一律标记为小写的m_(member);如果是全局变量,则一律标记为小写的g_(global);如果是静态变更,则一律标记为小写的s_(static)。其它变量暂无规定标记;
步骤2确定变量的数据类型,常用数据类型对应的字母如下:
int-------------i
long-----------l
char-----------c
指针类型----p
数组----------a
……
步骤3为变量起名,参见规则
请看下面的几个例子:
变量命名举例
m_cName…………类成员、字符型、变量Name
iRate_s …………整型、静态变量Rate
g_iPassline ……….全局、整型、变量Passline
虽然以上的命名方法很显繁琐,但可以避免许多因为变量命名不当引起的程序错误(例如全局变量与局部变量重名)。
规则
代码示例
const int MAX_LENGTH = 100;
3-2 函数
规则
代码示例
void PerformSelfTest(void) ;
规则
add / remove begin / end create / destroy
insert / delete first / last get / release
add / delete lock / unlock open / close
min / max old / new start / stop
next / previous source / target show / hide
send / receive put / get up / down
cut / paste increment / decrement
source / destination
3-3 类
规则
代码示例
class MyClass;
3-4 结构
规则
代码示例
struct LOCAL_SPC_TABLE_STRU
{
char m_cValid;
int m_iNspccode[max];
} LOCAL_SPC_TABLE ;
3-5 枚举
规则
代码示例
enum
{
eLAPD_ MDL_ASSIGN_REQ,
eLAPD_MDL_ASSIGN_IND,
eLAPD_DL_DATA_REQ,
eLAPD_DL_DATA_IND,
eLAPD_DL_UNIT_DATA_REQ,
eLAPD_DL_UNIT_DATA_IND,
} LAPD_PRMV_TYPE;
4 循环语句与执行效率
首先强调,任何语句的嵌套层次不得超过5层。嵌套层次太多,增加了代码的复杂度及测试的难度,容易出错,增加代码维护的难度。
4-1 for语句
规则
规则
for (int i=0; i<5; i++)
而不要采取以下的写法:
for (int i=0; i<=4; i++)
很显然,第一种写法更接近我们最初的意识,也更直观。
规则
代码示例
代码1,低效代码
for (row = 0; row < 100; row++)
{
for (col = 0; col < 5; col++)
{
sum += a[row][col];
}
}
代码2,高效代码
for (col = 0; col < 5; col++)
{
for (row = 0; row < 100; row++)
{
sum += a[row][col];
}
}
规则
4-2 goto语句
在实现中,尽量避免 goto 语句的使用。并且禁止使用 goto 由外部向控制语句内部跳转。
5 函数
对于每一个函数建议尽可能控制其代码长度为50行左右,超过50行太多的代码要重新考虑将其拆分为两个或两个以上的函数。函数拆分规则应该以不破坏原有算法为基础,同时拆分出来的部分应该是可以重复利用的。每个函数只完成单一的功能,不设计多用途面面俱到的函数,这样将使函数的理解、测试、维护等工作变得困难。
5-1 参数
规则
规则
代码示例
void SetValue(int iWidth, int iHeight);
void SetValue(int, int); // 违反规定的书写方法
float GetValue(void);
float GetValue();
规则
规则
规则
5-2 返回值
规则
规则
规则
规则
5-3 函数执行效率
规则
规则
规则
说明:这样做的目的是防止函数内出现随机内聚。随机内聚是指将没有关联或关联很弱的语句放到同一个函数中。随机内聚给函数的维护、测试及以后的升级等造成了不便,同时也使函数的功能不明确。使用随机内聚函数,常常容易出现在一种应用场合需要改进此函数,而另一种应用场合又不允许这种改进,从而陷入困境。
在编程时,经常遇到在不同函数中使用相同的代码,许多开发人员都愿把这些代码提出来,并构成一个新函数。若这些代码关联较大并且是完成一个功能的,那么这种构造是合理的,否则这种构造将极有可能产生随机内聚的函数。
规则
规则
6 代码的编译与审查
规则6-1打开编译器的所有告警开关对程序进行编译。
规则6-2通过代码走读及审查方式对代码进行检查。
说明:代码走读主要是对程序的编程风格如注释、命名等以及编程时易出错的内容进行检查,可由开发人员自己或开发人员交叉的方式进行;代码审查主要是对程序实现的功能及程序的稳定性、安全性、可靠性等进行检查及评审,可通过自审、交叉审核或指定部门抽查等方式进行。
规则6-3编写代码时要注意随时保存,并定期备份,防止由于断电、硬盘损坏等原因造成代码丢失。
规则6-4同产品软件(项目组)内,最好使用相同的编辑器,并使用相同的设置选项。
规则6-5使用BoundChecker/ErrorDetect等工具检查内存泄露/内存越界。
规则6-6除非实在由于编译器的原因无法消除某些Warning,否则坚决杜绝编译期间的Warning;执行适当的类型转换以消除类型不匹配Warning,但是转换时要小心。
7 特别关注
以下陈述的或者是编程时经常会出现的问题,或者是对程序影响比较严重的问题,总之在书写程序时,需要引起对它们的特别关注。
7-1 =和==
一个是用来比较的(= =),一个是用来赋值的(=),但是二者却经常被程序员用错地方,不管是新手还是老手,都会不约而同的犯这个拼写错误,究其根源还是我们在学习数学的时候以及脑海里树立了牢固的信念,"="代表等于。对于这个问题,没有什么好的办法,只能提醒大家多加小心了。
另外容易混淆的还有"|"与"||"、"&"与"&&"等,拼写错误很多情况下都会引起很严重的错误,所以编程时,一定要在这些地方小心。当编完程序后,应对这些操作符进行彻底检查。
7-2 运算符的优先级
C++/C语言的运算符有数十个,运算符的优先级与结合律如下表所示。
优先级
运算符
结合律
从
高
到
低
排
列
( ) [ ] -> .
从左至右
! ~ ++ -- (类型) sizeof
+ - * &
从右至左
* / %
从左至右
+ -
从左至右
<< >>
从左至右
< <= > >=
从左至右
= = !=
从左至右
&
从左至右
^
从左至右
|
从左至右
&&
从左至右
||
从右至左
?:
从右至左
= += -= *= /= %= &= ^=
|= <<= >>=
从左至右
规则
代码示例
word = (high << 8) | low;
if ((a | b) && (a & c))
7-3 内存
对内存进行操作时的必须注意,因为对内存操作的错误带给系统的打击将是毁灭性的,因此必须牢记以下的几点。
规则
规则
规则
规则
说明:在实际编程过程中,稍不留心就会出现在一个模块中释放了某个内存块,而另一模块在随后的某个时刻又使用了它。要防止这种情况发生。
规则
说明:内存操作主要是指对数组、指针、内存地址等的操作。内存操作越界是软件系统主要错误之一,后果往往非常严重,所以当我们进行这些操作时一定要仔细小心。
- 基本的代码规范
- JavaScript 的基本代码规范
- JavaScript 的基本代码规范
- JAVA代码编写程序的基本规范
- JAVA代码编写程序的基本规范
- 前端代码的一些基本规范使用
- 关于php的基本代码规范
- 基本代码管理规范
- Symbian基本规范:代码效率
- java代码编写基本规范
- PSR-1 基本代码规范
- PSR-2 基本代码规范
- PSR-1 基本代码规范
- HTML开发-基本代码规范
- 我翻译的文档----Symbian基本规范:代码效率
- JavaScript的基本规范
- Javascript的基本规范
- 基本的编程规范
- 17种正则表达式
- 中国创业者十大素质
- Janus thinking
- 姓氏的来历
- 虚惊一场
- 基本的代码规范
- 发票套打源码(WinForms C#+SQL2000)
- oracle9i的全文检索技术
- [收藏]Oracle和Tomcat端口冲突
- 做这个专栏的理由
- 工作两年(四)--进入Configuration Management的世界
- 工作两年(五)--进入Blog的世界
- 我看到的一封信(对待女孩子)
- 2005-8-21个人日志