c++代码命名规范

主宰稳场 提交于 2019-12-18 15:36:48

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

    该命名规则为本人总结并计划之后使用的一套规范,参考经典C++规范及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”。

 

首条经验

声明位置与使用位置越远,则命名应当越长。

 

驼峰式命名法

  • 命名规则应该使用 MixedCase
  • (不要使用 names_with_underscores)
  • 首字母缩写词都应该用大写,譬如ServeHTTP、sceneID、CIDRProcessor。

    文件命名规则

    文件名全部小写,可以含下划线或连字符,按项目约定命名,且尽量保证文件名明确。比如:

    cmd_save_player_info_class.cc

    my_use_full_class.cc

    定义类的文件名一般是成对出现,如:

    foo_bar.h

    foo_bar.cc

    若是类中含大量内联函数,我们还可使用-ini.h文件,使之文件内容更加清晰,于是又如:

    url_table.h

    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

     

     

    标签
    易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
    该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!