当前位置: 首页 > 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;什么是数据模型 数据模型是什么 数据模型是一个用于组织和管理数据的…...

智慧水库大坝安全监测预警系统解决方案

前言 水库大坝作为重要的水利设施&#xff0c;承载着防洪涝、灌溉、发电等功能&#xff0c;关系着无数人的生命财产安全&#xff0c;一旦发生意外事故&#xff0c;后果将不堪设想&#xff0c;因此需要建立一套水库大坝安全监测预警系统解决方案。 系统概述 水库大坝安全监测…...

基于SpringBoot+VUE的社区团购系统(源码+文档+部署)

主要内容&#xff1a;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能与大数据、单片机开发、物联网设计与开发设计、简历模板、学习资料、面试题库、技术互助、就业指导等 业务范围&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写…...

LeetCode 3151. 特殊数组 I【数组】简单【Py3,C++,Java,GO,Rust】

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

超级字符串技能:提升你的编码游戏

嘿嘿,uu们,今天咱们来详解字符函数与字符串函数,好啦,废话不多讲,开干&#xff01; 1.:字符分类函数 C语言中又一系列的函数是专门做字符分类的,也就是一个字符属于什么类型的字符的,这些函数的使用需要包含头文件ctype.h 这些函数的使用方法都十分类似,博主在这里就举两到三个…...

米联客-FPGA程序设计Verilog语法入门篇连载-16 Verilog语法_时钟分频设计

软件版本&#xff1a;无 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用所有系列FPGA 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑&#xff01; 1概述 本小节讲解Verilog语法的时钟…...

【Echarts】custom自定义图表实现甘特图

效果图 主要注意点&#xff1a; 1、右上角图例visualMap实现 2、visualMap增加formatter 3、series使用custom自定义图表&#xff0c;encode解析四维数组。核心是renderItem方法&#xff0c;必填项&#xff0c;且需要注意要全部定义在options里面&#xff01;&#xff01;&…...

【高等代数笔记】003线性方程组的解法(一)

1. 线性方程组的解法 1.1 解线性方程组的矩阵消元法 【例1】解线性方程组 { x 1 3 x 2 x 3 2 3 x 1 4 x 2 2 x 3 9 − x 1 − 5 x 2 4 x 3 10 2 x 1 7 x 2 x 3 1 \left\{\begin{array}{ll} x_{1}3x_{2}x_{3}2 \\ 3x_{1}4x_{2}2x_{3}9 \\ -x_{1}-5x_{2}4x_{3}10 \\…...

Scrapy入门教程

Scrapy入门教程&#xff1a;打造高效爬虫的第一步 1. 引言 在当今的网络世界中&#xff0c;信息是无价的资源。而爬虫工具则是获取这些资源的有力武器。Scrapy 是 Python 生态系统中最强大的爬虫框架之一&#xff0c;它不仅功能强大&#xff0c;而且易于扩展&#xff0c;适用…...

Microsoft VBA Excel VBA学习笔记——双重筛选+复制数值1.0

问题场景 CountryProductCLASS 1CLASS 2CLASS 3CLASS 4CLASS 5CLASS 6…USApple0.3641416030.8918210610.0591451990.7320110290.0509636560.222464259…USBanana0.2300833330.4027262180.1548836670.2988904860.7802326210.028592635…CNApple0.7762370470.5075548320.481978…...

谷歌反垄断官司败诉后,或又面临被拆分风险?

KlipC报道&#xff1a;上周8月5日&#xff0c;美国法院裁定谷歌的搜索业务违反了美国反垄断法&#xff0c;非法垄断在线搜索和搜索文本广告市场。据悉&#xff0c;胜诉的美国司法部正在考虑拆分谷歌。其他选项包括强制谷歌与竞争对手分享更多数据&#xff0c;以及防止其在人工智…...

wordpress帮助手册/常用的搜索引擎有哪些?

前言 本文主要记录下关于斯坦福CS231n课程Lecture1——Lecture5中学习的笔记&#xff0c;以下部分内容为个人理解如有错误&#xff0c;敬请原谅。 一、传统机器学习和深度学习联系 不管是传统的机器学习还是深度学习&#xff0c;贯穿主线的就是特征&#xff0c;只不过传统的机…...

做兽药网站用什么图片好/现在的seo1发布页在哪里

// 题目描述 // 求123...n&#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&#xff09;。public int Sum_Solution(int n) { // 不会&#xff1a;&& || 短路int sum n;boolean f (sum>…...

河南郑州百度网站建设/seo网站优化方案书

简单的说&#xff0c;Python是一个“优雅”、“明确”、“简单”的编程语言。 学习曲线低&#xff0c;非专业人士也能上手开源系统&#xff0c;拥有强大的生态圈解释型语言&#xff0c;完美的平台可移植性支持面向对象和函数式编程能够通过调用C/C代码扩展功能代码规范程度高&a…...

网站开发项目比赛/舆情信息网

目的 本身装有python3.8&#xff0c;和一些依赖包。同时想使用Spyder类似MATLAB工具箱的功能Variable Explorer。 环境 win10python3.8spyder5.0.5 步骤 1、Spyder安装 按照官网建议&#xff0c;可使用Anaconda安装。若没有&#xff0c;可使用Windows独立安装包&#xff…...

网站建设竞标需要怎么做/网站优化要多少钱

以前就研究过debian安装包的问题&#xff0c;当时也没有做相关方面的记录&#xff0c;当时也没有完全研究明白&#xff0c;现在重新研究下&#xff0c;现在写下我的一些笔记&#xff0c;等我研究明白了&#xff0c;我会整理出来&#xff0c;出个系列博客&#xff0c;有兴趣的同…...

宽屏网站背景/网络营销推广软件

Map JavaScript 的对象&#xff08;Object&#xff09;&#xff0c;本质上是键值对的集合&#xff08;Hash 结构&#xff09;&#xff0c;但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。为了解决这个问题&#xff0c;ES6 提供了 Map 数据结构。它类似于对象&am…...