《C++编程规范:101条规则、准则与最佳实践》——第2章设计风格设计风格 C++编程规范:101条规则、准则与最佳实践 复杂性啊,愚人对你视而不见,实干家受你所累。 有些人避而远之。惟智者能够善加消除。 ——Alan Perlis 我知道,但是却又忘记了Hoare的至理名言:不成熟的优化是程

简介:

本节书摘来自异步社区出版社《C++编程规范:101条规则、准则与最佳实践》一书中的第2章,第2.1节,作者:【加】Herb Sutter , 【罗】Andrei,更多章节内容可以访问云栖社区“异步社区”公众号查看。

第2章设计风格

C++编程规范:101条规则、准则与最佳实践
复杂性啊,愚人对你视而不见,实干家受你所累。

有些人避而远之。惟智者能够善加消除。

——Alan Perlis

我知道,但是却又忘记了Hoare的至理名言:不成熟的优化是程序设计中的万恶之源。

——Donald Knuth[1]

The Errors of TeX[Knuth89]

完全区分设计风格与编码风格是非常困难的。我们将一般在实际编写代码时才用得到的条款留到下一部分介绍。

本部分集中讨论适用面比一个特定的类或者函数更广的原则和实践。比较典型的包括:简单和清晰之间的平衡(第6条),避免不成熟的优化(第8条),避免不成熟的劣化(第9条)。这三个条款不仅适用于函数编写的层次,而且适用于类和模块设计权衡的更大范围,适用于更深的应用程序架构决策。(它们也适用于所有程序员。如果你不以为然,请重读上面Knuth的话,注意其中的引用部分。)

紧接其后,本部分和下一部分的其他条款讨论的都是依赖性管理的各个方面。依赖性管理是软件工程的一个基础,也是贯穿本书不断出现的主题。停下来,任意选择一个优秀的软件工程技术(任何好的技术都行),思考一下。无论选择哪一个,都将发现,它都是在想尽办法减少依赖性。继承?是为了使所编写的代码使用不依赖于实际派生类的基类。尽量减少全局变量?是为了减少因可见范围太大的数据所产生的远距离依赖。抽象?是为了消除处理概念的代码和实现它们的代码之间的依赖。信息隐藏?是为了使客户代码不依赖实体的实现细节。依赖性管理的一个相关问题还反映在避免使用共享状态(第10条)中,反映在应用信息隐藏(第11条),以及更多的其他条款中。

本部分中我们选出的最有价值条款是第6条:正确、简单和清晰第一。因为这些要求真地太必需了。

2.1一个实体应该只有一个紧凑的职责

摘要
一次只解决一个问题:只给一个实体(变量、类、函数、名字空间、模块和库)赋予一个定义良好的职责。随着实体变大,其职责范围自然也会扩大,但是职责不应该发散。

讨论
人们常说,好的商业理念能够一言以敝之。同样,每个程序实体也应该只有一个明确的目的。

如果一个实体有几个不同的目的,那么其使用难度往往会激增,因为这种实体除了会增加理解难度、复杂性和各部分中的错误外,还会导致其他问题。这种实体不仅更大(常常毫无合理理由),而且更难以使用和维护。此外,这种实体经常会为自身的一些特定用途提供有问题的接口,因为各个功能领域之间的部分重叠,会影响干净利落地实现每个功能所需的洞察力。

具有多个不同职责的实体通常都是难于设计和实现的。“多个职责”经常意味着“多重性格”——可能的行为和状态的各种组合方式。应该选择目的单一的函数(见第39条),小而且目的单一的类,以及边界清晰的紧凑模块。

应该用较小的低层抽象构建更高层次的抽象。要避免将几个低层抽象集合成一个较大的低层次抽象聚合体。用几个简单的行为来实现一个复杂的行为,比反其道而行之更加容易。

示例
例1 realloc。在标准C语言中,realloc是一个臭名昭著的不良设计。这个函数承担了太多的任务:如果传入的指针参数为NULL就分配内存空间,如果传入的大小参数为0就释放内存空间,如果可行则就地重新分配,如果不行则移到其他地方分配。这个函数不易于扩展,普遍认为它是一个目光短浅的失败设计。

例2 basic_string。在标准C++语言中,std:: basic_string是另一个臭名昭著的不良设计——巨大的类设计。在一个臃肿的类中添加了太多“多多益善”的功能,而这只是为了试图成为容器但却没有做到,在用迭代还是索引上犹豫不决,还毫无道理地重复了许多标准算法,而为扩展所留的裕度又很小(见第44条的示例)。

参考文献
[Henney02a] ● [Henney02b] ● [McConnell93] §10.5 ● [Stroustrup00] §3.8, §4.9.4, §23.4.3.1 ● [Sutter00] §10, §12, §19, §23 ● [Sutter02] §1 ● [Sutter04] §37-40

第条 正确、简单和清晰第一

相关文章
|
11月前
|
Linux 编译器 C++
C/C++性能优化:从根本上消除拷贝操作的浪费
C/C++性能优化:从根本上消除拷贝操作的浪费
1190 1
|
11月前
|
存储 缓存 算法
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
1474 0
|
1月前
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
6月前
|
安全 编译器 程序员
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
112 2
|
6月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
108 6
|
6月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
154 7
|
11月前
|
存储 缓存 算法
高效编程:我们应该了解哪些编译器优化技术?如何做出成熟的优化行为,掌握C++编程中的编译器优化艺术。
高效编程:我们应该了解哪些编译器优化技术?如何做出成熟的优化行为,掌握C++编程中的编译器优化艺术。
534 5
|
10月前
|
编译器 C++ 开发者
C++一分钟之-返回值优化与Move Semantics
【6月更文挑战第19天】C++的RVO与移动语义提升效率,减少对象复制。RVO是编译器优化,避免临时对象的创建。移动语义通过右值引用和`std::move`转移资源所有权。注意RVO不是总有效,不应过度依赖。使用移动语义时,避免误用`std::move`导致对象无效。示例展示了RVO和移动构造函数的应用。理解并恰当使用这些机制能写出更高效代码。
112 3
|
11月前
|
测试技术
消除游戏(第十三届蓝桥杯省赛C++C组 , 第十三届蓝桥杯省赛PythonA/B/研究生组)
消除游戏(第十三届蓝桥杯省赛C++C组 , 第十三届蓝桥杯省赛PythonA/B/研究生组)
消除游戏(第十三届蓝桥杯省赛C++C组 , 第十三届蓝桥杯省赛PythonA/B/研究生组)
|
11月前
|
消息中间件 算法 Java
C++实时通信优化技术探究
C++实时通信优化技术探究
117 3

热门文章

最新文章