4.3.1 模块和模块化
模块并非是计算机专有术语,在计算机领域也没有统一的严格定义,但是几乎所有的软件体系结构都是以模块为最小单位构建的。模块也称构件,是指可单独命名且可通过名字访问的过程函数、子程序或宏调用。在具体计算机语言中,模块是由边界元素(比如Java中的{…})限定的相邻程序元素的序列,且有一个总体标识符代表它。面向对象方法学中的对象、对象中的方法都是模块。
模块一般具有如下四个基本属性。
(1)接口:指模块的输入与输出。
(2)功能:指模块实现的处理。
(3)逻辑:描述模块内部的处理过程。
(4)状态:指模块使用时的环境和条件。
模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,所有模块按用户业务逻辑集成起来构成一个整体,完成指定的功能满足用户需求。
模块化的目的是为了降低软件的复杂性。对软件进行适当地分解,可以减少开发难度,降低开发成本,提高开发效率。
模块化的论据如下。
如果C(x)表示问题x的复杂程度,函数E(x)表示解决问题x所需要的工作量函数。对于p1、p2两个问题,如果C(p1)>C(p2),则有(https://www.daowen.com)
![]()
由于p1和p2两个问题合成一个问题时的复杂程度大于分别考虑每个问题时的复杂程度之和,即C(p1+p2)>C(p1)+C(p2)。这种假设看起来似乎有些武断,但大多数情况下的确如此。
所以,可以得到

如果按照这个论断,无限制地分割软件就可以无限地降低成本,但是现实中显然并非如此,因为还有另一个因素起作用,使得上述论断不能成立。当无限地分割软件时,虽然每个模块的规模在减小,开发成本在降低,但同时系统的总模块数会上升,模块间的接口设计所需要的成本会显著提升。如图4.3所示。

图4.3 模块化和软件成本关系图
由图4.3可知,存在一个模块数M,使得软件总成本最低。可见在总体设计中,只有选择合适的模块数据,才会使得整个系统的开发成本较小,但在目前还无法准确预测这个M的数值。
采用模块化原理可以使软件结构清晰,降低设计难度,提高可理解性。由于程序的错误大多发生在模块及它们之间的接口中,所以模块化设计会使软件容易测试和调试,进而有助于提高软件的可靠性。当变动仅涉及少数几个模块时,模块化还能够提高可修改性。另外,模块化也有助于软件开发的组织管理,一个复杂的大型程序可以通过模块化分解成许多程序,按照实现的难易度分配给技术熟练水平不同的程序员。