模块化

人们在解决问题,尤其是大规模的复杂问题时,常常使用“分解”的方法,将问题划分若干个较小的问题,通过对各个较小问题的求解,达到对复杂问题的解决。模块化就是体现人类在问题求解时的这一方法和思想。为了使一个复杂的大型程序系统能被人的智力所管理,模块化是复杂软件系统必须具备的属性。因为,如果不把一个大型的、复杂的系统分解成若干模块, 将很难对其开发和管理。

所谓模块化(Modularity),就是依据一定的原则,将欲开发的软件系统分解为若干部分,即模块。如果对

一次划分出的模块直接求解复杂度仍较高,则可继续分解,直到划分 为易于直接解的规模为止。模块的概念我们在本章

一节中曾提到。所谓模块,就是实现某种功能独立、逻辑完整的程序 段落,模块也是数据说明,是可执行语句等程序对象的集合。模块被单独命名,并能通过名字被访问。模块化降低问题的复杂程度可从下边说明中得到论证。

设函数 C(x)表示问题的复杂程度,函数 E(x)表示求解问题所需的工作量,若有两个问题 P1 和 P2,如果

C(P1)>C(P2)则显然有E(P1)>E(P2)

同时,我们还有另外一条规律,若一个问题 P 可被分解为两个子问题 P1 和 P2,即:

P=P1+P2

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

因而

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

以上规律充分说明,模块化降低了问题的复杂程度,减少了求解问题的工作量。

但是,我们并不可由此得出结论,在软件开发时,模块划分得越多越好, 问题分解得越细越好,当模块被划分成最基本的操作,问题就自然而然得到解决了。事实上,模块化要掌握适当的程度。因为,模块划分降低了问题的复杂程度,但也增加了模块间相互协调工作,即配合完成任务的接口复杂度。若将接口因素考虑进去,则上述规律可做如下修正:

仍设 P=P1+P2

设 I(i,j)为模块 Pi 对模块 Pj 的接口复杂度因子; I(i,j)×Pi 为模块 Pi 对模块 Pj 的接口工作量; 则有

C(P)→C(P1+I(1,2)×P1)+C(P2+I(2,1)×P2) E(P)→E(P1+I(1,2)×P1)+E(P2+I(2,1)×P2)

显然,不同的模块划分有不同的接口因子。只有当模块划分合理,数量规模适当,接口因子较小时,才有下式成立:

C(P)>C(P1+I(1,2)×P1)+C(P2+I(2,1)×P2) E(P)>E(P1+I(1,2)×P1)+E(P2+I(2,1)×P2)

因此,在模块划分时,存在着一个最佳模块数,最佳的模块划分应符合模块独立性原则。

图 3-2-2 表示了最佳模块划分的范围。

结构化设计就是根据这一规律,提出把系统设计成由若干模块所组成的结构。每个模块都相对独立、功能单一。这样,各个模块可以独立地被理解、编写、测试、排错和修改。整个系统结构清晰,易于实现、理解和维护。结构化设计能提高软件系统的质量和可靠性,也有助于整个工程的开发和管理。

模块化 - 图1