id-Software编程规范

转载自最早发布在formu.ziyuesinicization.site的文章

晨魔(Morning Demon)

主要讲的是id-Software的著名FPS游戏Doom3的源代码规范,出自FPS游戏之父: 约翰-卡马克

通用规范

使用相当于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命名规范


idDlg      // dialog class
idCtrl     // dialog control class
idFrm      // frame window
idView     // view window
id         // any other class
                                

文件命名规范

每个类应位于独立的源文件中,除非它划分为几个小类后更有意义。
文件名应该与类名去掉"id"前缀相同:

当一个类被划分到多个文件中时,这些文件的名字以该类名去掉"id"前缀开始,紧跟着是下划线,然后是子集名:


class idRenderWorld;
 
files:
RenderWorld_load.cpp
RenderWorld_demo.cpp
RenderWorld_portals.cpp