当前位置: 首页 > news >正文

C++最佳实践 | 4. 可维护性

本系列是开源书 C++ Best Practises [1] 的中文版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是该系列的第四篇。

C++最佳实践:

1. 工具

2. 代码风格

3. 安全性

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] )。

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。

微信公众号: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 -

相关文章:

  • java基于springboot+vue+elementui的电子产品交流论坛
  • [编程题]抄送列表 - 牛客网题解
  • 【JavaScript】JQuery基础使用
  • 学习Python的第一天
  • 进程和线程概念和区别详解
  • “竞速”智能网联汽车,领头雁为何是长沙?
  • 程序员必须要懂的首字母大写规范
  • C primer plus学习笔记 —— 7、字符串
  • 【我的OpenGL学习进阶之旅】当你运行OpenGL程序的时候,程序并不绘制任何内容,并且白屏和黑屏的时候怎么排查?
  • 【Node.js项目】大事件项目:后台架构图(含具体技术栈)、典型代码
  • Connor学Android - JNI和NDK编程
  • DOM 重点核心
  • 基于Python、wxpython的高校教务系统设计与实现
  • python的安装教程
  • DDD 洋葱架构才是 yyds!阿里大牛手记(DDD)领域驱动设计应对之道
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • Android组件 - 收藏集 - 掘金
  • chrome扩展demo1-小时钟
  • CSS实用技巧
  • ES6系列(二)变量的解构赋值
  • exif信息对照
  • Gradle 5.0 正式版发布
  • Java 内存分配及垃圾回收机制初探
  • Javascript编码规范
  • Java知识点总结(JavaIO-打印流)
  • JWT究竟是什么呢?
  • quasar-framework cnodejs社区
  • Swift 中的尾递归和蹦床
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 工程优化暨babel升级小记
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 浏览器缓存机制分析
  • 区块链共识机制优缺点对比都是什么
  • 思考 CSS 架构
  • 鱼骨图 - 如何绘制?
  • 再次简单明了总结flex布局,一看就懂...
  • 在weex里面使用chart图表
  • linux 淘宝开源监控工具tsar
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (04)odoo视图操作
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (原)Matlab的svmtrain和svmclassify
  • (转)菜鸟学数据库(三)——存储过程
  • ./configure,make,make install的作用
  • .bashrc在哪里,alias妙用
  • .net wcf memory gates checking failed
  • .net 获取url的方法
  • .Net程序帮助文档制作
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET使用存储过程实现对数据库的增删改查
  • @javax.ws.rs Webservice注解