代码编写规范(2)

2019-09-01 11:40

联众公司开发部文档《联众公司C++/C代码编写规范》

? 标识符应当直观且可以拼读,可望文知意,不必进行“解码”。

? 标识符最好采用英文单词或其组合,每个单词的第一个字母大写,便于记忆和阅读。尽

量不使用汉语拼音来命名。程序中的英文单词一般不会太复杂,用词应当准确。例如不要把CurrentValue写成NowValue。

? 标识符的长度应当符合“min-length && max-information”原则 ? 命名规则尽量与所采用的操作系统或开发工具的风格保持一致 ? 程序中不要出现仅靠大小写区分的相似的标识符

? 程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会

发生语法错误,但会使人误解

? 变量的名字应当使用“名词”或者“形容词+名词”

? 尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是

为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)

1.2 常量命名

? #define 的常量全用大写字母,单词间用下划线’_’分开

? enum枚举内部的常量用大写字母,建议用枚举定义一组相关的常量,而不用宏定义

1.3 函数命名

? 类的成员函数第一个字母一般都大写

? 全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。类的成员函数应当

只使用“动词”,被省略掉的名词就是对象本身。

? 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。 ? 函数名中不能有‘_’出现,只能是字母和数字组成。

1.4 全局函数命名

? 为了表示某函数是联众自己的给该函数加前缀:

前缀 含义 说明 gc globallink client 只在客户端使用的全局函数 gs globallink server 只在服务器使用的全局函数 gp globallink public 客户端服务器都会用到的函数 说明:不使用gl前缀是因为和OpenGL的函数前缀相同 例如:

gcSetResourceHandle() gcGetScreenWidth() gsWriteExceptionLog() gpDoubleToIni()

— 6 —

联众公司开发部文档《联众公司C++/C代码编写规范》

1.5 结构命名

? 这样定义结构体:

typedef struct tagMYSTRUCT {

...

}MYSTRUCT, *PMYSTRUCT;

不要这样定义: typedef struct{ ...

}MYSTRUCT, *PMYSTRUCT;

2. 文件设计

2.1一个文件中只能有一个类

? 一个文件中最多只能有一个类的代码。

例外1:当两个类或多个类高度内部关联,可以合并到相同的文件

例外2:如果A类和B类关系紧密且B类只在A类中用到且B类的代码不多,可以将B类的代码放到A类的文件中。

2.2一个类至少要有一个头文件和一个执行文件

? 一个类至少要有一个头文件(.h)和一个执行文件(.cpp),如果内联函数很多的情况下还可

以考虑加一个内联文件(.inl),.inl的文件#include 在.h文件的底部

2.3安全include

? 每一个头文件都必须采取措施防止重复包含。

#if !defined(_***_H_) #define _***_H_ ...

#endif // !defined(_***_H_)

2.4最小且完全包含

? 不包含没有关系的头文件,不漏掉应该包含的文件

? 如果在头文件中只用到了类的指针,则指声明该类,而在cpp文件中再#include该

— 7 —

联众公司开发部文档《联众公司C++/C代码编写规范》

类的头文件。 例如:

为了避免重复包含 文件 a.h: class B; Class A {

B *m_pB;

}

文件 b.h class A; class B {

A *m_pA ; }

2.5联众统一的文件头

? 联众所有的代码都要加下面的头信息,并且修改文件时要修改

/******************************************************************\\ 北京联众电脑技术有限责任公司 版权所有 (文件名)

创建: (姓名) (日期) 检查: (姓名) (日期)

说明:(类的功能说明,使用说明)

更改记录------------------------------------------------------------ 修改:(日期) (姓名) (内容:修改或添加的函数或结构名称) 检查:(日期) (姓名) (内容)

\\******************************************************************/

2.6客户端文件命名

? 一般都有三个类View类的文件:GameView、OptionView、ChatView,有些游戏

不需要OptionView

2.7服务器文件命名

? 主要是 ***Game.h、***Game.cpp、GL***Service.h、GL***Service.cpp、

GL***Protocol.h 其中***代表游戏名称。

— 8 —

联众公司开发部文档《联众公司C++/C代码编写规范》

3. 类的设计

3.1 成员的排列顺序

? 类成员的排列顺序public, protected, private ? friend、static成员排在public的前面 ? 成员函数和成员变量分段写,成员函数在前

3.2 在类的定义中不能有inline函数体

? 在类的定义体中不能有内联函数体出现,使用inline声明该函数,在定义的后面或

在.inl文件中实现函数。

例外:空的函数、取值、赋值函数除外: class A {

void SetValue(int iV) { m_iV=iV; } int GetValue(void) { return m_iV; } ~A() { } }

3.3 慎用友元friend

? 应将friend成员的使用减小到最小程度。

3.4 尽量少的public和protected成员变量

? 出于数据保护考虑,应尽量少的public和protected成员变量。

特例:在类的外面使用非常多的变量,且变量不是简单的数据类型,用GetValue()和SetValue()会使程序看起来罗嗦且运行低效的情况除外。

3.5 成员变量要赋初始值

? 所有的成员变量要在构造里赋缺省值

— 9 —

联众公司开发部文档《联众公司C++/C代码编写规范》

3.6 必须有正确的拷贝构造函数和赋值函数

? 为了防止错误的使用编译器生成的缺省的拷贝构造函数和赋值函数,必须编写这两个函

数,如果觉得没有必要写他们可以使用偷懒的方法,将他们声明成私有。例如: class A {

private:

A(const A &a); // 私有的拷贝构造函数 A & operate =(const A &a); // 私有的赋值函数 };

3.7 virtual关键字的使用

? 重载虚函数时为了表明这是一个虚函数必须仍保留使用virtual关键字。 ? 析构函数前必须加virtual关键字

3.8 不允许在类中嵌套定义类

? 不允许在类中嵌套定义类,在类中签套定义类使程序可读性降低

例如: class A {

class B {

... }; ... };

3.9 注释

? 在类的头文件的顶部注释说明类的功能和使用方法

/******************************************************************\\ 北京联众电脑技术有限责任公司 版权所有 (文件名)

创建: (姓名) (日期) 检查: (姓名) (日期)

说明:(类的功能说明,使用说明)

更改记录------------------------------------------------------------ 修改:(日期) (姓名) (内容:修改或添加的函数或结构名称) 检查:(日期) (姓名) (内容)

— 10 —


代码编写规范(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《251数君王姓名学详解》

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: