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

提升C++代码质量的一些建议

文章目录

      • 1. 命名清晰
      • 2. 简洁性
      • 3. 一致性
      • 4. 注释
      • 5. 避免复杂性
      • 6. 重构
      • 7. 测试
      • 8. 错误处理
      • 9. 文档
      • 10. 代码复用
      • 11. 性能优化
      • 12. 安全性
      • - 代码规范推荐

C++开发中,写出优雅且可维护的代码不仅能提升代码质量,还能提高团队协作效率和项目长期的可扩展性。以下是根据你的描述,为这些代码规范进行的详细解析,并结合实际C++开发中的好味道和坏味道,提供相应的最佳实践。

  1. 命名清晰
  2. 简洁性
  3. 一致性
  4. 注释
  5. 避免复杂性
  6. 重构
  7. 测试
  8. 错误处理
  9. 文档
  10. 代码复用
  11. 性能优化
  12. 安全性

1. 命名清晰

好味道:

  • 使用有意义的、描述性强的命名,使代码可以自我解释。比如:
    int calculate_total_price(int item_count, int item_price);
    
    函数名 calculate_total_price 和参数名 item_count, item_price 一看就明白这个函数的意图。

坏味道:

  • 使用缩写或不清楚的名称:
    int ct_pr(int c, int p);
    
    这里的 ct_pr, c, p 都不清楚具体含义,增加了阅读成本。

最佳实践:

  • 命名应遵循一定的规则,如驼峰命名法或下划线命名法,并保持项目中命名的一致性。命名应避免缩写,除非是公认的缩写,如 id(标识符)。

2. 简洁性

好味道:

  • 通过合理的简化代码逻辑,使其简洁明了。例如:
    for (const auto& item : items) {process_item(item);
    }
    
    使用范围 for 循环代替传统循环,简化代码,提升可读性。

坏味道:

  • 冗长且重复的代码:
    for (int i = 0; i < items.size(); ++i) {process_item(items[i]);
    }
    
    这段代码虽然功能一致,但过于冗长,for 循环的初始化和条件检查在现代C++中已经有更简洁的替代方法。

最佳实践:

  • 避免不必要的冗长代码,使用C++标准库和现代特性(如 range-based for loops)来简化常见模式。

3. 一致性

好味道:

  • 统一项目中的代码风格、命名规则和缩进格式。如所有变量使用 snake_case,所有类使用 CamelCase

坏味道:

  • 项目中存在不同风格的代码:
    int getData(); // CamelCase
    int get_data(); // snake_case
    
    使用混乱的风格使代码难以维护和理解。

最佳实践:

  • 制定并遵循项目中的编码风格指南(如Google C++ Style Guide)。使用工具如 clang-format 来自动化代码格式化。

4. 注释

好味道:

  • 在必要时注释说明代码的意图或复杂逻辑:
    // Calculate the total price for the items in the cart
    int total = calculate_total_price(item_count, item_price);
    

坏味道:

  • 过度注释或注释解释显而易见的代码:
    int total = calculate_total_price(item_count, item_price); // calculate total
    

最佳实践:

  • 只在代码复杂或意图不够明确时添加注释。代码应该通过清晰的命名自我解释。避免注释解释已经显而易见的代码行为。

5. 避免复杂性

好味道:

  • 将复杂逻辑分解为更小的函数或模块:
    void process_transaction() {if (!is_valid_transaction()) {log_error();return;}update_database();send_confirmation();
    }
    
    每个函数只处理一件事,便于理解和测试。

坏味道:

  • 复杂的、难以理解的长函数:
    void process_transaction() {if (condition1 && condition2 || condition3) {// many lines of code}
    }
    

最佳实践:

  • 遵循单一责任原则(SRP),一个函数应该只做一件事。复杂的逻辑可以通过模块化和分解为多个小函数来简化。

6. 重构

好味道:

  • 定期进行代码重构,使代码更加整洁、可读。例如,将重复代码提取成单独的函数:
    void process_payment() {deduct_funds();send_receipt();
    }void process_refund() {refund_funds();send_receipt();
    }
    

坏味道:

  • 不重构和积累技术债务,导致代码难以维护和扩展。

最佳实践:

  • 定期审查代码,识别重复代码和不必要的复杂性。重构不仅限于修复问题,还可以提升代码的可扩展性和性能。

7. 测试

好味道:

  • 编写全面的单元测试,覆盖核心逻辑:
    TEST(CalculatorTest, CalculatesTotalPrice) {ASSERT_EQ(calculate_total_price(3, 100), 300);
    }
    

坏味道:

  • 缺乏测试或测试覆盖率低,导致代码的可靠性无法保证。

最佳实践:

  • 使用单元测试框架如 Google TestCatch2,确保核心功能被测试,避免回归问题。

8. 错误处理

好味道:

  • 使用 try-catch 和合适的错误处理机制:
    try {process_file(file_name);
    } catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;
    }
    

坏味道:

  • 忽略错误或简单返回错误代码而不处理:
    process_file(file_name); // No error handling
    

最佳实践:

  • 通过异常处理和错误日志记录,使代码在处理错误时更加健壮。

9. 文档

好味道:

  • 编写详细的API文档,并解释函数的作用、参数和返回值。

坏味道:

  • 缺乏文档,导致外部开发者难以理解代码的用法和意图。

最佳实践:

  • 使用工具如 Doxygen 自动生成文档,并确保文档与代码保持同步。

10. 代码复用

好味道:

  • 创建可复用的函数和模块,避免重复代码:
    void send_message(const std::string& recipient, const std::string& message) {// send message logic
    }
    

坏味道:

  • 重复代码出现在多个地方,增加维护成本。

最佳实践:

  • 遵循DRY(Don’t Repeat Yourself)原则,提取公用逻辑,使代码更加模块化和复用。

11. 性能优化

好味道:

  • 在不牺牲代码可读性的前提下优化性能:
    for (auto& element : container) {// Process element efficiently
    }
    

坏味道:

  • 过早的优化,牺牲代码的可读性和可维护性。

最佳实践:

  • 在有明显的性能瓶颈时进行优化,使用合适的数据结构和算法。

12. 安全性

好味道:

  • 采用安全的编程实践,防范常见的安全漏洞,如缓冲区溢出和SQL注入:
    std::string sanitize_input(const std::string& input) {// sanitize logic to prevent injection attacks
    }
    

坏味道:

  • 缺乏安全防范,易受到攻击。

最佳实践:

  • 遵循安全编码标准,定期检查潜在的安全漏洞。

通过遵循这些规范,可以确保C++代码不仅仅是实现功能,还具备良好的可读性、可维护性和性能。同时,定期反思和改进编码实践,能不断提升代码质量。

- 代码规范推荐

另外,为了更好地强化C++代码质量,这里推荐一份 华为C++代码规范

相关文章:

提升C++代码质量的一些建议

文章目录 1. 命名清晰2. 简洁性3. 一致性4. 注释5. 避免复杂性6. 重构7. 测试8. 错误处理9. 文档10. 代码复用11. 性能优化12. 安全性- 代码规范推荐 C开发中&#xff0c;写出优雅且可维护的代码不仅能提升代码质量&#xff0c;还能提高团队协作效率和项目长期的可扩展性。以下…...

起重机防摇摆技术如何达标-武汉正向科技

武汉正向科技防摇摆控制器 主要技术参数 1、防摇摆精度&#xff1a; 0.4 2、行车到达目标位置偏差位置偏差&#xff1a; 25mm 3、通讯方式&#xff1a;PROFINET / PROFIBUS / RS232 / RS422 / RS485&#xff1b; 4、消除载荷的摇摆达 96% 以上&#xff1b; 5、技术先进…...

[大语言模型-论文精读] MoRAG - 基于多部分融合的检索增强型人体动作生成

MoRAG--Multi-Fusion Retrieval Augmented Generation for Human Motion KS Shashank, S Maheshwari, RK Sarvadevabhatla - arXiv preprint arXiv:2409.12140, 2024 MoRAG - 基于多部分融合的检索增强型人体动作生成 1. 目录 MoRAG--Multi-Fusion Retrieval Augmented Generat…...

解决端口被占用

当你被你的编译器提醒&#xff0c; 当前端口被占用&#xff0c; 但明明你的服务什么的都没有启用&#xff0c;这时有三种解决办法&#xff1a; 1 。 重启 。 重启解决80%的问题 2 。 修改你的端口号 。 3 。 去windows命令行中查看&#xff0c;端口占用情况 第一步 &#xf…...

【递归】7. leetcode 404 左叶子之和

1 题目描述 题目链接&#xff1a;左叶子之和 2 解答思路 递归分为三步&#xff0c;接下来就按照这三步来思考问题 第一步&#xff1a;挖掘出相同的子问题 &#xff08;关系到具体函数头的设计&#xff09; 第二步&#xff1a;只关心具体子问题做了什么 &#xff08;关系…...

react+antdMobie实现消息通知页面样式

一、实现效果 二、代码 import React, { useEffect, useState } from react; import style from ./style/index.less; import { CapsuleTabs, Ellipsis, Empty, SearchBar, Tag } from antd-mobile; //消息通知页面 export default function Notification(props) {const [opti…...

Git 撤销一个已经push到远端仓库的commit

在 Git 中&#xff0c;撤销一个已经推送到远程仓库的改动有几种不同的方法&#xff0c;具体取决于你是否想要完全删除改动&#xff0c;还是只是恢复文件的某个状态。以下是常见的几种方法&#xff1a; git revert 撤销特定的commit git revert 是最安全的方法&#xff0c;因为…...

lambda表达式底层实现

一、lambda 代码 & 反编译 原始Java代码 假设我们有以下简单的Java程序&#xff0c;它使用Lambda表达式来遍历并打印一个字符串列表&#xff1a; import java.util.Arrays; import java.util.List;public class LambdaExample {public static void main(String[] args) {…...

鸿蒙NEXT开发-组件事件监听和状态管理(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...

《More Effective C++》的学习

引用与指针 没有所谓的null reference reference一定需要代表某个对象&#xff0c;所以C要求reference必须有初值。 QString &s; 使用reference可能比使用pointer更高效。 因为reference一定是有效的&#xff0c;而指针可能为空&#xff08;需要多加一个判断&#xff0…...

Leetcode面试经典150题-322.零钱兑换

给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无限的。 示…...

python17_len()函数

len()函数 A B "" C "hello world" D 18 E 18def len_test(s):try:# 尝试计算字符串的长度length len(s)return lengthexcept TypeError:# 如果不是字符串&#xff0c;则返回 None 或者提示错误return Noneif __name__ "__main__":# 单…...

车视界系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;汽车品牌管理&#xff0c;汽车颜色管理&#xff0c;用户管理&#xff0c;汽车信息管理&#xff0c;汽车订单管理系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;汽车信息&#xff0c;我…...

SQLCMD命令行工具导入数据并生成对应的日志文件

SQLCMD是一个命令行工具,专门用于在Microsoft SQL Server数据库上运行SQL脚本和管理任务。它提供了一种交互式和自动化的方式来执行SQL命令和脚本,并允许用户与SQL Server数据库进行高效的交互。以下是关于SQLCMD的详细介绍: 主要功能 执行SQL脚本: SQLCMD可以执行包含SQL…...

tauri中加载本地文件图片或者下载网络文件图片后存储到本地,然后通过前端页面展示

有一个需求是需要将本地上传的文件或者网络下载的文件存储到本地&#xff0c;并展示在前端页面上的。其实如果只是加载本地文件&#xff0c;然后展示还是挺简单的&#xff0c;可以看我的文章&#xff1a;tauri程序加载本地图片或者文件在前端页面展示-CSDN博客 要想实现上述需…...

QSqlDatabase在多线程中的使用

Qt中多线程使用数据库_qt数据库管理类支持多数据库,多线程-CSDN博客 1. 代码&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError>…...

【无人机设计与控制】Multi-UAV|多无人机多场景路径规划算法MATLAB

摘要 本研究探讨了多无人机路径规划问题&#xff0c;提出了三种不同算法的对比分析&#xff0c;包括粒子群优化&#xff08;PSO&#xff09;、灰狼优化&#xff08;GWO&#xff09;和鲸鱼优化算法&#xff08;WOA&#xff09;。利用MATLAB实现了多场景仿真实验&#xff0c;验证…...

Visual Studio C# 编写加密火星坐标转换

Visual Studio C# 编写加密火星坐标转换 1、WGS84坐标转GCJ02火星坐标2、GCJ02火星坐标转WGS84坐标&#xff08;回归计算&#xff09;3、GCJ02火星坐标转BD09百度坐标4、BD09百度坐标转GCJ02火星坐标&#xff08;回归计算&#xff09;5、坐标公共转换类6、地图显示7、程序简单界…...

微服务-流量染色

1. 功能目的 通过设置请求头的方式将http请求优先打到指定的服务上&#xff0c;为微服务开发调试工作提供便利 请求报文难模拟&#xff1a;可以直接在测试环境页面上操作&#xff0c;流量直接打到本地IDEA进行debug请求链路较长&#xff1a;本地开发无需启动所有服务&#xf…...

C语言实现 操作系统 经典的进程同步问题(2)

哲学家进餐问题 哲学家进餐问题是一个经典的同步问题&#xff0c;涉及多个哲学家试图同时用餐&#xff0c;但每个哲学家左右两边只有一把叉子。为了避免死锁和饥饿&#xff0c;可以使用记录型信号量&#xff08;也称为计数信号量&#xff09;来管理叉子的使用。 1、利用记录型…...

小熊猫Dev-C++:5分钟搞定C++开发环境的终极解决方案 [特殊字符]

小熊猫Dev-C&#xff1a;5分钟搞定C开发环境的终极解决方案 &#x1f680; 【免费下载链接】Dev-CPP A greatly improved Dev-Cpp 项目地址: https://gitcode.com/gh_mirrors/dev/Dev-CPP 你是否曾为复杂的C开发环境配置而头疼&#xff1f;是否厌倦了臃肿的IDE占用大量系…...

Go语言规则同步器airulesync:自动化聚合与更新网络过滤规则

1. 项目概述&#xff1a;一个自动同步上游规则的“规则同步器”如果你和我一样&#xff0c;长期在维护自己的网络过滤规则集&#xff0c;无论是用于广告屏蔽、隐私保护还是内容过滤&#xff0c;那么你一定对“规则更新”这件事深有体会。手动去各个开源项目的主页查看更新、下载…...

基于Next.js与Prisma构建宠物社区应用:全栈开发实战解析

1. 项目概述&#xff1a;一个为宠物爱好者打造的社区应用最近在GitHub上闲逛&#xff0c;发现了一个挺有意思的开源项目&#xff0c;叫jtsang4/happypaw。光看名字&#xff0c;“Happy Paw”&#xff08;快乐的爪子&#xff09;&#xff0c;就能猜到这八成是和宠物相关的。点进…...

别再瞎写 Prompt 了:2026年最实用的10条LLM提示词技巧

别再瞎写 Prompt 了&#xff1a;2026年最实用的10条LLM提示词技巧强烈推荐收藏&#xff01;从 OpenAI 官方指南到社区实践精华&#xff0c;每条技巧都附带 ❌ 错误示范 → ✅ 正确示范 → &#x1f4a1; 原理说明。这个问题你肯定遇到过 你打开 ChatGPT&#xff0c;输入&#x…...

别再死记硬背了!用Python手把手拆解卡尔曼滤波的‘预测-更新’循环

别再死记硬背了&#xff01;用Python手把手拆解卡尔曼滤波的‘预测-更新’循环 卡尔曼滤波在工程领域就像一位隐形的魔术师——它能从充满噪声的传感器数据中提取出真实信号。但第一次接触那些矩阵方程时&#xff0c;多数人都会陷入"每个字母都认识&#xff0c;连起来完全…...

婚宴座位规划中的优化算法:量子与经典方法对比

1. 婚宴座位规划中的优化算法对决&#xff1a;量子与经典方法谁更胜一筹&#xff1f;筹备婚礼时&#xff0c;最令人头疼的任务之一就是安排座位。去年我为自己婚礼设计座位表时&#xff0c;尝试了各种方法——从手工调整Excel表格到使用专业活动策划软件&#xff0c;结果都不尽…...

国产AI模型平台突围战:模力方舟如何用开源生态打破大厂垄断?

当全球AI竞赛进入深水区&#xff0c;中国开发者正面临关键抉择&#xff1a;是继续依赖封闭的大厂生态&#xff0c;还是拥抱更开放的本土化解决方案&#xff1f;2023年中国AI模型平台市场数据显示&#xff0c;百度千帆、阿里ModelScope、华为ModelArts三大平台占据72%市场份额&a…...

从‘Hello World’到打开PRT文件:一个完整的NX C++外部exe开发入门实战(VS2015 + NX12)

从‘Hello World’到打开PRT文件&#xff1a;一个完整的NX C外部exe开发入门实战&#xff08;VS2015 NX12&#xff09; 在工业设计领域&#xff0c;NX&#xff08;原Unigraphics&#xff09;作为一款功能强大的CAD/CAM/CAE软件&#xff0c;其二次开发能力为工程师提供了极大的…...

GPU内核优化技术:R3框架原理与实践

1. GPU内核优化基础与挑战在HPC和科学计算领域&#xff0c;GPU内核优化是提升计算效率的核心技术。内核&#xff08;Kernel&#xff09;作为GPU上执行的基本计算单元&#xff0c;其性能直接影响整个应用的运行时间。典型的优化手段包括循环展开、内存访问优化、指令级并行等&am…...

保姆级排错:Keil里J-Link选项神秘消失?手把手教你定位GD32E23等ARM-M23内核芯片的调试器兼容问题

当Keil调试器选项消失时&#xff1a;深度解析ARM-M23内核芯片的调试兼容性问题 第一次在Keil的Debug配置界面发现J-Link选项神秘消失时&#xff0c;我盯着屏幕愣了几秒钟——前一天明明还能正常使用的工具链&#xff0c;怎么突然就"罢工"了&#xff1f;这种看似"…...