MC++编码风格探讨 - 标识符命名风格
-
import std; namespace mcpplibs { // 1.命名空间全小写 class StyleRef { // 2.类型名大驼峰 private: int data_; // 3.私有数据成员 xxx_ std::string fileName_; // std::string public: // 4. 构造函数 / Rule of Five(Big Five)单独放一个 public 区域 StyleRef() { } StyleRef(const StyleRef &obj) { /* ... */ } StyleRef(StyleRef &&) { /* ... */ } StyleRef & operator=(const StyleRef &) { /* ... */ } StyleRef & operator=(StyleRef &&) { /* ... */ } ~StyleRef() { /* ... */ } public: // 5.公有函数区域 // 函数名 下划线分割 / snake_case /* 7. fileName 小驼峰 */ void load_config_file(std::string fileName) { // 成员函数如无特殊要求接口和实现不分离 parse_(fileName); } private: // 6.私有成员函数以 `_` 结尾 void parse_(std::string config) { } }; }
- 一、
标识符命名风格- 1.0 类型名 - 大驼峰
- 1.1 对象/数据成员 - 小驼峰
- 1.2 函数 - 下划线(snake_case)
- 1.3 私有表示 -
_后缀 - 1.4 其他
- 一、
-
对于编码风格比如类型别名统一用using关键字,除非导出C库使用typedef;
类型别名最好放在命名空间内,或者类作用域内或者函数内;
try catch别用或只用在程序的致命性问题,错误码和错误信息字符串还是广泛使用的;
函数传参尽量多使用引用,在语法层面解决访问野指针的问题,想要优化参数构造或返回值为类的对象一般就用右值引用;
在可以的情况下,类尽量都实现classname& operator=(右值引用){......};
类最好不要可以定义强制类型转换函数,还是函数更好理解一点;
类最好保留一个空实现的构造函数,或者只限于把所有的成员变量都初始化为0......;
对于类成员有指针并且明确申请堆内存的最好用智能指针,要么自行管理好生命周期; -
模板类尽量实例化常用的类型,以便减少编译时间;
模板类或模板函数尽量限制能传入的参数类型,本质上模板做的就是函数重载的事;
如果是某些数据转换或者方便后期维护,尽量还是用命名空间内的内联函数定义或尽量在编码早期就确定下来,少使用魔法宏......对于#define WINAPI __stdcall, #define TRY try{, #define END_TRY }, #define MAX(...) ......,还是比较痛恨的;
如果不兼容以前版本的c++,尽量不要对关键字使用宏(毕竟c++或者c来说对于关键字的更改基本都很少);
函数尽量加上属性一类的定义比如[[nodiscard]], [[deprecated]]等; -
@SkyWingF 在 MC++编码风格探讨 - 标识符命名风格 中说:
模板类尽量实例化常用的类型,以便减少编译时间;
模板类或模板函数尽量限制能传入的参数类型,本质上模板做的就是函数重载的事;
如果是某些数据转换或者方便后期维护,尽量还是用命名空间内的内联函数定义或尽量在编码早期就确定下来,少使用魔法宏......对于#define WINAPI __stdcall, #define TRY try{, #define END_TRY }, #define MAX(...) ......,还是比较痛恨的;
如果不兼容以前版本的c++,尽量不要对关键字使用宏(毕竟c++或者c来说对于关键字的更改基本都很少);
函数尽量加上属性一类的定义比如[[nodiscard]], [[deprecated]]等;@SkyWingF 在 MC++编码风格探讨 - 标识符命名风格 中说:
对于编码风格比如类型别名统一用using关键字,除非导出C库使用typedef;
类型别名最好放在命名空间内,或者类作用域内或者函数内;
try catch别用或只用在程序的致命性问题,错误码和错误信息字符串还是广泛使用的;
函数传参尽量多使用引用,在语法层面解决访问野指针的问题,想要优化参数构造或返回值为类的对象一般就用右值引用;
在可以的情况下,类尽量都实现classname& operator=(右值引用){......};
类最好不要可以定义强制类型转换函数,还是函数更好理解一点;
类最好保留一个空实现的构造函数,或者只限于把所有的成员变量都初始化为0......;
对于类成员有指针并且明确申请堆内存的最好用智能指针,要么自行管理好生命周期;有点 off-topic 了,建议在对应的帖子讨论(暂时可能还没有)
-
@SkyWingF 后面给项目增加一个 类似 "最佳实践" 章节总结这些:
- 类型别名用using 代替 typedef
- 引用的使用
- 尽量少使用宏 非必要不使用
- 属性标识 [[nodiscard]], [[deprecated]]
- ...