建立模块的理由

即使不经常使用模块,凭直觉也很可能会对可以放入模块的数据和子程序种类有所了解。
从某种意义来说,模块并不是人们的目标,它只是数据及对数据所进行的操作的集合,并且支
持面向对象的概念——抽象和封装。模块不支持继承性,因而它也并不完全支持面向对象编程,
描述它的这种有限的面向对象特性的词汇是 Booch 1991 年提出来的“基于对象”编程。
以下是一些适合使用模块的域:
用户接口。可以建立一个模块来把用户接口要素独立起来。这样,不会影响程序其它部分,
你就可以进行改进。在许多情况下,用户接口模块中往往包含有几个模块来进行诸如菜单操作、
窗口管理、系统帮助等。
对硬件有依赖的区域。把对硬件有依赖的区域放入一个或几个模块中。这些区域常见的有:
与屏幕、打印机、绘图机、磁盘驱动器、鼠标等的接口。把这些对硬件有依赖的区域独立起来
可能帮助把程序移植到新环境下运行。设计一个硬件经常变动的程序时,这也是很有帮助的,
可以编写软件表模拟与特定硬件的交互作用,硬件不存在或不稳定时,让接口子程序与这些模
拟软件打交道。然后在硬件稳定时,再让接口子程序与硬件打交道。
输入与输出。把输入/输出封装起来,可以使程序其余部分免受经常变动的文件和报告
格式的影响。把输入/输出放入模块,也使得程序很容易适应输入/输出设备的变动。
操作系统依赖部分。把对操作系统有依赖的部分放入模块的原因与把对硬件有依赖部分放
入模块的原因是相同的。如果你正在编写一个在 Microsoft Windows 下运行的软件,为什么要把
它局限于 Windows 环境下呢?你完全可以把对 Windows 的调用放在一个 Windows 接口模块中。
如果以后想把程序移植到 Macintosh 或者 OS/2 环境下,你所要做的只是改动一下接口模块而已。

数据管理。应把数据管理部分放入模块中,让其中的子程序去与那些杂乱的实现细节打交
道。而让模块外的子程序用抽象的方式与数据打交道,这种方式应该尽可能避免实际处理问题,
如果你认为将数据管理模块化是将其放入一个单独模块中,那你就错了。通常,每一种主要的
抽象数据类型,都需要一个单独的模块来管理。
真实目标与抽象数据类型。在程序中,需要为每个真实目标创立一个模块。把这一目标所
需要的数据放入模块中,然后再在其中建立对目标进行模块化的子程序。这就是所谓抽象数据
类型。
可再使用的代码。应把计划在其它程序中再用的程序部分进行模块化。建立模块的一个优
点是,重新使用模块要比重新使用面向功能的程序实用得多。在面向对象设计和面向功能设计
方法中,刚开始的项目都不能从以前的项目中借用许多代码,因为以前项目还不够多,无法提
供足够的代码基础。使用面向功能设计方法开发的程序,大约可以从以前的项目中借用 35%的
代码:而在使用面向对象设计方法开发的项目中,则大约可以从以前的项目中借用 70%的代码。
如果可以通过深思远虑而在以后的项目中避免重写 70%的代码,那为什么不这样做呢?
可能发生变动的相互联系的操作。应该在那些可能发生变动的操作周围修建一道隔墙。这
事实上是容错原则的一种,因为这样可以避免局部的变动影响到程序的其余部分。在 6.2 节中,
给出了一些经常发生变动的区域。
互相联系的操作。最后,应把互相联系的操作放到一起。在绝大多数情况下,都可以发现
把看起来互相联系的子程序和数据放在一起的更强的组织原则。在无法隐蔽信息的情况下,比
如共享数据或计划增强灵活性时,仍然可以把成组操作放在一起,比如,三角函数、统计函数、
字符串操作子程序、图像子程序等。通过精心地成组放置相关操作,还可以在下一个项目中重
新使用它。

你可能感兴趣的:(阅读)