跟我学C++中级篇——C++编码的几点建议

一、C++编码

C++语言做为一种为大多数人认为难度较大的开发语言,因其灵活多变的风格和技术导致其应用开发不易为开发者掌握。有过较长C++开发经验的程序员可能发现,在C++开发的人员中,鱼龙混杂,各色开发人员都有。它不象Js或Java等高级语言,大家的开发水平在三五年后基本都差不多。C++编码的程序员可能有的十几年如一日的编写着让人头大的代码。

二、如何更好的编写C++代码

为了方便描述如何更好的编写C++编码,我们从两个方面来阐述其需要注意的地方:
1、编程的形式
形式其实更容易理解,俗话说得好“穿衣戴帽,各有一套”。但是,可能有的人穿衣出来就让人眼前一亮,而有的人则让眼前一暗(开个玩笑),大多数人则是跟着潮流和习惯走。而C++编码同样也有这个问题。即如何处理编程时的风格问题。
编程风格又可以划分几个重点部分:
1)命名方式
网上的命名方式有很多,什么谷歌的,华为的,微软的,Linux的。首先说明的是命名方式没有对错,它只是一种标准,用来让团队成员间更容易理解和沟通,便于后期的维护和管理。举一个例子就明白了,军装。军装为什么要统一?军衔为什么统一?看一眼军装就知道是敌是友,看一下军衔就知道要不要听对方的。这在平时可能无所谓,但在战时非常重要。军队是用血的教训换来的,而编码的命名方式是用人平白浪费的工时换来的。命名方式除了常见的变量、类、函数、名空间、接口等命名外,其实还包括容易忽视的文件命名和库命名等。其中可能某一项又有多种方式,如变量命名可能有全局变量和静态变量及类成员变量等的命名。
这都需要大家提前约定或沟通制定。
2)注释
注释其实就容易理解了,首先是什么情况下需要加注释,使用哪种注释,禁止哪种注释。行注释和块注释如何引入等等。文件、类和函数的注释标准以及是否引入工具统一注释。是否需要通过注释生成相关的开发文档等等,都需要提前约定好。
3)代码格式
代码格式同样重要,比如函数和类的大小,文件的大小。缩进的规定,多少行代码需要增加空白行等等。大小括号的处理方式,if的处理方式(比如没有else也要加大括号)诸如此类。
4)代码结构
代码的结构处理也需要控制,如对全局变量的处理是不是增加专门的头文件,对类的继承的约束(不允许菱形继承)等等。

其它可能还有一些细节,但是整体这几个基本就够了。

2、编程的内容(或者说技术层面)
可能开发者们更敏感的是内容,也就是技术。其实反而是形式上更容易让人接受,这就是网上所说的“颜值即正义”。连学生们考试前老师都反复教诲“写字尽量整齐美观,保持卷面整洁”。不过,对于实际的开发者来说,容易为大家认可的归根到底还是要看技术的。所以要想在C++编码时效率高、错误少就需要注意以下几点:
1、变量定义尽量缩小可见范围和生命周期(内聚)
2、在可能的情况下容器尽量使用STL的并根据情况确定使用哪种容器(尽量使用新的STL中容器应用,简单方便相对安全)
3、合理的处理选择判断语义,如if,switch到map的使用场景和效果
4、函数参数尽可能发挥const和引用的长处(高效)
5、尽量使用新的移动语义(减少临时变量)
6、尽量减少临时变量特别是大的临时变量的出现
7、在需要追求效率时尽可能考虑内联(高效)
8、排序等常见算法,如无必要请使用STL提供的算法(最好是新标准中提供的并行算法,内聚且高效)
9、为减小内存分配和内存碎片,可考虑内存池或对象池。当然前提是,项目必须复杂到了这个程度。如果比较小的项目可以考虑提前分配内存(内聚且高效)
10、善于利用各种缓存,IO的,CPU的等等(高效)
11、如有可能,尽量避免递归而使用迭代。一个是安全,另外一个会大量减少生成临时对象(高效)
12、审慎的引入模板编程(对于大多数C++程序员,模板编程,元编程其实不必要)
其实上面的这些说法每一条都有很多细节,拿第一条举例。缩小范围和生命周期,是不是意味着减少从堆内存分配,是不是优化返回值,是不是优化初始化的方式,是不是在某些情况下选用线程局部存储等等。包括第三点,值传递的优势和引用传递的优势,const的作用等等。这都需要大家在开发中慢慢的体会。
上面并没有涉及多线程(如线程池)或分布式(如安全性控制)的一些内容,这些内容对很多C++开发人员来说用得较少,这里就不再赘述。

三、工具的应用

中学课本中有“君子性非异也,善假于物也”,其实就是一个道理。在C++编码的过程中,一定会有各种的问题,一定要善于利用工具来解决:
1、IDE工具
是不是需要一个IDE来进行开发,还是直接就文本开发,哪个IDE更好?这个现在可能值不得讨论,因为现在的IDE已经做得非常棒了。但在不同的环境和平台下,还是有斟酌的地方。
2、AI辅助编程工具
到底引不引入AI辅助工具呢?目前看还是众说纷纭,大家根据实际情况决定就好。
3、代码检查工具
包括静态检查和动态检查的工具,用来提高代码质量,发现和定位错误位置,象常见的内存检查工具Valgrind等
4、调优工具
确定程序的性能瓶颈,耗时部位等,如grpof,Oprofile和gperftools等等。
5、测试工具
帮助检查代码的逻辑问题等,如gtest等 。
6、其它工具
这一其它就多了,比如一些虽然少见但专业性较强的,像反编译的工具软件(ODB等)。而更多的则如代码管理工具(Git等),集成部署工具等(Jenkins等),网络分析工具(Wireshark等),文件分析工具等等可就多了(当然这里假定开发者已经拥有了基本的编译和调试工具等)。

使用工具的优势不言而喻,真正的编程高手一定是工具应用的高手。直到自己手搓工具,比如有名的Git,最初就是Linux大佬用两周时间搞出来的(当然到达现在这种应用则持续数年的开发和完善)。所以,建议初中级的开发者首先要把常见的工具搞得非常熟悉,这样才能更好的辅助技术的提升。

四、细节的处理

开发者不可能一辈子在一家公司工作,也不可能不和别人合作开发代码。所以无论是从形式上还是内容上,对细节的把控不能太个性化(当然,前提是你不是老大的情况下)。正所谓,抓大放小,赶哪的集付哪的斗,不过分追求自我的特点。比如形式上,有的公司使用驼峰命名有的使用下划杠命名,内容上有的公司强调不允许使用模板开发,有的公司则强调使用模板开发,凡此种种,适应就好,不必强求。
从某种角度上讲,无法适应恰恰是水平或知识面不足的一种体现。

五、总结

C++是一门较难学习和使用的语言,对于初中级开发者来说,养成一个好的编码习惯,对自己和对团队都有着非常大的益处。尤其是对于开发者自己,不断的学习和适应不同风格的团队,养成自己的一套原则体系,然后再根据实际的情况动态处理即可。而在学习不同的优秀框架时,开发技术的提高其实也在潜移默化的影响着自己对编程风格的灵活适应性;而不同的风格下见到不同的大牛们的代码,同样反过来也影响自己在某一时期的编码的形式。
形式是表象,内容是根本。二者互相影响,正如佛家所说“相由心生”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值