C++ 代码整洁之道

news2024/10/5 21:55:44

NOTICE: 这篇文章的框架条目来自《C++代码整洁之道:C++17可持续软件开发模式实践》,作者: [德] 斯提芬·罗特。书籍原名"Clean C++: Sustainable Software Development Patterns and Best Practices with C++ 17"。

文章目录

  • 编码基本原则
    • 保持简单和直接原则(KISS)
    • 不需要原则
    • 避免重复原则
    • 信息隐藏原则
    • 高内聚原则
    • 松耦合原则
    • 小心优化原则
    • 最少惊讶原则
    • 童子军原则
  • C++代码整洁的基本规范
    • 良好的命名
      • 名称应该自注释
      • 避免冗余的名称
      • 不要用匈牙利命名法
      • 避免晦涩的缩写
    • 注释
      • 不要为易懂的代码写注释
      • 不要用注释禁用代码
      • 特殊情况的注释
    • 函数
      • 只做一件事
      • 让函数尽可能小
      • 函数命名
      • 函数的参数和返回值
    • 替换C++中的C风格代码
      • 用string代替char*
      • 使用标准容器而不是C风格的数组
      • 使用C++的类型转换代替C的强制类型转换
      • 避免使用宏
    • 资源管理
      • 智能指针
      • 避免显示的使用new和delete
  • 面向对象
    • 类的设计原则
      • 让类尽可能的小
      • 单一职责原则
      • 开闭原则
      • 里氏替换原则
      • 接口隔离原则
      • 无环依赖原则
      • 依赖倒置原则
      • 不要和陌生人说话(迪米特法则)
      • 避免类的静态成员
  • 设计模式和习惯用法
    • 依赖注入模式
    • Adapter模式
    • Strategy模式
    • Command模式
    • Command处理器模式
    • Composite模式
    • Observer模式
    • Factory模式
    • Facade模式
    • Money Class模式
    • 特例用法

编码基本原则

保持简单和直接原则(KISS)

不需要原则

避免重复原则

信息隐藏原则

高内聚原则

松耦合原则

小心优化原则

最少惊讶原则

童子军原则

C++代码整洁的基本规范

良好的命名

源代码文件名、命名空间、类、函数、模板、参数、变量、常量等等等等,都应该具有有意义且比较有表现力的名字。

名称应该自注释

  • bad examples
int num;
bool flag;
std::vector<Customer> list;
Product data;
  • good examples
unsigned int number_of_customer;
bool is_changed;
std::vector<Customer> customers;
Product ordered_product;

自注释的命名也不应该过长,如果变量的上下文很清楚,只需要要简短的描述性名称。

避免冗余的名称

  • bad example
class Customer
{
// somde code
private:
    std::string customer_name_;
};

在Customer类中已经有足够的信息能够知道name表示customer的名字了,不必要重复,重复的话违背了"Don’t Repeat Yourself "原则.

std::string string_customer_name;

不要在变量中包含变量类型。

不要用匈牙利命名法

不要在变量前面带类型前缀,在变量里面带上类型前缀,当你更改类型后还需要更改变量名,忘记改还会误导读者,匈牙利命名法在上个世纪没有强大的IDE时可能有用,但是现在提示变量类型的功能在IDE中已经非常普遍。
另外模板类怎么可能提前指定变量类型。

避免晦涩的缩写

Car ctw;	// bad
Car car_to_wash;	// good

Polygon ply1;	// bad
Polygon first_polygon;	// good

const double GOE = 9.80665;	// bad
const double gravitation_acceleration_on_earth = 9.80665; // good

注释

不要为易懂的代码写注释

customer_index++;
Customer* customer = GetCustomerByIndex(customer_index);
CustomerAccount * account = customer->GetAccount();

像这样的代码完全不需要写注释,不要低估代码阅读者的智商。

不要用注释禁用代码

特殊情况的注释

函数

只做一件事

让函数尽可能小

函数命名

函数的参数和返回值

替换C++中的C风格代码

用string代替char*

使用标准容器而不是C风格的数组

使用C++的类型转换代替C的强制类型转换

避免使用宏

资源管理

智能指针

避免显示的使用new和delete

面向对象

类的设计原则

让类尽可能的小

单一职责原则

开闭原则

里氏替换原则

接口隔离原则

无环依赖原则

依赖倒置原则

不要和陌生人说话(迪米特法则)

避免类的静态成员

设计模式和习惯用法

依赖注入模式

Dependency Injection
将组件与其需要的服务分离,这样组件就不必知道这些服务的名称,也不必知道如何获取它们。
例如:日志记录器
在这里插入图片描述
常见的注入方式有构造器注入和setter注入。

Adapter模式

把一个类的接口转为期望的另一个接口,让接口不兼容的类可以适配

Strategy模式

定义一组算法,然后封装每个算法,使它们可以相互替换,策略模式允许算法独立于使用它的客户端而变化。
例如:在需要排序的地方定义许多排序算法,快排,堆排,冒泡,希尔排序等等的,在用的时候可以选择。或者在格式化输出的地方,用纯文本、xml、json格式输出文本。

Command模式

常用在client/server架构中

Command处理器模式

Composite模式

将对象组合成树结构来表示“部分-整体”的层次结构。

Observer模式

Factory模式

Facade模式

Money Class模式

特例用法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/573432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity | HDRP高清渲染管线学习笔记:示例场景解析

目录 一、HDRP入门 1.HDRP设置 1.1 HDRP配置文件中的全部设置项 1.1.1 Rendering下的Lit Shader Mode 1.1.2 Lighting 下的Volumetrics&#xff08;体积光&#xff09;和Screen Space Reflection&#xff08;屏幕空间反射&#xff09; 2.离线渲染VS实时渲染 3.Volume组件 …

文字gif闪图怎么做?高效的gif闪图制作方法

相信不少新媒体行业的小伙伴&#xff0c;一定都见过那种闪动文字效果的gif动图吧。效果非常的炫酷还很吸引人们的眼球&#xff0c;但是作为设计小白这种闪烁gif图要怎么制作呢&#xff1f;有没有那种小白也能轻松上手的工具呢&#xff1f; 一、什么样的工具能够在线生成gif动态…

《Spring Guides系列学习》guide35 - guide40

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

项目管理自动化 工作效率顶呱呱

项目管理&#xff0c;是职场人进阶发展的必备高阶能力&#xff0c;需要在复杂的环境中有效整合资源、高效助力团队实现整体的项目目标。 一个好的项目管理者&#xff0c;需要合理规划项目进展&#xff0c;实时同步需求、及时沟通进展&#xff0c;合理判断项目风险&预警&am…

记一次用户反馈app在后台收不到push问题跟踪

我们的应该大范围推广后&#xff0c;今日用户群好多用户反馈安卓手机app在后台时收不到app的push消息&#xff0c;只有app处于前台时才能收到push消息。但是ios手机可以正常接收push消息。 拿到问题&#xff0c;首先想到从下面几个方便尝试定位&#xff1a; 1.用户手机app通知权…

财报解读:毛利持续改善,金山云正在“弯道超车”?

一季度&#xff0c;云巨头们的表现持续稳健&#xff0c;依旧稳坐前排&#xff0c;而作为中小云代表的金山云也在5月23日发布了2023年一季度财报&#xff0c;盈利能力持续改善成为通篇最亮眼的一笔。 随着AI大模型打开了新的“潘多拉魔盒”&#xff0c;云市场也在发生着巨变。 …

picoctf_2018_rop chain

小白垃圾笔记&#xff0c;不建议阅读。 这道题目其实我是瞎做的. 本地调试需要写一个文件名为flag.txt的文件。 先检查下保护&#xff1a;&#xff08;我把文件名改成pwn了&#xff09;&#xff0c;32位仅仅开启了nx 然后放到32位ida里&#xff1a; main函数如下&#xff1a…

〖Web全栈开发⑤〗— CSS基础

〖Web全栈开发⑤〗— CSS基础 (一)CSS基础1.1CSS介绍1.2CSS样式1.3CSS 格式 &#xff08;二&#xff09;CSS 选择器2.1标签选择器2.2类选择器2.3层级选择器2.4id选择器2.5组选择器2.6伪类选择器2.7通配符选择器 &#xff08;三&#xff09;样式表引入3.1外部样式表3.2内部样式表…

WPF入门实例 WPF完整例子 WPF DEMO WPF学习完整例子 WPF实战例子 WPF sql实例应用

WPF 和 WinForms 都是用于创建 Windows 桌面应用程序的开发框架&#xff0c;它们有一些相似之处&#xff0c;但也有很多不同之处。 在开发速度方面&#xff0c;这取决于具体情况。如果您熟悉 WinForms 开发并且正在开发简单的界面应用程序&#xff0c;则可能会比使用 WPF 更快…

《Spring Guides系列学习》guide41 - guide45

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

kaggle官方书籍推荐:The-Kaggle-Book

今天介绍一本kaggle出版的竞赛书籍。 这本书结合真实的kaggle竞赛题目&#xff0c;以及它们的冠军团队方案&#xff0c;介绍了参与机器学习竞赛的一些基础知识、经验技巧等。 内容涵盖Kaggle的介绍、建模问题以及技巧、如何利用Kaggle的经历来丰富简历等等。 书籍简介 参加 …

银河麒麟v4.0.2安装

银河麒麟v4.0.2安装 一、下载银河麒麟系统二、制作USB的启动镜像三、安装银河麒麟系统1、设置要被安装的机器bios启动模式为USB启动后&#xff0c;选择第一项&#xff1a;图形安装银河麒麟服务器操作系统2、设置用户和密码&#xff0c;右下角有继续&#xff0c;点击继续下一步3…

Axure教程—水平方向多色图(中继器)

本文将教大家如何用AXURE制作动态水平方向多色图 一、效果介绍 如图&#xff1a; 预览地址&#xff1a;https://l83ucp.axshare.com 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87822666 二、功能介绍 简单填写中继器内容即可生成动态水平多色…

操作系统层面下——进程状态讲解

目录 一.进程的状态&#xff1a;运行态 1.什么是运行状态&#xff1f; 2.进程进入内存的详细图解&#xff1a; 总结&#xff1a; 二.进程的状态&#xff1a;阻塞态 1.什么是阻塞状态&#xff1f; 三.进程的状态&#xff1a;挂起态 1.什么是挂起态&#xff1f; 2.阻塞与挂起的…

xss跨站之代码及http only绕过

什么是http only&#xff0c;在cookie中设置了http only属性&#xff0c;那么通过js代码无法获取cookie&#xff0c;并不能防止xss漏洞&#xff0c;在上一节的靶场网站源代码里面&#xff0c;写上这一串代码就是启动http only 再加上带去cookie的代码 然后我们再去访问网站的后…

线程池各参数学习

线程池学习_alutimo的博客-CSDN博客尚硅谷java并发包JUC线程池部分学习总结https://blog.csdn.net/qq_41228145/article/details/125650075老生常谈 线程池的参数ThreadPoolExecutor.java 的构造器 /*** Creates a new {code ThreadPoolExecutor} with the given initial* par…

PLC【西门子】几种常见的连接口和通讯协议简介

S7-200 PLC支持的几种通讯协议 一、PPI通讯 是西门子公司专为s7-200系列plc开发的通讯协议。内置于s7-200CPU中。PPI协议物理上基于RS-485口,通过屏蔽双绞线就可以实现PPI通讯。PPI协议是一种主-从协议。主站设备发送要求到从站设备,从站设备响应,从站不能主动发出信息。主…

简述什么是微前端 微前端几种框架的区别

微前端就是将各个模块分成不同项目 方便多个团队一起开发互相不影响 例如&#xff1a;a团队维护较老的项目使用angular&#xff0c;b团队开发react&#xff0c;c团队开发vue 。按道理说abc三个项目并没有关联&#xff0c;但是他们又都是公司内部管理的系统。需要集成在一起 &…

智能排班系统 【管理系统功能、操作说明——中篇】

文章目录 页面与功能展示企业管理角色管理用户管理系统管理员身份使用企业管理员身份使用门店管理员身份使用 门店管理职位管理排班规则设置节日管理消息管理 页面与功能展示 企业管理 企业管理页面如图 34所示&#xff0c;在企业管理页面&#xff0c;系统管理员可以查询所注…

IAT Hook

一、IAT HOOK介绍 IAT (Import Address Table) HOOK 是一种在 Windows 程序中进行函数钩子的技术。它通过修改程序的导入地址表来实现对目标函数的替换或拦截。 在 Windows 运行时&#xff0c;程序需要调用其他模块&#xff08;DLL&#xff09;中的函数来完成特定的功能。为了…