博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《C++代码设计与重用》——1.1 什么是重用性
阅读量:6642 次
发布时间:2019-06-25

本文共 1727 字,大约阅读时间需要 5 分钟。

本节书摘来自异步社区出版社《Imperfect C++中文版》一书中的第1章,第1.1节,作者: 【美】Martin D.Carroll , Margaret A.Ellis,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.1 什么是重用性

C++代码设计与重用

1.1 什么是重用性

许多相同操作都会在多个计算机程序里重复实现,例如:

对数组元素进行排序;

解答线性方程组;
实现一个从X类型到Y类型的映射;
解析C++代码;
从数据库检索数据;
和其他程序进行通信。
与其在每个程序里都设计和实现上面每个操作的相同代码,我们更愿意采用的方法是:只设计和实现这些操作的代码一次,然后再把这些代码重用手不同程序里。显然,已有的可重用代码,使每个应用程序不必从头写起,因为它(可重用代码)大大加速了应用程序的开发,并且减少了编写和维护应用程序的费用。

代码重用已经不是一个新概念了。第一代高级编程语言FORTRAN的最初版本就有了一个可扩展的程序库,它可以实现输入、输出和格式化等操作。当FORTRAN语言新推出的时候,重用就已经不是什么时髦用语了,何况FORTRAN程序库就已经包含了许多可重用代码。另一个典型的例子是UNIX操作系统,它提供了许多相当有用的小指令,这些小指令可组合成用途广泛的新指令,从而通过这种方示来鼓励重用。

1.1.1 提取代码来作为重用

代码重用的最初形式就是从其他程序里提取代码。假设我们正在设计某个程序设计语言的编译器。在编译器实现的某个地方需要一个高效的哈希表来管理符号表,而我们又不想从头来设计和实现哈希表;这时,如果我们能够在其他的编译器找到适合的哈希表实现代码,我们就可以从这些编译器中提取代码,然后再拷贝到我们的程序中去。

提取在实际中应用得很普遍。但令人遗憾的是提取有着很多显著的缺点。第一,找到需要的代码相当困难。每个人所能堤取的代码只能是所有存在代码的一小部分,因为提取代码实体要求程序员对代码具有存取权限和深刻的理解。所以程序员一般只是提取自己编写的那部分代码,或者就是同一个开发小组内其他程序员写过的代码。第二,把从其他程序里提取的代码用到自己的程序上,正确与否的把握性不大。第三,每个有经验的程序员都知道,由于要提取的代码和程序里其余的代码之间存在相互依赖性,让一段重要的、要提取的代码从包含它的程序里分离出来会是非常困难的。第四,提取的代码往往需要经过重大改写才能用于新的程序里。例如,提取代码里的名字可能会和新程序环境里原有的名字发生冲突;被提取的代码可能还认为它处于原先的执行环境里,实际上这样的环境在新程序里已经不存在了;被提取的代码在原先程序里可能由于使用方式的原因已经优化过了,但在新程序里它却没经过优化等。

从头开始编写代码往往比提取代码显得更加容易—即使我们已经知道在别的程序里有我们需要的代码并且可以得到这段代码。

1.1.2 可重用代码的基本特性

提取的上述缺点是可以避免的,只要我们要提取的代码具有以下特性;

代码容易找到且容易理解;

对代码的正确性很有把握;
不需要从包含它的外层代码分开;
当把代码用于新的程序里时,不需要对代码进行修改。
这些特性是任何可重用代码都必须具备的最少特性。对特殊的可重用代码段,往往还必须具有其他的一系列特性,如高效性、可扩展性、可移植性等。

程序库是可重用代码的集合,在C++中,一个程序库是由(零个或多个)公共头文件、(零个或多个)源文件、(零个或多个)目标文件和(零个或多个)用于实例化模板必需的文件的集合组合而成的。其中,目标文件经常是由一个或多个文件打包而成。这些被打包的文件,在一些系统中,我们称之为档案文件,在其他系统中我们称之为链接库(如动态链接库DLL就是一种特殊的链接库)。尽管链接库概念使用得比较普遍,但为了避免它和程序库发生混淆,我们在这里还是使用档案文件这个术语。为了使用一个程序库,我们就应该包含(#include)它的头文件,并使用系统提供的特定机制,来编译它的源文件和链接由编译产生的目标文件和档案文件。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

你可能感兴趣的文章
Oracle ODI 12c之多表联合查询以及定时任务设置
查看>>
设置KSH的自动补全和历史命令功能
查看>>
python--threading多线程总结
查看>>
我的友情链接
查看>>
PHP中数组的定义及声明实例
查看>>
批处理删除任意天之前的文件
查看>>
421 Home directory not available - aborting错误的解决方法
查看>>
Spoolsv.exe占用率高!
查看>>
FFmpeg 内存管理函数说明
查看>>
redis之redis cluster创建
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
js的发布/订阅模式
查看>>
Introduction To Neural Networks
查看>>
事件处理
查看>>
Android 中的 Service 全面总结(三)
查看>>
怎样利用strace调试
查看>>
AES
查看>>
shell脚本抓取用户存储quota写道mysql并展现到grafana面板
查看>>
关于docker的我自己的理解
查看>>