首页>>科技 >>内容

c++必背代码,写好C++代码需要遵循的10个最佳实践

发布时间:2023-11-09 19:46:24编辑:温柔的背包来源:

很多朋友对c++必背代码,写好C++代码需要遵循的10个最佳实践不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

c++必背代码,写好C++代码需要遵循的10个最佳实践

c代码提供了足够的灵活性,所以大部分工程师很难掌握。本文介绍了编写C代码应该遵循的10个最佳实践,最后提供了一个帮助我们分析C代码健壮性的工具。1.尽量使用新C标准。到2022年,C已经走过了40多年。新的C标准实际上简化了许多令人沮丧的细节,并提供了新的现代方法来改进C代码,但开发人员并不容易意识到这一点。

以内存管理为例,这可能是c中最受诟病的机制,多年来,对象分配都是由new关键字来完成的,所以开发者一定要记得在代码中的某个地方调用delete。“现代C”解决了这个问题,促进了共享指针的使用。

2.使用命名空间模块化代码现代C库广泛使用命名空间模块化代码库。他们使用“按功能划分名称空间”的方法,按功能划分名称空间以反映功能集,并将与单个功能相关的所有内容(且仅与该功能相关)放入单个名称空间。因此,名称空间具有高度的内聚性和模块化,耦合性最小,紧密耦合的项目放在一起。

Boost是按特性分组的最好例子,它包含成千上万个名称空间,每个名称空间都用来分组特定的特性。3.抽象数据抽象是c中面向对象编程最基本也是最重要的特性之一,抽象意味着只显示基本信息,隐藏细节。数据抽象意味着只向外界提供关于数据的基本信息,隐藏后台细节或实现。

尽管许多书籍、网络资源、会议演讲者和专家都推荐这种最佳实践,但是在许多项目中,这一规则仍然被忽略,许多种类的细节没有被隐藏。4.班级越小越好。具有多行代码的类型应该分成一组更小的类型。重建一个大类需要很大的耐心,你甚至可能需要从头开始重建一切。以下是一些重构建议:

BigClass中的逻辑必须分成更小的类。这些更小的类最终可能成为嵌套在原始God类中的私有类,God类的实例对象由更小的嵌套类的实例组成。更小的阶级划分应该是由神阶级所负责的多重责任来驱动的。为了确定这些职责,您通常需要找到与字段子集强耦合的方法子集。如果BigClass包含的逻辑多于状态,一个好的选择是定义一个或几个只包含纯静态方法而没有静态字段的静态类。

纯静态方法是一个只根据输入参数计算结果的函数,它不读取或分配任何静态或实例字段。纯静态方法的主要优点是易于测试。首先,尽量维护BigClass和delegate的接口来调用新提取的类。最后,BigClass应该是一个纯接口,没有自己的逻辑。您可以为了方便而保留它,或者扔掉它,开始只使用新的类。

单元测试会有所帮助:在提取方法之前为每个方法编写测试,以确保它不会破坏功能。5.每个类应该提供尽可能少的方法。超过20个方法的类可能很难理解和维护。

一个类中有很多方法,可能是意识到责任太多的征兆。也许是它所面对的阶级控制了系统中太多的其他阶级,已经超出了它应有的逻辑,成为了一个无所不能的阶级。6.加强低耦合低耦合是一种理想的状态,你可以在应用中做一些改动来实现程序的某种改变。从长远来看,它可以减少大量修改和添加新功能的时间、精力和成本。低耦合可以通过使用抽象类或泛型类和方法来实现。

7.强化高内聚、单一责任原则规定一个类不应该有一个以上的变化原因,这样的类称为内聚类。较高的LCOM值通常意味着该类的凝聚力较低。有几个值在[0-1]范围内的LCOM指标。LCOM HS (HS代表Henderson-Sellers)的范围是[0-2]。当LCOM HS值大于1时,就需要警惕了。以下是LCOM指数:lcom=1—(sum(MF)/m * f)lcom hs=(m—sum(MF)/f)(m-1)其中.

m是类中方法的数量(包括静态方法和实例方法,还包括构造函数、属性getter/setter和事件添加/删除方法)。f是类中实例字段的数量。MF是一个类可以访问特定实例字段的方式的数量。Sum(MF)是该类的所有实例字段的MF之和。这些公式背后的基本思想可以表述为:如果一个类的所有方法都使用了它的所有实例字段,那么这个类就是完全内聚的,也就是说sum(MF)=M*F,那么LCOM=0,LCOMHS=0。

如果LCOMHS值大于1,则需要提高警惕。8.只注释代码不能表达的内容。鹦鹉学舌式的代码注释不会给读者提供任何额外的东西。代码库中充斥着嘈杂的注释和不正确的注释,促使程序员忽略所有的注释或者采取积极的措施隐藏它们。

9.尽量不要使用重复的代码。众所周知,重复代码的存在对软件开发和维护有负面影响。事实上,一个主要缺点是,当为了修复bug或添加新功能而更改重复代码的实例时,所有对应的代码都必须同时更改。

重复代码最常见的原因是复制/粘贴操作。在这种情况下,相似的源代码出现在两个或更多的地方。许多文章、书籍和网站都对这种做法提出了警告,但有时实践这些建议并不容易,开发者会选择一个简单的解决方案:复制/粘贴大法。通过使用适当的工具,可以很容易地从复制/粘贴操作中检测到重复的代码,但是在某些情况下,克隆的代码很难被检测到。

10.不变性有助于多线程编程。基本上,如果对象的状态在创建后保持不变,那么该对象就是不可变的。如果一个类的实例是不可变的,那么这个类就是不可变的。

不可变对象极大地简化了并发编程,这是支持其使用的重要原因。想一想,为什么写一个合适的多线程程序是一件困难的事情?因为很难同步线程来访问资源(对象或其他操作系统资源)。为什么很难同步这些访问?因为很难确保多个线程对多个对象的多次写访问和读访问之间没有竞争情况。

如果没有更多的写访问会发生什么?换句话说,如果线程访问的对象的状态没有改变,那会怎么样呢?你不再需要同步了!

不可变类的另一个好处是它们永远不会违反Liskov替换原则。以下是维基百科对LSP的定义:Liskov的behavior subtype定义了可变对象可替换性的概念,即如果S是T的子类型,那么程序中T类型的对象可以被S类型的对象替换,而不改变程序的任何预期属性(如正确性)。

如果没有公共字段,没有改变其内部数据的方法,派生类方法也不能改变其内部数据,那么引用对象类就是不可变的。因为值是不可变的,所以您可以在所有情况下引用同一个对象,而无需复制构造函数或赋值运算符。出于这个原因,建议将复制构造函数和赋值操作符设为私有,或者从boost:noncopyable继承,或者使用新的C 11特性“显式默认和删除特殊成员函数”[2]。

如何加强对这些最佳实践的检查?CppDepend[3]提供了名为CQLinq[4]的代码查询语言,可以像查询数据库一样查询代码库。开发人员、设计人员和架构师可以定制查询,从而轻松找到容易出错的情况。通过CQLinq,您可以结合来自代码度量、依赖性、API使用和其他模型的数据来定义非常高级的查询,以匹配容易出现错误的情况。例如,在分析clang源代码之后,您可以检测大型类:

检测到方法数量多的类:或者检测到内聚性差的类:复习唐子红。

以上知识分享希望能够帮助到大家!