模块化与计算机软件设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第18卷标 准 化 报 道Vol.18第4期REPOR TING OF STANDARDIZATION No.4 1997
模块化与计算机软件设计
童时中
(南京电力自动化研究院 南京 210003)
摘 要 指出软件工程的基本特征就是模块化,其核心是多级的模块层次结构和模块的独立
性,并对软件模块化的价值作了分析。
关键词 软件 模块化 价值
1 前言
模块化软件是模块化概念在软件设计中的应用,是软件开发的一种重要技巧,在计算技术中称之为“模块化程序设计”[1](modular programming),它是指“把系统或程序作为一组模块集合来开发的一种技术”。其“目的是把一个复杂的任务断开成几个较小与较简单的子任务,它至少方便了正确的程序的编写”[2]。尽管模块的概念引入计算机软件领域、并被采用已有三十余年历史,但对软件模块化的认识和实践却在深度和广度上不断得到发展,尤其在软件的系统设计和为解决特定问题的大型应用软件的编制中,模块化设计运用的水平,更将影响到软件开发的效率、质量和可维护性。
在大型软件设计中,系统设计的主要任务是确定系统由哪几部分组成,以及各部分之间的关系。软件系统结构设计由两个阶段组成[2],即总体设计(也称初步设计)和详细设计。总体设计是确定系统的模块化结构,它包括以下三项工作:如何将一个系统划分为多个模块;如何确定模块间的接口;如何评价模块划分的质量。详细设计主要是对模块过程的说明。
收稿日期—5—
由上可知,软件的总体设计是结构设计(表现各模块之间的组成关系);软件的详细设计是软件模块内的过程设计。如能全面领会这一模块化设计的要领,就能将一个系统分解成若干个容易管理的部分,使得每一部分可以被单独加工。报纸上曾经登载过一则新闻,某君熟悉计算机软件设计,开办了一家软件公司,多次公开召聘软件设计人员,应聘者甚众,其中不乏高手,但多次招聘下来竞无一人被录用,引起各方面的怀疑。经调查,该君以招聘为名,动用广大软件技术人材,为其无偿设计软件。每一位招聘人员的试题均不同,实际上都是一个可独立测试和运行的模块,将这些模块组装起来就是一个大的程序系统。此中,某君担当了总体结构设计的角色,而把具体模块的过程设计以试题方式由应聘者来完成。应当说,该君的行为是违反职业道德的,甚至是犯法的,但在运用模块法方法方面则是煞费苦心的。
这里不打算叙述模块化软件的具体设计方法,而仅从模块化角度出发,对模块化软件设计的基本特点和意义作一分析。
2 软件模块化的基本问题
“模块化是软件的重要属性,它使得一个程序易于为人理解和处理”[3]。一个软件的系统构造以软件结构来表明,软件结构设计是
——:1997019
20
从确定问题开始,当该问题的每个部分可用一个或几个模块加以解决之后,整个问题的解决办法也就有了。事实上这就是模块化系统的分解问题。然而,对同样的软件要求,由于分解方法的区别,可得出不同的软件结构,至于“哪一种最好?”尚未进入科学的阶段。然而,如能遵循一些基本原则,则可以得到较好的结构。
2.1 软件的多级层次结构
软件结构是软件元素(模块)间的关系表示,而软件元素间的关系是多种多样的,如调用关系、包含关系、从属关系和嵌套关系等。但不管是什么关系,都可以表示为层次结构,层次间由关系(接口)连接、受关系制约。在模块化结构软件中,它表示了模块间调用与控制关系。这种层次结构的概念,已成为各类软件结构的一种表示形式,并获得广泛应用。因为它结构清晰,可理解性好,从而使可靠性、可维护性和可读性都得到提高。以模块为软件元素的层次结构是一种静态的层次结构,将系统自顶向下,逐层分解、求精,通过对“问题”的逐步定义,并转化为模块,就构成为系统结构图。系统结构图是系统设计阶段描述系统结构的主要工具,它不仅严格地描述了模块的名称、功能,而且包括系统由哪几部分组成和各部分之间的联系方式(接口)。图1 (a)所示为软件的结构描述;图1(b)则表示软件结构的度量,图中每个方框代表一个模块,其深度和宽度分别表示控制的层数和总的控制跨度,扇出数是指由一个模块(上级模块)直接控制的其它模块(从属模块)数,扇入数是指有多少模块可直接控制一个给定的模块。当系统分解成的每一部分恰好对应于一个子问题(模块),并且系统各部分之间的联系恰好对应于子问题的联系,则可以认为系统的实现、维护修改的费用就达到了最低。事实上,软件的层次结构,就是一个典型的模块化系数,即系统是由层次不同、规模不同的模块组成。
2.2 软件模块的独立性
图1 软件结构
模块是软件结构的基础,软件结构的好坏完全由模块的属性体现出来。在软件中,模块是单独命名的可编址的元素,若组合成层次结构形式就是一个可执行的软件。模块化的概念引出的一个基本问题是“应如何分解一个软件,以得到最佳的模块组合?”有效的模块化可以通过定义一组“独立的”模块来实现。模块的独立性是通过制订具有单一功能,并且和其它模块没有过多联系的模块来实现的。即:希望每个模块只涉及该软件要求的一个具体的子功能,而且与软件结构其它部分的接口是简单的。提高模块的独立性,可使软件设计、调试、维护等过程变得容易和简单。
模块独立性是用“内聚度”和“耦合度”这两个定性指标来度量的,内聚度是度量一个模块功能的相对强度,耦合度是度量模块之
—
—21
间的相互联系的程度。内聚与耦合是互相关联的。在系统中,各模块的内聚越大,模块间的耦合将越小。结构设计的目标是力求增加模块的内聚,尽量减少模块间的耦合,但内聚比耦合更为重要。下面关于影响内聚度与耦合度的因素的详尽分析,可为衡量设计“优劣”(模块的独立性)提供较为具体的度量方法,给软件设计人员提供了极好的指导原则。而这些深入细微的分析方法,也可作为其它领域模块化应用的楷模。
在进行系统结构设计及系统的模块化分解中,“黑箱”概念是非常有用的。它的输入、输出功能是已知的,但其内部结构和内容是未知的或待定的。黑箱技术在系统开发的设计阶段是特别有用的,并把它看成通用的启发式的设计方法。当需要设计新的功能部件时,先把它定义为黑箱,在系统中先利用它,暂不考虑它的结构和实现方法,在进一步对它进行分解设计和加工时,接着又导致更多的黑箱,直到黑箱的内容和结构完全被确定。这就是通常所说的逐步求细过程。事实上,黑箱就是具有独立性的模块,黑箱的内聚度大而耦合度小,正是对模块属性的形象表达。黑箱技术是系统分解的有效方法。
2.3 模块的内聚度(模块强度)
内聚度是从功能角度来度量模块间的联系,即度量一个模块完成一项功能的能力,所以又叫模块强度。内聚可以看作把模块的成份结合在一起的粘合剂。一个内聚的模块(理想情况下)只完成软件过程的一项单一的任务。模块的内聚度,按其强弱可分为7种类型:①巧合内聚:把关系比较松散的任务组成一个模块,其缺点是不易修理和维护;②逻辑内聚:模块内各任务之间是逻辑相关。例如,把各模块中与“输入”相关的操作抽出来组成一个模块。通用的错误处理程序是典型的逻辑内聚模块,对不同类型的错误,它将打印出不同的错误信息;③时间内聚模块内包含几个必须同时执行的任务。例如,初始化模块,终止模块等;④过程内聚:利用程序框图某些部分的组合作为划分模块的基础。例如,把一个框图中的循环部分、制定部分和计算部分分成三个模块;⑤通迅内聚:这种模块的所有功能都通过使用公用数据而发生关系,例如,一个文件的删除修改模块;⑥顺序内聚:模块中一个成分的输出数据是下一个成分的输入数据,它由数据流图中相继(顺序)的部分组成;⑦功能内聚:包括了完成一个功能所必须的全部成分,或者说模块中所有成分结合起来是为了完成一项具体的任务。例如“计算平方根”这样一个单项功能。功能内聚模块的优点是更易排错和维护,因为它们的功能是明确的,模块间的耦合是简单的。
上述7种内聚的内聚度依次增强。设计模块时一般内聚度越大越好,但不能绝对化。提高模块内聚度是为了获得模块的透明性、可编程性、易于排错、维护。为了追求设计目标,例如节省存储空间和处理时间,可以降低内聚度。在实践中,没有必要去确定精确的内聚度等级。反之,重要的是要力争高的内聚度并能够识别出低的内聚度,通过适当调整软件设计,以得到更好的模块独立性。
2.4 模块的耦合度
耦合度是程序中模块之间相互依赖的量度。模块间的耦合方式从耦合的机制上可归纳成7类:①内容耦合:一个模块直接访问另一模块的内容。一般出现在汇编语言中;②公共耦合:一组模块都访问同一全局数据结构;
③外部耦合:一组模块都访问同一全局数据项(单域变量);④控制耦合:一模块明显地控制另一模块的功能(把开关、标志、名字等信息送到另一模块)。被控模块接口的任何修改,都将影响控制模块;⑤标记耦合:通过模块接口传递的是数据结构的某一部分而不是简单的参量。它增加了模块之间不必要的联接,应避免之;⑥数据耦合:一个模块访问另一模块,被访问模块的输入和输出都是数据项参数;⑦非直接耦合两个模块没有直接关
——:
:
22