c++代碼命名規範

    該命名規則爲本人總結並計劃以後使用的一套規範,參考經典C++規範及golang的命名規範,我的以爲golang在某些命名規範上比較簡潔、統一,令人易於理解,藉助於現代化的編輯工具,咱們再也不須要過於繁瑣的自說明的命名方式。golang

命名

  • 優秀的命名應當是一向的、短小的、精確的。
  • 所謂一向,就是說同一個意義在不一樣的環境下的命名應當一致,譬如依賴關係,不要在一個方法中命名爲depend,另外一個方法中命名爲rely。
  • 所謂短小,沒必要多言,當命名過長的時候,讀者可能更關注命名自己,而忽視真正的邏輯內容。
  • 所謂精確,就是命名達意、易於理解
  • 須要註釋來補充的命名就不算是好命名。
  • 使用可搜索的名稱:單字母名稱和數字常量很難從一大堆文字中搜索出來。單字母名稱僅適用於短方法中的本地變量,名稱長短應與其做用域相對應。若變量或常量可能在代碼中多處使用,則應賦其以便於搜索的名稱。
  • 作有意義的區分:Product和ProductInfo和ProductData沒有區別,NameString和Name沒有區別,要區分名稱,就要以讀者能鑑別不一樣之處的方式來區分 。
  • 函數命名規則:駝峯式命名,名字能夠長可是得把功能,必要的參數描述清楚,函數名名應當是動詞或動詞短語,如postPayment、deletePage、save。並依Javabean標準加上get、set、is前綴。例如:xxx + With + 須要的參數名 + And + 須要的參數名 + …..
  • 結構體命名規則:結構體名應該是名詞或名詞短語,如Custome、WikiPage、Account、AddressParser,避免使用Manager、Processor、Data、Info、這樣的類名,類名不該當是動詞。
  • 接口命名規則:單個函數的接口名以」er」做爲後綴,如Reader,Writer。接口的實現則去掉「er」。

 

首條經驗

聲明位置與使用位置越遠,則命名應當越長。api

 

駝峯式命名法

  • 命名規則應該使用 MixedCase
  • (不要使用 names_with_underscores)
  • 首字母縮寫詞都應該用大寫,譬如ServeHTTP、sceneID、CIDRProcessor。

文件命名規則

文件名所有小寫,能夠含下劃線或連字符,按項目約定命名,且儘可能保證文件名明確。好比:app

cmd_save_player_info_class.cc函數

my_use_full_class.cc工具

定義類的文件名通常是成對出現,如:post

foo_bar.hui

foo_bar.ccurl

如果類中含大量內聯函數,咱們還可以使用-ini.h文件,使之文件內容更加清晰,因而又如:spa

url_table.hcode

url_table.cc

url-table-ini.h

 

類型命名規則

類型命名每一個單詞首字母大寫,不含下劃線,以名詞形式,這對於全部類型命名同樣,類結構體,枚舉,類定義都是如此。好比:

class MyPalayerManager{
}

struct MyPalayerManager{
}

enum Week{
    MON;
    WEEK_NUM;
}

若是模塊的功能較爲複雜、常量名稱容易混淆的狀況下,爲了更好地區分枚舉類型,可使用完整的前綴:

enum PullRequestStatus {
    PULL_REQUEST_STATUS_CONFLICT;
    PULL_REQUEST_STATUS_CHECKING;
    PULL_REQUEST_STATUS_MERGEABLE;
}

 

常量

常量均需使用所有大寫字母組成,並使用下劃線分詞:

const int APP_VER = "1.0";

 

變量

變量名一概採用駝峯式命名規則,例如:

int playerID;

string tableName;

變量命名基本上遵循相應的英文表達或簡寫,在相對簡單的環境(對象數量少、針對性強)中,能夠將一些名稱由完整單詞簡寫爲單個字母,例如:

  • user 能夠簡寫爲 u
  • userID 能夠簡寫 uid 
  • 若變量類型爲 bool 類型,則名稱應以 Has, Is, Can 或 Allow 開頭: 
bool isExist;
bool hasConflict;
bool canManage;
bool allowGitHook;

 

類成員變量

私有成員變量首字母小寫,公有成員變量首字母大寫,(此條規則是基於通常不會有public的成員變量,大多數是以static形式提供類成員變量),好比:

class Player{
public:
    int PlayerID;
    static Player PlayerInst;
private:
    string playerName;
}

 

全局變量

首字母大寫,全局static變量首字母小寫,好比 :

int SystemTime;
static int systemTime;

 

局部變量

  • 局部變量應當儘量短小,譬如使用buf指代buffer,使用idx指代index
  • 在很長的函數中可能會有不少的變量,這個時候能夠適當使用一些長名字,可是寫出這麼長的函數,一般意味着代碼須要重構了!

 

變量命名慣例

變量名稱通常遵循駝峯法,但遇到特有名詞時,須要遵循如下規則:

下面列舉了一些常見的特有名詞:

  • 若是變量爲私有,且特有名詞爲首個單詞,則使用小寫,如 apiClient
  • 其它狀況都應當使用該名詞原有的寫法,如 APIClient、repoID、UserID
  • 錯誤示例:UrlArray,應該寫成urlArray或者URLArray
// A GonicMapper that contains a list of common initialisms taken from golang/lint
var LintGonicMapper = GonicMapper{
    "API":   true,
    "ASCII": true,
    "CPU":   true,
    "CSS":   true,
    "DNS":   true,
    "EOF":   true,
    "GUID":  true,
    "HTML":  true,
    "HTTP":  true,
    "HTTPS": true,
    "ID":    true,
    "IP":    true,
    "JSON":  true,
    "LHS":   true,
    "QPS":   true,
    "RAM":   true,
    "RHS":   true,
    "RPC":   true,
    "SLA":   true,
    "SMTP":  true,
    "SSH":   true,
    "TLS":   true,
    "TTL":   true,
    "UI":    true,
    "UID":   true,
    "UUID":  true,
    "URI":   true,
    "URL":   true,
    "UTF8":  true,
    "VM":    true,
    "XML":   true,
    "XSRF":  true,
    "XSS":   true,
}

 

參數

函數的參數和局部變量相似,可是它們默認還具備文檔的功能

當參數類型具備描述性的時候,參數名就應該儘量短小:

int AfterFunc(Duration d);

int Escape(Player p);

 

當參數類型比較模糊的時候,參數名就應當具備文檔的功能:

 

int Unix(int sec, int nsec);

bool HasPrefix(string s, string prefix);

 

函數命名規則

常規函數每一個單詞首字母大寫,使用命令式語氣,好比:

int OpenFile(const string f);

bool CheckFileName(const string f);

 

成員函數,公有函數首字母大寫,私有函數首字母小寫,好比:

class Player{ 
public: 
   void OpenFile(const string f);

private:

   void openFile(const string f);
};

 

名字空間命名

命名空間首字母大寫,好比:

namespace Network;

 

若是你必定要用到宏,全大寫加下劃線,好比:

#define PI_ROUND 3.0
相關文章
相關標籤/搜索