前令天看了文章代码之美--Doom3源代码赏析,里面提到的idTech4引擎的编码标准,看了觉得非常不错,可惜是全英文的,这里为了看起来方便,将之翻译为中文。译文如下:
通用规范
使用相当于4个空格的tab键代替空格键。
在(if,else,函数,结构体,typedefs,类定义等等)地方使用{ }:
if ( x ) {
}
else语句的起始与if语句的右括号在同一行:
if ( x ) {
} else {
}
含有括号的表达式,括号左右用空格隔开:
用:
if ( x ) {
}
代替:
if (x) {
}
用:
x = ( y * 0.5f );
代替:
x = (y * 0.5f);
对于浮点值,除非显示说明用于double,否则用精确的浮点方式赋值:
用:
float f = 0.5f;
代替:
float f = 0.5;
用:
float f = 1.0f;
代替:
float f = 1.f;
函数名用大写字母开头:
void Function( void );
由多个单词的组成的函数名,每个单词的首字母大写:
void ThisFunctionDoesSomething( void );
函数说明的标准头:
/*
====================
FunctionName
Description
====================
*/
变量名用小写字母开头:
float x;
由多个单词组成的变量,首单词用小写字母开头,后面的均用大写字母开头:
float maxDistanceFromPlane;
typedef自定义类型时,使用与变量定义同样的命名规则,但要加上"_t"作为后缀:
typedef int fileHandle_t;
struct类型定义使用与变量定义同样的命名规则,但要加上"_t"作为后缀:
struct renderEntity_t;
enum类型定义使用与变量定义同样的命名规则,但要加上"_t"作为后缀。enum结构中的常量全用大写,若含多个单词,用下划线分割:
enum contact_t {
CONTACT_NONE,
CONTACT_EDGE,
CONTACT_MODELVERTEX,
CONTACT_TRMVERTEX
};
递归函数名加上"-r"后缀:
void WalkBSP_r( int node );
define定义全部使用大写字母,含多个单词时,用下划线分割:
#define SIDE_FRONT 0
尽量多用const关键字:
用:
const int *p; // pointer to const int
int * const p; // const pointer to int
const int * const p; // const pointer to const int
不要用:
int const *p;
类定义规范
类描述的标准头:
/*
===============================================================================
Description
===============================================================================
*/
类名均以"id"开头,后学单词均以大写字母开头:
class idVec3;
类变量命名与通用规范中的变量命名采用相同的规则:
class idVec3 {
float x;
float y;
float z;
}
类方法名命名与通用规范中函数命名采用相同的规则:
class idVec3 {
float Length( void ) const;
}
类变量和方法采用更为优美的所进方式,变量类型和函数返回值类型位于首列,变量名和方法名位于第二列:
class idVec3 {
float x;
float y;
float z;
float Length( void ) const;
const float * ToFloatPtr( void ) const;
}
将指针的*号置于首列,这样有利于增强程序的可读性。
类变量和方法的书写顺序如下:
1.list of friend classes
2.public variables
3.public methods
4.protected variables
5.protected methods
6.private variables
7.private methods
这样做使得public接口在开头就很容易被发现。
当类方法不改变类成员变量时,就一定要让其成为"const"方法。
避免使用"const_cast"。
除非对象要修改其状态,否则返回"const"对象。
大多数情况下,避免使用函数重载,如:
用:
const idAnim * GetAnimByIndex( int index ) const;
const idAnim * GetAnimByName( const char *name ) const;
const idAnim * GetRandomAnim( float randomDiversity ) const;
代替:
const idAnim * GetAnim( int index ) const;
const idAnim * GetAnim( const char *name ) const;
const idAnim * GetAnim( float randomDiversity ) const;
id Studio命名规范
id<name>Dlg // dialog class
id<name>Ctrl // dialog control class
id<name>Frm // frame window
id<name>View // view window
id<name> // any other class
文件命名规范
每个类应位于独立的源文件中,除非它划分为几个小类后更有意义。
文件命应该与类名去掉"id"前缀相同:
class idWinding;
files:
Winding.cpp
Winding.h
当一个类被划分到多个文件中时,这些文件的名字以该类名去掉"id"前缀开始,紧跟着是下划线,然后是子集名:
class idRenderWorld;
files:
RenderWorld_load.cpp
RenderWorld_demo.cpp
RenderWorld_portals.cpp