前令天看了文章代码之美--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 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