前令天看了文章代碼之美--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_FRONT0
盡量多用const關鍵字:
用:const int *p;// pointer to const intint * const p;// const pointer to intconst int * const p; // const pointer to const int不要用:int const *p;
類定義規範
類描述的標準頭:
/*===============================================================================Description===============================================================================*/
類名均以"id"開頭,後學單詞均以大寫字母開頭:
class idVec3;
類變數命名與通用規範中的變數命名採用相同的規則:
class idVec3 { floatx; floaty; floatz;}
類方法名命名與通用規範中函數命名採用相同的規則:
class idVec3 { floatLength( void ) const;}
類變數和方法採用更為優美的所進方式,變數類型和函數傳回值類型位於首列,變數名和方法名位於第二列:
class idVec3 { floatx; floaty; floatz; floatLength( void ) const; const float *ToFloatPtr( void ) const;}
將指標的*號置於首列,這樣有利於增強程式的可讀性。
類變數和方法的書寫順序如下:
1.list of friend classes2.public variables3.public methods4.protected variables5.protected methods6.private variables7.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 classid<name>Ctrl // dialog control classid<name>Frm // frame windowid<name>View // view windowid<name> // any other class
檔案命名規範
每個類應位於獨立的源檔案中,除非它劃分為幾個小類後更有意義。
檔案命應該與類名去掉"id"首碼相同:
class idWinding;files:Winding.cppWinding.h
當一個類被劃分到多個檔案中時,這些檔案的名字以該類名去掉"id"首碼開始,緊跟著是底線,然後是子集名:
class idRenderWorld;files:RenderWorld_load.cppRenderWorld_demo.cppRenderWorld_portals.cpp