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

C++学习笔记----2、使用C++进行优雅编程(十)---- 格式化

        许多人因为编程风格的问题被搞得焦头烂额,就因为对于在if中使用几个空格争论不休,导致友谊的小船说翻就翻。如果公司有相应的编程规范,只能说你比较幸运。因为有可能你不喜欢这些规范,但做为一个正常人来讲,至少有规范可循,而不用因为这些东东而陷于无谓的争执之中。如果确实没有编程规范,我建议还是建立这样的编程规范为好,编程规范可以让大家使用统一的命名方式,格式化的规则等等,使代码统一化,易于阅读和理解。

        当然了,也有一些自动化工具,在将代码提交到版本控制系统之前,依据特定的规则进行格式化。有些IDE,比如Visual Studio 2022,当保存代码文件时,可以自动地格式化代码。

        如果你的团队当中,每个人都坚持自己的编码风格,要对别人宽容些。你会慢慢发现,有些只是喜好的问题,而有些则比较严重了,使团队合作陷于崩溃,还记得那天我给出的那个令人崩溃的小视频吗?

1、{}的位置

        可能争论最多的就是{}的位置摆放问题,至少有好几种对于{}摆放位置的编程风格,除了类、函数、成员函数之外,把{放到同一行代码的开始位置,看一下例子吧:

	void someFunction(){if (condition()) {println("condition was true");} else {println("condition was false");}}

        这样的格式,既保留了代码块的结构化,又使得代码紧凑而不显得臃肿,不失为一种好的编程风格。

        有些程序员就不怎么认可,认为{}与系统保留字之间的空格看着就不舒服,认为{}都应该单独占用一行,这样{}之间的对应也好找。看例子:

	void someFunction(){if (condition()){println("condition was true");}else{println("condition was false");}}

        很长一段儿时间,我都比较认可这种编程风格,好处是显而易见的,也在上面进行了描述,但仔细看来,当然是与第一种风格比较,把这些本来可以与其他行合并的{}单独占用一行,是否有必要,是否拉长了代码的长度,对于工程化的代码来讲,单页中的代码是否包含的内容相应减少,会不会扰乱或者分散阅读维护代码程序员的注意力与精力。当然了,这都是仁者见仁,智者见智的提法,不代表什么是正确,什么是错误。

        我们继续,基于上一种编码格式,有的程序员坚持认为单独占用一行的{}也应该进行水平缩进,当然了,除了类、函数与成员函数外,使得代码看起来像这样:

void someFunction()
{if (condition()){println("condition was true");}else{println("condition was false");}
}

        不得不说,这也是一种风格,至于怎么样,还是那句话,不比不知道,一比吓一跳,这也有点儿太做作了吧,但没有办法啊,有人就是喜欢啊。

        还有就是,有人认为,单独的一行代码是没有必要使用{}的,代码看起来是这样:

	void someFunction(){if (condition())println("condition was true");elseprintln("condition was false");}

        看,如果是单独争论以上代码使用{}风格问题的话,这好像是一个完美的解决方案,看起来是这样啊,我不用{},总不会有{}使用格式的问题吧,但我要说的是,真的有问题,随着时间的推移,if、else中的代码要增加,如果没有{},一种可能就是写出了错误的代码,你默认其是在{}中的,潜意识当中原有代码的作者是把框架搭好了的,我不用去管程序结构的问题,前人种树,我来乘凉就行了。细心的程序维护人员会注意到这个问题,再把相应的{}加上。从我个人的观点来说,虽然盖房子的不需要考虑装修人员的事儿,但你总得把房子盖得干净利落吧,把结构还是给人搭好吧。

2、对于空格与括号的使用

        单行的格式也可能成为大家争论的焦点,我是不论谁是谁非的,但是你可能会遇到一些不同的风格,我们再讨论讨论吧:

        首先是空格的使用,在任何关键字之后要用空格,在任何的操作符之前要用空格,在参数列表或调用的每一个逗号之后要用空格,表明运算顺序的括号外面要用空格,看例子:

	if (i == 2) {j = i + (k / m);}

        另外一种方式,就是把if当作函数格式一样使用,在if与(之间不加空格,还有就是省略了明确标明运算顺序的(),因为它在语法上有或没有都是一样的,如下:

	if( i == 2 ) {j = i + k / m;}

        差别是微妙的,孰是孰非,就像武则天的无字碑一样,留待后人评说吧。当然,必需要指出的是,if不是函数,是判断语句的系统关键字。

3、空格、制表符与换行符

        对于空格与制表符的使用可不简单是一个风格喜好的问题,相信大家在编程过程中已经饱尝其苦了,如果没有好的编程规范,先不用说有的用空格,有的用制表符,就是对于制表符使用不同长度就会在代码中显得凌乱,简直不忍直视,我是深切地体会到这一点的,我曾经用我设置的编译器打开别人的代码,我们对于制表符的设置完全不一样,代码像一团乱麻,完全无法阅读,更无法帮助别人查找代码的bug,由于我们分属不同团队,无法说谁对谁错,只能说不同的规则给团队合作带来了太多的内耗。

        并不是所有的编辑器都支持对制表符长度的定义,所以是用制表符还是用空格,其实不是一个需要讨论的问题,因为谁也不愿意写代码时啪啪啪啪敲四个甚至更多空格,太劳民伤财了。但需要记住的是,在程序中空格就是空格,制表符就是制表符。

        还有一个就是换行符,换行符在不同的编程环境下面是不同的,在Windows环境下,换行符是/r/n,在LINUX环境下就是\n,如果大家在不同的编程环境下协作开发,建议大家还是约定一下,不要因为这些小节影响开发进度,当然了,大家也很清楚,大的问题都是这些小的小节引起的,还是中国的老话说得好啊:千里之堤毁于蚁穴。

4、编程风格的挑战

        许多程序员在开始一个新项目时,都会发誓说这次我一定要把所有的事情都做对,不论何时,如果一个变量或者参数不会被修改,就要定义成const,所有的变量都要有明确的,准确的可读的名字,所有的开发者都要把{放置到第二行的开头,应用标准的编辑器,对空格与制表符进行规范,等等等等。

        其实吧,由于一些客观原因,以上发誓要遵守的这些编程风格实际上很难坚持,你还别不信,当然了,我不是不相信你的毅力,我说的是实际上,是客观上,不以你的意志为转移的,还是举例说明最好使,那就举例吧,假如有一个你一开始认为不会在程序中改变的值,你把它定义为了const变量,在你所写的代码中,一直坚持下来了,但突然,你要把这个值当作参数传递给要调用的外部函数,而外部函数中对这个参数的定义不是const的,你怎么办?当然外部函数肯定也不会改变这个参数的值,要求外部函数修改参数定义,不可能的,白日梦还是不要做了,当然,如果你经验足够丰富,是个老手,并不是不能完美解决这个问题,只需要使用const_cast()临时将其const属性去掉,但如果你没有这方面的经验,怎么办呢?只能是将const属性去掉,并且,基于这样的经历,你会将之视为财富,所有变量都不会再定义成const的,别人问你时,你还把这个案例当作痛苦的经验教训告诉别人,说你不用const是事出有因的,殊不知,是你的能力限制了你的创造力,而积累的又不是宝贵的成熟经验,唉,一言难尽啊。

        有些时候,标准化与程序员自身的喜欢与基础背道而驰,使用严格的编程规范与团队文化也格格不入。在这种情况下,你可能就要想办法了,走中间路线,和而不同,诸如此类吧,其实你懂得,说白了,就是不要看广告,要看疗效呗。像变量命名与制表符长度,这些是一定要坚持的;而像使用空格了,注释的格式了,就根据个人喜好自己定吧。当然你也可以利用外部或者自己写一些脚本来修正其不规范的格式,当然了,也有开发环境能够自动格式化相关代码的,如Microsoft Visual Studio 2022,使用这样的利器,就可以将按规范写代码变成了微不足道的小事。

相关文章:

C++学习笔记----2、使用C++进行优雅编程(十)---- 格式化

许多人因为编程风格的问题被搞得焦头烂额,就因为对于在if中使用几个空格争论不休,导致友谊的小船说翻就翻。如果公司有相应的编程规范,只能说你比较幸运。因为有可能你不喜欢这些规范,但做为一个正常人来讲,至少有规范…...

双指针| Java | (hot100) 力扣283, 11, 15, 42做题总结

leetcode 11 盛最多水的容器 双层for循环暴力 超出时间限制 class Solution {public int maxArea(int[] height) {int h0;int v0;for(int i0; i<height.length; i) {for(int ji1; j<height.length; j) {h Math.min(height[i],height[j]);v Math.max(v, h*(j-i));}}…...

matlab求解方程

【MATLAB】求解含有三角函数的方程_matlab求解三角函数方程-CSDN博客 Matlab求解方程或函数的根&#xff0c;root,fzero,solve,fsolve的区别_matlab root-CSDN博客 非线性方程(组)&#xff1a;MATLAB内置函数 solve, vpasolve, fsolve, fzero, roots [MATLAB] - GentleMin - …...

MySQL基础--视图,存储过程

介绍 视图是一种虚拟存在的表&#xff0c;视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&#xff0c;视图只保存了查询的 SQL 逻辑&#xff0c;不保存查询结果&#xff0c;所以我…...

学习记录第二十六天

进程运行 1&#xff0c;子进程和父进程做相同的事----创建子进程 执行任务 2&#xff0c;子进程做与父进程不同的事 ----fork exec exec族 l VS v :主要是第二个参数的传参方式不同 p :表示寻找可执行文件 是通过PATA环境变量 e : 表示可以给…...

Polars简明基础教程十一:可视化(一)

到本次讲座结束时&#xff0c;你将能够&#xff1a; 使用Polars的内部plot方法从Polars创建图表使用外部绘图库从Polars创建图表了解这些库如何支持Polars 通常&#xff0c;需要可视化库的最新版本来实现最大程度的兼容性 import polars as plimport hvplot as hv import ma…...

实战项目:贪吃蛇游戏的实现(上)

前言 Hello, 今天我们来一起完成一个实战项目&#xff1a;贪吃蛇。 相信大家都不会对这个游戏感到陌生&#xff0c;贪吃蛇游戏是久负盛名的游戏&#xff0c;他和俄罗斯方块&#xff0c;扫雷游戏等游戏位列世界经典游戏之列。这次我们旨在通过实战项目贪吃蛇的实现&#xff0c…...

SHT30温湿度传感器全解析——概况,性能,MCU连接,样例代码

常见温湿度传感器测量范围&#xff1a;(价格仅供参考&#xff0c;具体性能要看折线图) 型号DHT11DHT20AHT10AHT20AHT30SHT20价格&#xffe5; 2.49&#xffe5;3.04&#xffe5; 1.9&#xffe5;1.4&#xffe5; 1.3&#xffe5;5.5温度测量范围20—90%RH0—100%RH0—100%RH0—…...

SQL server 同环比计算模板

1、计算 月 年 季度的环比和同比 计算公式如下&#xff1a; 环比增长率 &#xff08;本期数 - 上期数&#xff09; / |上期数| 100% 同比增长率 &#xff08;本期数 - 同期数&#xff09; / |同期数| * 100% --- dbo.ads_erp_finance_gross_profit_actual_invoice_yoy_m…...

python发送外部请求

在Python中&#xff0c;服务器发送外部请求是一个常见的操作&#xff0c;尤其是在需要集成不同服务或API时。有多种库可以帮助你完成这项任务&#xff0c;但最流行和广泛使用的库之一是requests。以下是如何使用requests库在Python服务器中发送外部请求的基本步骤&#xff1a; …...

c++并发编程面试题

1. C中lock_guard和unique_lock的区别&#xff1f; 在C中&#xff0c;lock_guard和unique_lock都是用于管理互斥锁的类&#xff0c;它们提供了一种 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;机制来确保锁在作用域结束时自动释放。尽管它们的目的相…...

K8S上安装LongHorn(分布式块存储) --use

要在 Kubernetes上安装 LongHorn&#xff0c;您可以按照以下步骤进行操作&#xff1a; 准备工作 参考 官网教程将LongHorn只部署在k8s-worker5节点上。https://github.com/longhorn/longhorn 安装要求 Each node in the Kubernetes cluster where Longhorn is installed must f…...

2024年前端技术发展趋势分析

2024年的前端技术发展趋势继续受到快速变化的技术环境和不断增长的用户期望的影响。以下是2024年前端技术发展的几个关键趋势&#xff1a; 1. Web 组件和自定义元素 Web 组件技术&#xff08;包括 Shadow DOM、HTML Templates 和 Custom Elements&#xff09;正在成为构建可重…...

spring boot 笔记大杂烩

一&#xff0c;springboot项目创建 springboot创建时idea会打开start.spring.io失败报错 可以手动打开这个页面&#xff0c;然后选择maven项目&#xff0c;然后修改group和name名然后添加依赖web&#xff0c;然后生成项目包&#xff0c;解压缩后用idea打开就能用了 运行后报错…...

如何在香港云服务器上优化网站性能?

在香港云服务器上优化网站性能可以通过以下几种方式进行&#xff0c;确保用户从全球各地访问时获得快速、稳定的体验&#xff1a; 1. 使用内容分发网络 (CDN) 优势&#xff1a;CDN可以将静态内容&#xff08;如图像、视频、CSS、JavaScript文件&#xff09;缓存到全球多个节点…...

STM32低功耗与备用备份区域

STM的备份备用区域其实就是两个区块&#xff1a;BKP和RTC。低功耗则其实是STM32四种模式中的三种耗能很低的模式。 目录 一&#xff1a;备用区域 1.BKP 2.RTC 二&#xff1a;低功耗模式 1.睡眠模式&#xff1a; 2.停机模式&#xff1a; 3.待机模式&#xff1a; 一&…...

武汉某汽配公司携手三品软件 共绘PLM项目新蓝图

近日&#xff0c;三品软件与武汉某汽配公司达成战略合作&#xff0c;双方将共同启动PLM项目&#xff0c;以助力该公司在汽车制造业的研发管理领域实现全面升级。 客户简介 该公司自2008年成立以来&#xff0c;一直专注于为汽车制造业提供自动化输送系统、车辆装配的合装技术和…...

uniapp多图上传uni.chooseImage上传照片uni.uploadFile,默认上传9张图

uniapp多图上传uni.chooseImage上传照片uni.uploadFile 代码示例&#xff1a; /**上传照片 多图*/getImage() {uni.chooseImage({count: 9, //默认9sizeType: [original, compressed], //可以指定是原图还是压缩图&#xff0c;默认二者都有sourceType: [album], //从相册选择/…...

MySQL——内置函数

时间函数 select * from msg where date_add(sendtime, interval 2 minute) > now(); 理解&#xff1a; ------------------------------|-----------|-------------|------------------ 初始时间 now() 初始时间2min 字符串 length函数返回字符串长度&#xff0c;以字节为…...

2024年最新版小程序云开发数据模型的开通步骤,支持可视化数据库管理,支持Mysql和NoSql数据库,可以在vue3前端web里调用操作

小程序官方又改版了&#xff0c;搞得石头哥不得不紧急的再新出一版&#xff0c;教大家开通最新版的数据模型。官方既然主推数据模型&#xff0c;那我们就先看看看新版的数据模型到底是什么。 一&#xff0c;什么是数据模型 数据模型是什么 数据模型是一个用于组织和管理数据的…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...