第一章文件声明
【规则1-1
】头文件和定义文件的说明
在头部声明文件的基本信息。
1) 文件名
2) 简要说明该文件的作用
3) 版本信息,原作者和编辑作者,建立日期或最后修改日期
/*********************************************************************
* File: MathGraph.h ,
interface defination of CMathGraph
* Abstract: CMathGraph is a class for drawing various kinds of
*
math plot,histogram, etc
*
* Current Version: 1.0
* Coder: Dai Jun
* Last Edited: 2006-Dec-11
*
* First Finish: 2006-Dec-11
* First Coder: Dai Jun
**********************************************************************/
|
【规则1-2
】为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。
#ifndef
MATHGRAPH_H // 防止mathgraph.h被重复引用
#define
MATHGRAPH_H
…………程序正文
#endif
|
【规则1-3
】用 #include <filename.h> 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
【规则1-4
】用 #include “filename.h” 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。
【建议】尽量避免使用全局变量,尽量不要在头文件中出现象extern int value 这类声明。若要使用全局变量,建议在独立的头文件中定义以方便查找。
空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。所以不要舍不得用空行。
2.1代码行,空行及空格
【规则2-1-1
】在每个类声明之后、每个函数定义结束之后都要加空行。
void Function1(…)
{
…
}
// 空行
void Function2(…)
{
…
}
|
【规则2-1-2
】在一个函数体内,逻揖上密切相关的语句之间不加空行,不同功能的程序块之间应加空行分隔。参见示例
//空行
void Function()
{
数值计算程序段 ;
//空行
数值输出程序段;
}
|
【规则2-1-3
】一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
int width; // 宽度
int height; // 高度
int depth; // 深度
|
【规则2-1-4
】if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}, 这样可以防止书写失误。
for (initialization; condition; update)
{
dosomething();
}
// 空行
other();
【建议2-1-5
】尽量在定义变量的同时初始化该变量(就近原则)
如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。如果引用了未被初始化的变量,可能会导致程序错误。本建议可以减少隐患。例如
int width = 10;
// 定义并初绐化width
【规则2-1-6
】函数名之后不要留空格,紧跟左括号‘(’
【规则2-1-7
】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。
【规则2-1-8
】‘,’之后要留空格,如Function(x, y, z)。如果‘;’不是一行的结束符号,其后要留空格,如for (initialization; condition; update)。
【规则2-1-9
】赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。但对于比较长的for, if等语句,为了紧凑可以适当去掉空格。 如for(i=0; i<10; i++) 和 if ((a<=b) && (c<=d))
【规则2-1-10
】源程序中关系较为紧密的代码应尽可能相邻。
rect.length=10,//矩形的长
不良的风格
char_poi=str;//显示的文本串
rect.width=5;//矩形的宽
|
rect.length=10;
rect.width=5;// 矩形的长与宽关系较密切,放在一起。
char_poi=str;
|
【规则2-1-11
】一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格。象“[]”、“
.”、“->”这类操作符前后也不加空格
void Func1(int x, int y, int z);
// 良好的风格
|
if (year >= 2000)
// 良好的风格
if ((a>=b) && (c<=d))
// 良好的风格
if(a>=b&&c<=d)
// 不良的风格
|
for (i=0; i<10; i++)
// 良好的风格
for(i=0;i<10;i++)
// 不良的风格
for (i = 0; I < 10; i ++)
// 过多的空格
|
x = a < b ? a : b;
// 良好的风格
x=a<b?a:b;
// 不好的风格
|
int *x = &y;
// 良好的风格
int * x = & y;
// 不良的风格
|
array[5] = 0;
// 不要写成 array [ 5 ] = 0;
a.Function();
// 不要写成 a . Function();
b->Function();
// 不要写成 b -> Function();
|
2.2 对齐与拆分
【规则2-2-1
】程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。
【规则2-2-2
】{ }之内的代码块在‘{’右边数格处左对齐。(VC的TAB默认为4格,有些规范不建议使用TAB,因为不同编辑器TAB键不一致,考虑到敲空格比较烦琐,同一用TAB=4格左右缩进,可以设置编辑器TAB值)。同一级的代码块要对齐。
if (condition)
{
… //
program
code
}
else
{
… //
program
code
}
|
如果出现嵌套的{},则使用缩进对齐,如:
{
…
{
…
}
…
}
|
【规则2-2-3
】代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。
【规则2-2-4
】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
if ((very_longer_variable1 >= very_longer_variable12)
&& (very_longer_variable3 <= very_longer_variable14)
&& (very_longer_variable5 <= very_longer_variable16))
{
dosomething();
}
|
virtual CMatrix CMultiplyMatrix (CMatrix leftMatrix,
CMatrix rightMatrix);
|
【规则2-2-5
】应当将修饰符 * 和 & 紧靠变量名, 返回类型为指针的函数可靠近类型名
char *name;
int* Function(char *ch)
|
C语言的注释符为“/*…*/”。C++语言中,程序块的注释常采用“/*…*/”,行注释一般采用“//…”。
【规则2-3-2
】如果语句表达得很清楚的,则不必加注释。否则多此一举,令人厌烦。 有效注释应该占程序文字量的25%左右
【规则2-3-3
】边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
【规则2-3-4
】尽量避免在注释中使用缩写,特别是不常用缩写。
【规则2-3-5
】注释的位置应与被描述的代码相邻,上方或右方,不可放在下方。
实现在某一功能的长代码段开始处注明代码段功能,用//号占位以方便查找
void Func()
{
...
//开始绘图
…… 长代码段
//计算矩阵///
......
}
|
函数定义处开头要注释函数名,函数功能和输入输出参数。简单明了的函数可以只注释功能。函数声明处上方简要说明函数功能。
/*****************************************************
* ComplexFunc 函数功能描述......
* 输入参数: para1 参数1的意义
*
1 若para为1的意义 2 若para为2的意义
*
para2 参数2的意义
* 返回值
char* 返回值的意义
*******************************************************/
char* ComplexFunc(int para1, char *para2)
{
...
}
|
/***********************************************************
* 设置para
*************************************************************/
void SimpleFunc(int para)
{
m_para = para;
}
|
【规则2-3-6
】当域内代码比较多,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读和检查。
if (a!=0)
{
… 长代码段
} //end if a
else
{
… 长代码段
}//end else
2.4
类的声明版式
【规则2-4-1
】一般先定义接口函数,再定义成员变量,先public,后private. 把成员函数分类成:构造/释构,属性,行为. 在函数声明的上方和成员变量右方加上功能注释,
class CmathGraph
{
public:
CmathGraph()
~CmathGraph()
//Attribute
public:
//设置DC
void SetDC(CDC *pDC);
//获取绘图区域大小
CSize GetSize();
//Operation
public:
//在屏幕输出文本
void DrawText(CString str);
protected:
int member1; //member1的作用
char member2; //member2的作用
}
|