變量命名規則

 

iPhone項目命名規則
撰寫人:iPhone小組
撰寫時間:2011-3-22
1. 命名
1.1.1                不要聲明以一個或多個下劃線 ('_') 開頭的名稱
開頭帶有一個下劃線(“_”)的名稱通常由庫函數(“_main”和“_exit”)使用。開頭帶有兩個下劃線(“__”)或一個下劃線後接一個大寫字母的名稱保留給編譯器內部使用。
名稱還要避免下劃線相鄰,否則很難識別下劃線的確切個數。
1.1.2                不要使用兩個相連的下劃線
只通過大小寫才能區分的類型名稱,它們間的差異是很難記憶的,也就很容易造成混淆。
1.1.4                避免使用縮寫
應用領域中常用的縮寫(如 FFT 指快速傅立葉變換),或在項目縮寫清單中有定義的縮寫,才能使用相應的縮寫。否則,很有可能相似但不相同的縮寫到處出現,之後就引進了混淆和錯誤(如將 trackIdentification 縮寫成 trid、trck_id、tr_iden、tid、tr_ident等)。
1.1.5                選擇清晰的、易辨認的、有意義的名稱
從應用的角度選擇名稱,名詞使用形容詞修飾來提高局部(具體上下文)的含義。確保名稱與其類型保持一致。
選擇合適的名稱,使以下結構:
objectName.FunctionName(...);
objectName->FunctionName(...);
[objectName FunctionName(...);
易於閱讀並有實際含義。
不要使用短名稱或縮寫名稱,也不要太長,以免編譯截斷名稱。使用人們熟知的 E 作爲自然對數的底數或 Pi 作爲圓周率是例外。
示例:

原代碼:
void SetForegroundColor(CColor fg)
讀者直覺上會認爲 fg 意指 foreground(前景);但是,任何一個好的編程風格都不應留給讀者作直覺推導的餘地。
 
void SetForegroundColor(CColor foreground)
{
theForegroundColor = foreground;
}     
當使用參數 foreground(遠離其聲明)時,讀者會認爲 foreground 實際上就是指 foreground 的顏色。可以想象,它能代表任何一種可暗中轉化爲color的類型。 
推薦風格:
void SetColor(CColor newColor)
{
...
theColor = newColor;
...
}
newColor 進行了限定使它與其類型一致;因此增強了函數的語義。
1.1.6                使用名稱的正確拼寫
英語字符名稱部分應正確的拼寫,遵守項目要求的形式,如使用一致的英國英語或美國英語,但不能同時使用。這對註釋也同樣適用。
1.1.7                布爾值使用正值謂詞從句
對布爾值類型的對象、函數及函數實參使用正值形式的判定句式,如FoundIt、IsAvailable,但不使用IsNotAvailable。
 
使用簡單形式的常用名詞或名詞短語,爲類取名時要表達出它的抽象含義。基類使用更通用的名稱,而對派生類使用更專用的名稱。
typedef ... Reference; //出自標準庫
typedef ... Pointer;   //出自標準庫
typedef ... Iterator; //出自標準庫
struct tagPoint{....};
class CBankAccount {...};
class CSavingsAccount : public CBankAccount {...};
class CCheckingAccount : public CBankAccount {...};
1.2.2              類名
  • Objective-C開發的類以大寫字母“C”開頭,其後每一個單詞都以大寫字母開頭
      如:CGlobalLocation,CFont,CDialog
 
1.2.3              結構名
結構名加小寫前綴"tag",結構“}”之後其後每一個單詞都以大寫字母開頭
例:
typedef struct tagPoint
{
    int nx;
    int ny;
} Point;
1.2.4              枚舉名
枚舉名前加小寫字母“enu”,在“}”之後全部大寫,單詞之間以下劃線“_”相連。
全部大寫
例:
typedef enum enuKFILE_OPEN_MODE
{
    OPEN_READONLY = 0,
    OPEN_READWRITE = 1,
    CREATE_ALWAY = 3
} KFILE_OPEN_MODE;
1.2.5              前後綴
  • 如果是派生類應在其類名中使用後綴來包含其基類信息,並且取名應能較準確描述該類的含義,否則不加後綴。
          如:CColorDlg,CEditView,COleServerDoc等。
  • 當對象和類型的名稱衝突或缺少合適的名稱時,對象使用簡單名稱,類型名稱添加後綴 mode、kind、code 等。
  •  
變量名的命名遵從匈牙利記法。即:前綴 + 類型 + 變量名
 [m_|g_] type [class name|struct name] variable name
1.3.2              變量名使用混合大小寫,並以小寫字母開頭。
         如:long nTemp; //normal
              long NTemp; //abnormal
      LPCTSTR lpszMenuName;
聲明常量,宏,枚舉常量時應全部使用大寫字母,單詞之間以單下劃線相連。
            如:const   double       PAI=3.1415926;   //noraml
         const   double            Pai=3.1415926;   //abnoraml
        #define            PAI         3.1415926       //normal
            #define             Pai         3.1415926       //abnormal
 enum Color{RED,BLUE,GREEN}; //normal
 enum Color{red,blue,green};    //abnormal
  • 當使用混合大小寫時,將修飾詞放在前面,並且儘量拼寫完整增加可讀性。如:maxElement,currentFile 等。
  • 當全部使用大寫時,單詞之間應用下劃線連起來。如:BUFFER_SIZE,FILE_SIZE 等。
  • 一律使用英文字母進行拼寫;不用漢語拼音。
1.3.6              變量名大小在2~20個字母,避免單字母變量。
變量名大小應至少2~3個以上的字母,避免單字母變量。當變量單純作爲整型循環變量時,可以使用單個字母。如:i,j,k等。
                     例:chrName,hWnd等。
         如:icu_nNumber,dom_chrSelect.
        如:g_nNumber,g_nSelect.
      如:pMemDC,pGUIFactory,g_pCtrl 。
對象變量命名除了具備普通變量的規則,還包括:
 如:m_bConnection,m_chrName 。
如:ms_bConnection,ms_chrName 。
1.4.3              標準類/結構變量名要加上它的標準前綴或後綴;
                      如:dlgFileOpen,strName,mainWnd,memDC
如果類/結構沒有縮寫命名,不用加類/結構名前後綴。
                             如 localHttpProxy,domSomeObject,newPlan;
應該用一致的前(後)綴來命名同一類對象(或指向對象的指針),使人們容易識別對象(指針)的類型。
  • 所有函數名以儘量以動詞開始,大寫第一個字母,其後每個單詞以大寫開頭,儘量採用組合詞表示其功能
              如: CreateWindow,GetValue,FindNextObject
  • Window系統的消息處理函數要求用加前綴On,如OnMouseMove()
  • 對無返回值的函數(函數聲明爲 void 返回類型)或返回值使用指針或引用類型的函數,使用動詞或動詞短語。
  • 對使用非 void 返回類型返回唯一一個值的函數,使用名詞或名詞短語。
  • 對帶有常用操作(行爲模式)的類,使用項目選項列表中的操作名。例如:begin, end, insert, erase (標準庫中的容器操作).
  • 返回布爾值(謂詞)的函數使用形容詞(或過去分詞)。謂詞經常使用名詞前添加前綴 is 或 has 的形式使名稱表達一個肯定的聲明。當對象、類型名或枚舉型常量也使用簡單名稱時,這也同樣非常有用。時態上要保持一致,力求準確。
示例
void Insert(...);
void Erase(...);
 
Name FirstName();
bool HasFirstName();
bool IsFound();
bool IsAvailable();
  • 不要使用否定意義的名稱,因爲這會導致雙重否定表達式出現(如 !isNotFound);這使得代碼更難以理解。有些情況下,通過使用反義詞,如“IsInvalid”代替“IsNotValid”,可以使否定謂詞變成肯定的而不需改變其語義。
示例
bool IsNotValid(...);
void FindClient(CName withTheName, bool& notFound);
Should be re-defined as:
bool IsValid(...);
void FindClient(CName withTheName, bool& found);
當需要使用同一通用含義時,使用函數的重載
當操作目的相同時,使用重載而不使用同義詞;這儘量減少了系統中概念的數量和不同的操作,因此也就降低了整體的複雜性。
當重載操作符時,要確保操作符的語義保留了下來;如果不能保留約定俗成的操作符含義,則爲函數選用另一個名稱而不使用操作符重載方式。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章