荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店