1
 软件工程
1.6.1.2 4.1.2 模块化

4.1.2 模块化

模块是由边界元素限定的相邻程序元素(如数据说明、可执行的语句)的序列,而且有一个总体标识符代表它。像Pascal或Ada这样的块结构语言中的Begin…End对,或者C、C++和Java语言中的{…}对,都是边界元素的例子。按照模块的定义,过程、函数、子程序和宏等,都可作为模块。面向对象方法学中的对象是模块,对象内的方法(也称为服务)也是模块。模块是构成程序的基本构件。

模块化就是把程序划分成独立命名且可独立访问的模块的过程,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能并满足用户的需求。

有人说,模块化的目的是使一个复杂的大型程序能被人类的智力所管理,模块化是软件应该具备的唯一属性。如果一个大型程序仅由一个模块组成,它将很难被人类所理解。下面根据人类解决问题的一般规律,论证上面的结论。

设函数C(x)定义问题x的复杂程度,函数E(x)确定解决问题x需要的工作量或时间。对于两个问题P1和P2,如果

C(P1)>C(P2)

显然          E(P1)>E(P2)

根据人类解决一般问题的经验,另一个有趣的规律是

C(P1+P2)>C(P1)+C(P2)

也就是说,如果一个问题由P1和P2两个问题组合而成,即P1+P2,那么它的复杂程度大于P1、P2的复杂程度之和。

综上所述,得到下面的不等式:

E(P1+P2)>E(P1)+E(P2)

由上述不等式可以得出,“各个击破”的结论——把复杂的问题分解成许多容易解决的小问题,原来的问题也就容易解决了。这就是模块化的根据。

由上面的不等式似乎还能得出下述结论:如果无限地分割软件,最后为了开发软件而需要的工作量也就小得可以忽略了。事实上,还有另一个因素在起作用。当模块数目增加时,每个模块的规模将减小,开发单个模块需要的成本(工作量)确实减小了;但是,随着模块数目增加,设计模块之间的接口所需的工作量则将增加。每个程序都相应地有一个最适当的模块数目,使得系统的开发成本最小。

模块化原理可以使软件结构清晰,不仅容易设计,也容易阅读和理解。因为程序错误通常局限在有关的模块及它们之间的接口中,所以模块化使软件容易测试和调试,因而有助于提高软件的可靠性。因为变动往往只涉及少数几个模块,所以模块化能够提高软件的可修改性。模块化也有助于软件开发工程的组织管理,一个复杂的大型程序可以由许多程序员分工编写不同的模块,并且可以进一步把复杂的模块分配给技术熟练的程序员来编写。