时间:2022-10-09 18:08:04 | 浏览:275
C++代码提供了足够的灵活性,因此对于大部分工程师来说都很难把握。本文介绍了写好C++代码需要遵循的10个最佳实践,并在最后提供了一个工具可以帮助我们分析C++代码的健壮度。原文:10 Best practices to design and implement a C++ class
到2022年,C++已经走过了40多个年头。新的C++标准实际上简化了许多令人沮丧的细节,提供了新的现代方法来改进C++代码,但让开发人员认识到这一点并不容易。
以内存管理为例,这可能是C++中受到最多批评的机制。多年来,对象分配都是由new关键字完成的,开发人员一定得记住在代码的某个地方调用delete。“现代C++”解决了这个问题,并促进了共享指针的使用。
现代C++库广泛使用命名空间来模块化代码库,它们利用“Namespace-by-feature”方法,按功能划分命名空间来反映功能集,将单个特性(且仅与该特性)相关的所有内容放到单个命名空间中。从而使得命名空间具有高内聚性和高模块化,并且耦合最小,紧耦合的项目被放在了一起。
Boost是按特性分组的最佳示例,其包含数千个命名空间,每个命名空间用于对特定的特性进行分组。
数据抽象是C++中面向对象编程最基本和最重要的特性之一。抽象意味着只显示基本信息而隐藏细节,数据抽象指的是仅向外部世界提供关于数据的基本信息,隐藏背景细节或实现。
尽管许多书籍、网络资源、会议演讲者和专家都推荐这种最佳实践,但在很多项目中,这条规则仍然被忽略了,许多类的细节并没有被隐藏。
具有多行代码的类型应该被划分为一组较小的类型。
需要很大的耐心重构一个大的类,甚至可能需要从头重新创建所有东西。以下是一些重构建议:
BigClass中的逻辑必须被分成更小的类。这些较小的类最终可能成为嵌套在原始God Class中的私有类,God Class的实例对象由较小嵌套类的实例组成。
较小的类划分应该由God Class负责的多个职责驱动。要确定这些职责,通常需要查找与字段的子集强耦合的方法的子集。
如果BigClass包含的逻辑比状态多,一个好的选择是定义一个或几个不包含静态字段而只包含纯静态方法的静态类。纯静态方法是一种只根据输入参数计算结果的函数,它不读取或分配任何静态或实例字段。纯静态方法的主要优点是易于测试。
首先尝试维护BigClass的接口,并委托调用新提取的类。最后,BigClass应该是一个没有自己逻辑的纯接口,可以为了方便将其保留,也可以将其扔掉,并开始只使用新类。
单元测试可以提供帮助: 在提取方法之前为每个方法编写测试,以确保不会破坏功能。
包含20个以上方法的类可能很难理解和维护。
一个类有许多方法可能是实现了太多责任的症状。
也许所面对的类控制了系统中太多的其他类,并且已经超出了应有的逻辑,成为了一个无所不能的类。
低耦合是理想状态,可以在应用中进行较少的更改实现程序的某个变更。从长远来看,可以减少修改、添加新特性的大量时间、精力和成本。
低耦合可以通过使用抽象类或泛型类和方法来实现。
单一责任原则规定一个类不应该有多于一个更改的理由,这样的类被称为内聚类。较高的LCOM值通常可以意味着类的内聚性较差。有几个LCOM指标,取值范围为[0-1]。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就需要警惕了。
鹦鹉学舌的代码注释没有为读者提供任何额外的东西。代码库中充斥着嘈杂的注释和不正确的注释,促使程序员忽略所有的注释,或者采取积极的措施隐藏它们。
众所周知,重复代码的存在对软件开发和维护有负面影响。实际上,一个主要缺点是,当为了修复bug或添加新特性而更改重复代码的实例时,所有对应的代码必须同时更改。
产生重复代码最常见的原因是复制/粘贴操作,这种情况下,相似的源代码出现在两个或多个地方。许多文章、书籍和网站都警告不要采用这种做法,但有时实践这些建议并不容易,开发人员还是会选择简单的解决方案: 复制/粘贴大法。
使用适当的工具可以容易的从复制/粘贴操作中检测到重复代码,但是,在某些情况下,克隆代码很难被检测到。
基本上,如果对象在创建之后状态不变,那么这个对象就是不可变(immutable)的。如果一个类的实例是不可变的,那么该类就是不可变的。
不可变对象极大简化了并发编程,这是支持使用它的重要理由。想想看,为什么编写适当的多线程程序是一项艰巨的任务?因为同步线程访问资源(对象或其他操作系统资源)是很困难的。为什么同步这些访问很困难?因为很难保证多个线程对多个对象进行的多次写访问和读访问之间不会出现竞争条件。如果不再有写访问会怎么样?换句话说,如果被线程访问的对象的状态没有改变会怎么样?就不再需要同步了!
关于不可变类的另一个好处是它们永远不会违反里氏替换原则(LSP, Liskov Subtitution Principle),以下是维基百科对LSP的定义:
Liskov的行为子类型的概念定义了可变对象可替换性的概念,也就是说,如果S是T的子类型,那么程序中T类型的对象可以被替换为S类型的对象,而不改变该程序的任何期望属性(例如,正确性)。
如果没有公共字段,没有可以更改其内部数据的方法,并且派生类方法无法更改其内部数据,那么引用对象类就是不可变的。因为值不可变,所以在所有情况下都可以引用相同的对象,不需要复制构造函数或赋值操作符。出于这个原因,建议将复制构造函数和赋值操作符设为私有,或者从boost::noncopyable继承,或者使用新的C++ 11特性“显式默认和删除特殊成员函数”[2]。
嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
点击这里找小助理0元领取:嵌入式物联网学习资料(头条)
CppDepend[3]提供了名为CQLinq[4]的代码查询语言,可以像数据库一样查询代码库。开发人员、设计人员和架构师可以自定义查询,以便轻松找到容易出现bug的情况。
通过CQLinq,可以结合来自代码度量、依赖关系、API使用和其他模型的数据来定义非常高级的查询,以匹配容易出现bug的情况。
例如,分析clang源代码后,可以检测到大类:
检测到有大量方法的类:
或者检测到内聚性较差的类:
References:
[1] 10 Best practices to design and implement a C++ class: https://issamvb.medium.com/10-best-practices-to-design-and-implement-a-c-class-4326611827e1#:~:text=10%20Best%20practices%20to%20design%20and%20implement%20a,class%20as%20you%20can.%20...%20More%20items...%20
[2] Explicitly defaulted and deleted special member functions: http://en.wikipedia.org/wiki/C%2B%2B11#Explicitly_defaulted_and_deleted_special_member_functions
[3] CppDepend: http://www.cppdepend.com/
[4] CQLinq: https://www.cppdepend.com/cqlinq
- END -
文章链接:
https://mp.weixin.qq.com/s/4ZlMrY7gDcZPxitvFuz7oQ转载自:俞凡 程序喵大人
文章来源:C语言与CPP编程
文章链接:C++类设计和实现的十大最佳实践
版权申明:本文来源于网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
所以,勤劳的我今天来给大家盘盘当下最受欢迎的10种设计风格,尽可能降低大家的选择难度。但是,在各种北欧、简约、日式、美式、法式。等等风格中挑选真的是能逼死选择困难症。对于装修选风格这件事,一直令很多伙伴头疼,既要好看,又要耐看。
经常会有人私信我要设计技巧,誓不要到不罢休。现场编还来得及吗?想要设计技巧,不就是想让家舒适好住吗?那必须有!咱们从设计技巧、收纳技巧、电器三方面来说。首先,分享6个超好用的设计技巧。1、下沉式玄关下沉式玄关即是↓↓↓玄关区域比室内低5-1
新京报贝壳财经讯(记者王琳琳)9月1日,新京报贝壳财经记者从君迪发布的2022中国新车质量研究SM中获悉,因设计类缺陷导致的抱怨增加,2022年中国新车质量表现略有下滑,设计类问题已成为影响汽车质量表现的关键因素。新车质量以平均每百辆车问题
九江新闻网小编从九江市自然资源局官网获悉浔阳区将对袁家湖进行整治规划规划设计方案正在批前公示在可建设范围内修建生态步道、休闲广场、景亭廊架等为袁家湖周边居民提供一个生态实用的小游园根据规划该项目总用地面积37464㎡绿化面积9261.08㎡
11月11日,区委书记胡栋良带队调研金峰开发区商贸物流企业及钢铁产业,了解相关项目进展情况,协调解决发展中存在的困难和问题。区领导郭炎河、黄艺群,区委办、发改局、商务局、石亭镇、浦南镇负责人分别参加调研。
1.专利申请的类型 专利申请分发明、实用新型和外观设计三种类型。2.办理专利申请应当提交哪些申请文件 申请发明专利的,申请文件应当包括:发明专利请求书、说明书(必要时应当有附图)、权利要求书、摘要及其附图,各一式两份。3.受理专利申请的
C++语言是非常独特的。虽然实际上所有的编程语言都从其他语言中吸收了一些思路、语法元素和关键字C++却是吸收了另一种完整的语言,即C语言。事实上, C++语言的创建者Bjarne Stroustrup原先把他的新语言命名为"带类的C"。这意
留学专业推荐|留学想读艺术设计专业?无需相关背景,多名校多专业选择!澳洲,不容你错过!说起出国留学读艺术设计类的专业,大部分人首先想到的始终是英美,澳大利亚似乎是一个被忽视的选择,但其实不是哈,相反,申请澳洲的艺术设计类专业优势还是挺多的。
明明睡足了10小时,却依旧无法缓解身体的疲劳感?肩酸背痛,仿佛睡了个假觉。如果经常出现这种情况,那指定是你枕头没选对。要明白,枕头枕的不仅是头,更是脖子。没选对枕头,脖子僵硬一晚上,醒来肯定是更累的。好的枕头,需要具备这些品质:既能拖住头,
上周跟朋友去逛家居市场,她看上了一款橱柜,全套定制下来要10万块....10万....块.....疯了!不过,讲真,一个好用的厨房,橱柜确实很重要。今天,咱们就来聊聊橱柜的那些事儿~橱柜类型:厨房的做饭动线为:冰箱→洗菜→备/切菜→炒菜→盛