C++最佳实践 | 4. 可维护性
本系列是开源书C++ Best Practises[1]的中文版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是该系列的第四篇。
C++最佳实践:
4. 可维护性(本文)
5. 可移植性及多线程
6. 性能
7. 正确性和脚本
可维护性
避免使用编译宏
宏在编译之前被预处理器所替换,从而使得调试非常困难,因为调试器无法知道源代码来自哪里。
// Bad Idea
#define PI 3.14159;
// Good Idea
namespace my_project {
class Constants {
public:
// if the above macro would be expanded, then the following line would be:
// static const double 3.14159 = 3.14159;
// which leads to a compile-time error. Sometimes such errors are hard to understand.
static constexpr double PI = 3.14159;
};
}
避免使用布尔值作为函数参数
在阅读代码时,布尔值无法提供任何额外含义。可以创建一个名称更有意义的独立函数,或者传递含义更明确的枚举值。
参考 http://mortoray.com/2015/06/15/get-rid-of-those-boolean-function-parameters 了解更多信息。
避免使用裸循环
了解和理解现有C++标准算法,并付诸实践。
- 参考cppreference[2]
- 观看C++ Seasoning[3]
将对[]
的调用看作是一种潜在的代码坏味道,表明没有在需要的地方使用合适的算法。
永远不要使用有副作用的assert
// Bad Idea
assert(set_value(something));
// Better Idea
[[maybe_unused]] const auto success = set_value(something);
assert(success);
在release版本中assert()
将会被删除,从而造成set_value
无法被调用。
虽然第二个版本更丑,但总比第一个错误版本好一点。
正确使用“override”和“final”
这些关键字使其他开发人员可以清楚知道虚函数可以被如何使用,如果虚函数的签名发生了变化,就可以捕获潜在错误,并有可能向编译器提示可以执行哪些优化(参考: How does the compiler benefit from C++'s new final keyword?[4])。
微信公众号:DeepNoMind
参考资料
[1]
C++ Best Practises: https://lefticus.gitbooks.io/cpp-best-practices/content/
[2]
cppreference: https://en.cppreference.com/w/cpp/algorithm
[3]
C++ Seasoning: https://www.youtube.com/watch?v=qH6sSOr-yk8
[4]
How does the compiler benefit from C++'s new final keyword?: https://stackoverflow.com/questions/7538820/how-does-the-compiler-benefit-from-cs-new-final-keyword
- END -
点击阅读原文加入知识星球
相关文章
- C++系列笔记(九)
- EasyC++68,类的类型转换
- c++语言截取字符串,详解C++ string常用截取字符串方法
- 深入理解C++11_c++ string char
- c++ auto类型_auto C++
- C++类设计和实现的十大最佳实践
- c++ 分苹果_接苹果问题C语言
- c++线程间通信_c语言两个线程如何通信
- c++的链表-C++链表
- C/C++ ImGUI劫持Dx9绘制窗体
- C/C++ 异或加密实现代码
- c 线程安全的单例模式-详解C++实现线程安全的单例模式
- OpenFSM是全网最好用的C++有限状态机
- C++的类型转换
- c++基础篇之C++ 模板
- C++三大特性之多态详解编程语言
- 排序算法的实现(C/C++实现)详解编程语言
- C++防止头文件被重复引入的3种方法(详解版)
- C++符号优先级(详细整理)
- C++取得当前时间的方法
- C++直接初始化与复制初始化的区别深入解析