荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: bigone (夜夜除非,好梦留人睡), 信区: Program
标 题: 关于编码风格【-】[转]
发信站: 荔园晨风BBS站 (Fri Jul 16 20:20:44 2004), 站内信件
我在最后的公司的代码规范(原创):
1.变量命名:
以匈牙利命名法为基础,如:
int g_iMaxNumber; //全局变量
float fInput; //局部变量
CWnd* m_pOutputWindow; //成员变量
前缀如下:
(以下为Charles Petzold 在 programming windows 中使用的标准)
(括号内为该类型的原型)
c char or WCHAR or TCHAR
by BYTE (unsigned char)
n short
i int
x, y int used as x-coordinate or y-coordinate
cx, cy int used as x or y length; c stands for "count"
b BOOL (int);
w WORD (unsigned short)
l LONG (long)
dw DWORD (unsigned long)
fn function
s string
sz string terminated by 0 character
h handle
p pointer
补充:
f float
d double
(以下为MFC常用的部分标准)
str CString
pt CPoint
t CTime
窗口类指针(CWnd)可当作普通指针申明,加前缀p即可,但应在名称中出现
window(或wnd)字样,如下:
CWnd* m_pOutputWindow;
CWnd* m_pFirstInputWnd;
命名类的成员变量时加前缀m_
命名全局变量时加g_
对一般类的变量进行命名时,若类名称较短,可当作类型处理,小写打头,如下:
CButton buttonHolter
当名称较繁时,可采用如下形式:
MynameClassname
其中,Myname表示当前变量代表的逻辑意义,Classname代表类名(可缩写,简写)
譬如:
CButton HolterButton
命名时使用拼音或英语单词(缩写)均可
函数命名使用英语单词组合时一般采用“动词 + 名词”的格式,如:
BOOL OpenWindow(int iIndex); //打开iIndex指定窗口
void ChangeWaveShape(); //改变波形
而不采用如下方法:
BOOL WindowOpen(int iIndex);
void WaveShapeChange();
对于获取类的成员变量或设置类的成员变量的函数,一律命名如下:
Get*();
Set*();
对于表示信息判断的函数(BOOL型),一律如下命名:
Is*();
全局变量命名尽可能使用完整的单词,尽可能长一些。
局部变量应尽可能简短,可多使用常用缩写词。
变量一般在使用处声明。
注意不要在switch内声明变量。
2.代码格式
尽可能空行,将执行最小功能组或最小意群的代码放在一起,如下:
//……
//初始化
Initial();
//读取数据
PrepareRead();
Read();
EndRead();
//数据处理
CheckData();
DowithData();
//数据输出
PrepareWrite();
Write();
EndWrite();
//……
括号内的每一项应在逗号后空格,"("后不空格,如:(int iFirstInput, int
iSecondInput)
代码缩进应与Visual Studio默认的缩进格式一致(可使用Alt+F8自动校正排版)。
每一个if,else,for,while一般应使用大括号
对于if,else有一种情况可除外,即只有一句简单执行语句时,如下:
if(……)
bFlag = TRUE;
else
bFlag = FALSE;
一般算术表达式变量之间均应空格,如:
result = a * b / (c + d) + f
仅当两变量之间关系较其它变量在逻辑上明显密切时,可不加空格。
赋值语句格式:int i = 0;
if语句格式: if(bFlag == TRUE);
for语句格式: for(int i = 0; i < MAX; i++)
switch……case语句(若case的内容较复杂,则应加大括号):
switch(iNum)
{
case 1:
FirstFunc();
break;
case 2:
SecondFunc();
break;
default:
DefaultFunc();
}
每行代码不应超过屏幕,即应在不拖动水平滚动条的情况下可浏览整行,
代码太长需分行时,应在本行最后一个逗号后加1空格,再加“\",
分行后,一般应与上一行的括号内的内容左端对齐(可灵活处理),格式如下:
StretchBlt(hdc, xPos + xQiPanLeftTop, yPos + yQiPanLeftTop, Width,
Height, \
hdcMem, 0, 0, Qizi_Width, Qizi_Height,SRCCOPY);
3.注释
每个文件最前端应有文件版本号标志及简单说明,如下:
/**************************************************/
/* 文件名:CTree.cpp */
/* */
/* CTree的实现文件,CTree为tree的基类 */
/* 当前版本:1.0.1.9 */
/* */
/* 创建人:XXX */
/* 创建时间: 2001.5.14 */
/* 最后修改者:XXXX */
/* 最后修改时间: 2001.5.20 */
/**************************************************/
版本标志说明:1.2.3.4
第一位1.为大版本号 通常软件有重大功能改进时增加此值
第二位2.为小版本号 通常软件发补丁版时增加此值,大版本号更新时,此值归
零。
第三位3.功能版本号 软件修补小BUG时的内部调试版本增加此值,小版本号更新
时,此值 归零
第四位4.编译版本号 软件每完成一个能成功编译的版本时,此值加1,注:此
值不归零。
注释多使用//
当要注掉一行以上的连续代码时,一律使用/* */,且退格标在行首,单独成行,格
式如下:
/*
if(parentnode->LeftChild == NULL)
{
parentnode->LeftChild = childnode;
childnode->ParentNode = parentnode;
}
*/
注释应该尽可能多,尽可能详细、准确。
一般应保证在任意一屏有多于三行的注释。
注释一律采用中文。
连续的注释应尽可能对齐,保持美观,如:
void Initial(HWND hWnd); //程序必要的变量初始化
void DrawQipan(HDC hdc); //画棋盘
void DrawAllQizi(HDC hdc); //显示棋子
void DrawChildQizi(HDC hdc); //显示虚棋子
UINT GetQipanPos(POINT ptMouse); //传入逻辑坐标,得到该坐标在棋盘上的位
置
函数实现处应至少有函数功能、入参、出参、返回值的注释。
除循环计数以外,所有的变量(包括局部变量,临时变量)在声明时均应有注释。
循环计数指定使用:i,j,k,m,n
每一个实现算法的代码均应有算法的简短注释,或标明算法说明文档的位置
对于起重要作用的变量,在程序中多处说明
4.其它
每个函数的内容一般不超过100行,太长时应分拆,集中的算法处理除外。
凡可能涉及到优先级时,均应加括号
每个头文件均应添加如下类似代码:
#ifndef _INCLUDE_H
#define _INCLUDE_H
……
#endif
所有的宏定义放在define_.h头文件中
所有非成员变量应在声明时赋初值
指针初值应赋空值,如:int* pCountNum = NULL;
成员变量在构造函数内初始化(包括使用构造初始化列表)
仅在代码简短而且逻辑简单清晰的情况下可使用?:操作符
不使用","操作符
必要安全性检查:
a.所有指针在使用前应进行是否为空的判断
b.所有BOOL型的函数应对返回值进行判断
c.所有入参和出参应在函数入口对其进行合法性进行验证(空否,范围)
d.所有I/O操作,应使用try(),catch()捕捉错误。
e.每一次COM(组件对像模型)接口的调用,应检查返回值
f.在申请大空间时,譬如new int(1024 * 1024)时,应使用try(),catch()捕捉错
误。
g.对于DC资源,譬如HDC、HPen、HBrush……等,使用后一定要释放。
--
我一嚎,上帝都哭了。。。。
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.83.228]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店