1、第3章 概要设计 3.1 概要设计的任务 3.2 设计过程 3.3 设计原理 3.4 描绘软件结构的图形工具 3.5 启发规则 3.6 面向数据流的设计方法 实例分析 本章小结 任何工程项目,在生产之前必须要作设计,正如工任何工程项目,在生产之前必须要作设计,正如工程项目一样。软件编写代码前,也必须先进行软件设计。程项目一样。软件编写代码前,也必须先进行软件设计。软件设计是软件开发的关键步骤,直接影响软件的质量。软件设计是软件开发的关键步骤,直接影响软件的质量。在软件需求分析阶段已经完全弄清楚了软件的各种在软件需求分析阶段已经完全弄清楚了软件的各种需求,较好地解决了所开发的软件需求,较好地解决
2、了所开发的软件“做什么做什么”的问题,的问题,并已在软件需求说明书和数据要求说明书中详尽和充分并已在软件需求说明书和数据要求说明书中详尽和充分地阐明了这些需求以后,下一步就要着手对软件系统的地阐明了这些需求以后,下一步就要着手对软件系统的结构、数据结构、用户界面等进行设计,即软件设计阶结构、数据结构、用户界面等进行设计,即软件设计阶段要解决段要解决“怎么做怎么做”的问题,着手实现软件的需求,并的问题,着手实现软件的需求,并将设计结果反映在将设计结果反映在“设计规格说明书设计规格说明书”文档中。软件设文档中。软件设计是一个把软件需求转换为软件表示的过程,最初这种计是一个把软件需求转换为软件表示的
3、过程,最初这种表示只是描述了软件的总的体系结构,子系统和模块的表示只是描述了软件的总的体系结构,子系统和模块的划分,并确定模块间的接口和评价模块划分质量,以及划分,并确定模块间的接口和评价模块划分质量,以及进行数据分析,称软件概要设计或结构设计;然后对结进行数据分析,称软件概要设计或结构设计;然后对结构进一步细化,确定每一模块实现的定义,包括数据结构进一步细化,确定每一模块实现的定义,包括数据结构、算法和接口,称详细设计或过程设计。构、算法和接口,称详细设计或过程设计。本章主要介绍软件的概要设计。第本章主要介绍软件的概要设计。第4章介绍软件的章介绍软件的详细设计。详细设计。3.1 概要设计的任
4、务3.1.1 3.1.1 概要设计的任务概要设计的任务在概要设计中有以下几个主要任务。在概要设计中有以下几个主要任务。1.设计软件系统结构设计软件系统结构为实现需求规格说明书所确定的目标系统,首先为实现需求规格说明书所确定的目标系统,首先要进行系统结构设计,具体为:要进行系统结构设计,具体为:采用某种设计方法,将一个复杂的系统按功能采用某种设计方法,将一个复杂的系统按功能划分成模块。划分成模块。确定每个模块的功能。确定每个模块的功能。确定模块之间的调用关系。确定模块之间的调用关系。确定模块之间的接口,即模块之间传递的信息。确定模块之间的接口,即模块之间传递的信息。评价模块结构的质量。评价模块结
5、构的质量。3.1 概要设计的任务软件结构设计以模块为基础,并组织成模块的层软件结构设计以模块为基础,并组织成模块的层次结构。软件结构设计是概要设计关键的一步,直接次结构。软件结构设计是概要设计关键的一步,直接影响到详细设计与编码的工作。因此应由经验丰富的影响到详细设计与编码的工作。因此应由经验丰富的软件人员担任,采用一定的设计方法,选取合理的设软件人员担任,采用一定的设计方法,选取合理的设计方案。计方案。2.数据结构及数据库设计数据结构及数据库设计在大型数据处理软件开发时,不仅要进行控制结在大型数据处理软件开发时,不仅要进行控制结构的模块设计,还要进行数据结构与数据库的设计,构的模块设计,还要
6、进行数据结构与数据库的设计,具体包括:具体包括:数据结构设计。在需求分析阶段,已经过数据数据结构设计。在需求分析阶段,已经过数据字典对数据组成、操作约束、数据之间的关系等进行字典对数据组成、操作约束、数据之间的关系等进行了描述,确定了数据的结构特性,在概要设计阶段还了描述,确定了数据的结构特性,在概要设计阶段还要加以细化,详细设计阶段则规定具体的实现细节。要加以细化,详细设计阶段则规定具体的实现细节。在概要设计阶段,应使用抽象的数据类型,如在概要设计阶段,应使用抽象的数据类型,如“栈栈”是数据结构的概念模型,在详细设计中可用线性表和是数据结构的概念模型,在详细设计中可用线性表和链表来实现。链表
7、来实现。3.1 概要设计的任务数据库的设计:指数据存储文件的设计,主要数据库的设计:指数据存储文件的设计,主要进行下面几方面设计:进行下面几方面设计:概念设计:采用自底向上的方法从用户角度进概念设计:采用自底向上的方法从用户角度进行视图设计,一般用行视图设计,一般用ER图模型来表示数据模型。图模型来表示数据模型。ER模模型既是设计数据库的基础,也是设计数据结构的基础。型既是设计数据库的基础,也是设计数据结构的基础。逻辑设计:逻辑设计:ER模型是独立于数据库管理系统模型是独立于数据库管理系统(DBMS)的,要结合具体的的,要结合具体的DBMS特征来建立数据库的特征来建立数据库的逻辑结构。逻辑结构
8、。物理设计:对不同的物理设计:对不同的DBMS,物理环境不同,提,物理环境不同,提供的存储结构与存取方式各不相同。物理设计是设计供的存储结构与存取方式各不相同。物理设计是设计数据模式的一些物理细节,如数据存储要求、存取方数据模式的一些物理细节,如数据存储要求、存取方式、索引的建立等。式、索引的建立等。3.1 概要设计的任务3.编写概要设计文档编写概要设计文档主要内容有:主要内容有:概要设计说明书。概要设计说明书。数据设计说明,主要介绍所使用的数据设计说明,主要介绍所使用的DBMS简介、简介、数据库的概念模型、逻辑设计、结果。数据库的概念模型、逻辑设计、结果。用户手册:对需求分析阶段编写的用户手
9、册进用户手册:对需求分析阶段编写的用户手册进行补充。行补充。修订测试计划,对测试策略、方法、步骤提出修订测试计划,对测试策略、方法、步骤提出明确要求。明确要求。4.评审评审对设计部分是否完整地实现需求中规定的功能、对设计部分是否完整地实现需求中规定的功能、性能等要求,设计方案的可行性,关键的处理及内外性能等要求,设计方案的可行性,关键的处理及内外部接口定义正确性、有效性,各部分之间的一致性等部接口定义正确性、有效性,各部分之间的一致性等都一一评审。都一一评审。3.1 概要设计的任务3.1.2 3.1.2 概要设计说明书的主要内容概要设计说明书的主要内容概要设计说明书又称系统设计说明书,它是概要
10、概要设计说明书又称系统设计说明书,它是概要设计阶段结束时提交的技术文档,为详细设计提供基设计阶段结束时提交的技术文档,为详细设计提供基础,其主要内容如下:础,其主要内容如下:1.引言:编写目的,项目背景,定义,参考资料。引言:编写目的,项目背景,定义,参考资料。2.任务概述:目标,运行环境,需求概述,条件任务概述:目标,运行环境,需求概述,条件与限制。与限制。3.概要设计:处理流程,总体结构和模块外部设概要设计:处理流程,总体结构和模块外部设计,功能分配。计,功能分配。3.1 概要设计的任务4.接口设计:用户界面,外部接口,内部接口。接口设计:用户界面,外部接口,内部接口。5.数据结构设计:逻
11、辑结构设计,物理结构设计,数据结构设计:逻辑结构设计,物理结构设计,数据结构与程序的关系。数据结构与程序的关系。6.运行设计:运行模块的组合,运行控制,运行运行设计:运行模块的组合,运行控制,运行时间。时间。7.出错处理设计:出错输出信息,出错处理对策。出错处理设计:出错输出信息,出错处理对策。8.安全保密设计和维护设计。安全保密设计和维护设计。3.2 设计过程在概要设计阶段,首先要找出实现目标系统的各在概要设计阶段,首先要找出实现目标系统的各种可能方案,然后从这些方案中选取合理的方案并推种可能方案,然后从这些方案中选取合理的方案并推荐出最佳实施方案。接下来为最终方案制定详细的计荐出最佳实施方
12、案。接下来为最终方案制定详细的计划及设计软件结构、进行必要的数据库设计和制定测划及设计软件结构、进行必要的数据库设计和制定测试计划。具体过程如下。试计划。具体过程如下。1.设想供选择的方案设想供选择的方案软件分析员根据系统要求,提出并分析各种可能软件分析员根据系统要求,提出并分析各种可能的方案,并且从中选出最佳的方案,为以后的工作做的方案,并且从中选出最佳的方案,为以后的工作做好准备。好准备。3.2 设计过程首先需求分析阶段得出的数据流图是概要设计的首先需求分析阶段得出的数据流图是概要设计的根本出发点。数据流图中的处理可以逻辑地进行分组,根本出发点。数据流图中的处理可以逻辑地进行分组,每一组都
13、代表不同的实现策略。然后对这些分组得出每一组都代表不同的实现策略。然后对这些分组得出的方案进行分析,产生一系列可供选择的方案。最后的方案进行分析,产生一系列可供选择的方案。最后结合实际因素,如工程的目标、规模和用户的意见等,结合实际因素,如工程的目标、规模和用户的意见等,从可能的实现方案中选取若干个合理的方案。通常,从可能的实现方案中选取若干个合理的方案。通常,选取的这些方案中应包括低成本、中成本和高成本三选取的这些方案中应包括低成本、中成本和高成本三种方案。对每个方案需提供系统流程图、数据字典、种方案。对每个方案需提供系统流程图、数据字典、成本效益分析、实现系统的进度计划。成本效益分析、实现
14、系统的进度计划。3.2 设计过程2.选取最佳的方案选取最佳的方案分析员对每个合理方案综合权衡,比较各自优缺分析员对每个合理方案综合权衡,比较各自优缺点,选择一个最佳方案向用户推荐,并做出详细的实点,选择一个最佳方案向用户推荐,并做出详细的实现进度计划。现进度计划。对于分析员提交的最佳方案,用户和有关技术专对于分析员提交的最佳方案,用户和有关技术专家认真地进行审查。如果确认该方案确实符合需要且家认真地进行审查。如果确认该方案确实符合需要且在现有的条件下能够实现,进一步提交给使用部门负在现有的条件下能够实现,进一步提交给使用部门负责人审批,审批接受分析员推荐的最佳实施方案后,责人审批,审批接受分析
15、员推荐的最佳实施方案后,才能进入结构设计阶段。才能进入结构设计阶段。3.2 设计过程3.功能分解功能分解为确定软件的结构,首先要把复杂的系统功能分为确定软件的结构,首先要把复杂的系统功能分解成简单的功能,确定软件系统都由哪些模块组成,解成简单的功能,确定软件系统都由哪些模块组成,以及这些模块间的相互关系。同时进一步细化数据流以及这些模块间的相互关系。同时进一步细化数据流图。分解后,分析员使用层次图或结构图来描述模块图。分解后,分析员使用层次图或结构图来描述模块组织成的层次结构,实现由上层向下层的调用,最下组织成的层次结构,实现由上层向下层的调用,最下层的模块完成具体的功能。层的模块完成具体的功
16、能。4.设计软件结构设计软件结构设计软件结构是概要设计阶段的核心工作。主要设计软件结构是概要设计阶段的核心工作。主要应用软件设计的概念和原理,采用面向数据流的设计应用软件设计的概念和原理,采用面向数据流的设计方法方法(结构化设计方法结构化设计方法SD)将软件划分层次和结构。将软件划分层次和结构。3.2 设计过程通常程序中的一个模块完成一个适当的功能,应通常程序中的一个模块完成一个适当的功能,应该把模块组织成良好的层次系统,顶层模块调用它的该把模块组织成良好的层次系统,顶层模块调用它的下层模块以实现程序的完整功能,每个下层模块再调下层模块以实现程序的完整功能,每个下层模块再调用更下层的模块,从而
17、完成程序的一个子功能,最下用更下层的模块,从而完成程序的一个子功能,最下层的模块完成最具体的功能。如果数据流图已细化到层的模块完成最具体的功能。如果数据流图已细化到了适当的层次,则可以直接从数据流图中映射出软件了适当的层次,则可以直接从数据流图中映射出软件结构。结构。5.数据库设计数据库设计应用所学的数据库知识,对软件系统进行数据库应用所学的数据库知识,对软件系统进行数据库设计。根据数据要求,分析员对需要使用数据库应用设计。根据数据要求,分析员对需要使用数据库应用的领域,进一步做数据库的模块设计。数据库设计主的领域,进一步做数据库的模块设计。数据库设计主要包括模式设计、子模式设计、完整性与安全
18、性设计、要包括模式设计、子模式设计、完整性与安全性设计、改进与优化处理等。改进与优化处理等。3.2 设计过程在设计中,还要包括代码设计。代码设计是为了在设计中,还要包括代码设计。代码设计是为了操作方便,为了区别唯一实体引入的字段。代码设计操作方便,为了区别唯一实体引入的字段。代码设计首先要考虑是否已有国家标准、行业标准、部门标准、首先要考虑是否已有国家标准、行业标准、部门标准、企业标准,如果没有相关标准,可考虑重新设计代码。企业标准,如果没有相关标准,可考虑重新设计代码。代码的长度,既要保证代码具有可扩充性,又要代码的长度,既要保证代码具有可扩充性,又要作到代码尽可能短小精悍。代码中可包含属性
19、,属性作到代码尽可能短小精悍。代码中可包含属性,属性应当是稳定的。代码的校验,主要校验方法有:带校应当是稳定的。代码的校验,主要校验方法有:带校验位的代码校验方法,代码库检索校验方法,常用校验位的代码校验方法,代码库检索校验方法,常用校验方法的综合运用和类型校验、长度校验、取值范围验方法的综合运用和类型校验、长度校验、取值范围的校验等。的校验等。3.2 设计过程6.制定测试计划制定测试计划在软件开发的早期阶段考虑测试问题,能促使软在软件开发的早期阶段考虑测试问题,能促使软件设计人员在设计时注意提高软件的可测试性。在后件设计人员在设计时注意提高软件的可测试性。在后面的章节中将详细地介绍软件测试的
20、有关内容。面的章节中将详细地介绍软件测试的有关内容。7.书写文档书写文档应该用正式的文档记录概要设计的结果,在这个应该用正式的文档记录概要设计的结果,在这个阶段应该完成的文档有:系统说明、用户手册、测试阶段应该完成的文档有:系统说明、用户手册、测试计划、详细的实现计划、数据库设计结果等。计划、详细的实现计划、数据库设计结果等。8.审查和复审审查和复审最后,对概要设计的结果进行严格的技术审查,最后,对概要设计的结果进行严格的技术审查,并在技术审查通过之后再由使用部门的负责人从管理并在技术审查通过之后再由使用部门的负责人从管理的角度进行复审。的角度进行复审。3.3 设计原理3.3.1 模块化软件结
21、构是软件模块之间关系的表示,它决定了整个系统的结构,也确定了系统的质量。那么何为模块?模块在程序中是数据说明、可执行语句等程序对象的集合,或是单独命名和编址的元素,如高级语言中的过程、函数、子程序等。在软件的体系结构中,模块是可组合、分解和更换的单元。模块具有以下几种基本属性:接口:指模块的输入与输出。功能:指模块实现什么功能。逻辑:描述内部如何实现要求的功能及所需的数据。状态:该模块的运行环境,即模块的调用与被调用关系。3.3 设计原理其中功能、状态与接口反映模块外部特性,逻辑反映内部特性。模块化指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。每个模块完成一个特定的子功能,所
22、有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能。模块化是解决软件复杂问题的一种手段。下面根据人类解决问题的一般规律,描述上面所提出的结论。定义两个函数C(X)和E(X):C(X)表示问题X 的复杂程度;E(X)表示解决问题X 所需要的工作量(时间)。对于两个问题P1 和P2,如果C(P1)C(P2)即P1比P2复杂3.3 设计原理则E(P1)E(P2)即问题越复杂,解决问题所需要的工作量越大又因为根据人类解决一般问题的经验,规律是:C(P1+P2)C(P1)+C(P2)即由P1和P2两个问题组合成的一个问题的复杂程度大于分别考虑每个问题时的复杂程度之和。这样,综合以上结论,
23、可以得到不等式E(P1+P2)E(P1)+E(P2)3.3 设计原理即单独解决问题P1和P2所需的工作量之和比把P1和P2组合成一个问题来解决时所需的工作量要少。这正是模块化提出的根据:把复杂问题分解成许多容易解决的小问题,提高了工作效率。但是,模块化设计并不意味着无限地划分模块。开发软件过程中,为了追求较少的工作量使模块数目增加,确实使每个模块的规模减少,但随着模块数目的增加,设计各模块间接口所需的工作量也将增加。因此,每个程序都相应地有一个最适当的模块数目M,才能使系统的开发成本最小,如图3-1描述了模块化与软件成本的关系。3.3 设计原理图3-1 模块化与软件成本的关系3.3 设计原理3
24、.3.2 3.3.2 抽象与逐步求精抽象与逐步求精人类认识现实世界中的事物是复杂多样的,但事物之间也有相似的方面,若我们在考虑问题时,把事物之间的共性集中和概括起来,而忽略它们之间的差异,这就是抽象,即抽出事物的本质特性而暂时不考虑它们的细节。抽象的思想在软件开发中起着重要作用。面对复杂的动态系统,处理的有效方法就是用层次的方式构造和分析它。用模块化设计的思想来解决问题时,可以提出不同层次的抽象。在抽象的最高层,使用问题环境的语言,以概括的方式叙述问题的解法;在抽象的较底层,采用更过程化的方法,把面向问题的术语和面向实现的术语结合起来叙述问题的解法;最后,在抽象的最底层,可以用直接实现的方式来
25、叙述问题的解法。3.3 设计原理软件工程过程的每一阶段都是对软件解法的一次求精。如可行性研究阶段是对软件的最高层次抽象,软件作为系统的一个完整部件;在需求分析期间,使用在问题环境内熟悉的方式描述;当由概要设计向详细设计过渡时,抽象的程度随之减少;最后,当源程序写出来以后,也就达到了最底层。逐步求精由Wirth提出的一种设计策略,他对逐步求精策略曾做过如下的说明:3.3 设计原理“我们对付复杂问题的最重要的办法是抽象,因此,对一个复杂的问题不应该立刻用计算机指令、数字和逻辑符号来表示,而应该用较自然的抽象语句来表示,从而得出抽象程序。抽象程序对抽象的数据进行某些特定的运算并用某些合适的记号(可能
26、是自然语言)来表示。对抽象程序做进一步的分解,并进入下一个抽象层次,这样的精细化过程一直进行下去,直到程序能被计算机接受为止。这时的程序可能是用某种高级语言或机器指令书写的。”随着软件开发工程的进展,在软件结构每一层中的模块,表示了对软件抽象层次的一次细化。层次结构的上一层是下一层的抽象,下一层是上一层的求精。通过逐步分解对功能的宏观陈述而开发出层次结构,直至最终得出用程序设计语言表达的程序。所以说,逐步求精与抽象是一致的。3.3 设计原理例如要开发一个CAD软件,能够实现绘图系统的全部功能,供初级CAD使用。下面在不同的抽象层次,应用不同的描述方法对该问题进行抽象和细化。抽象层次l:用问题所
27、处环境的术语描述这个软件。该软件系统具有一个可视化绘图界面以及一个数字化仪界面。能用鼠标代替绘图工具画出各种曲线和直线,能完成几何计算和截面视图及辅助视图的设计,能将图形设计结果存于图形文件中。3.3 设计原理抽象层次2:任务需求描述。CAD 软件任务 用户界面任务;创建二维图形任务;显示图形任务;管理图形任务END CAD在此抽象层次上,所用术语不再是问题所处环境的语言,但并没有给出如何做的信息,不能直接实现。3.3 设计原理抽象层次3:程序过程表示。下面以二维图形任务为例进行说明。PROCEDURE 创建二维图形 REPEAT WHILE 出现与数字仪的交互时 数字仪接口任务;判断作图请求
28、;线:画线任务;圆;画圆任务;END WHILE;3.3 设计原理 WHILE 出现与键盘的交互时 键盘接口任务;选择分析或计算;辅助视图:辅助视图任务;截面视图:截面视图任务;END WHILE;UNTIL 创建图形任务终止END PROCEDURE在这一抽象层次上,给出了初步过程表示,所有的术语都是面向软件,并且模块结构也开始明朗细化过程可进行下去,直到获得源代码。3.3 设计原理3.3.3 信息隐蔽信息隐蔽指在设计和确定模块时,使得一个模块内包含的信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。通过抽象,可确定组成软件的过程实体;通过隐蔽,可定义和实施对模块的过程细节
29、和局部数据结构的存取限制。有效的模块化通过一组相互独立的模块来实现,这些独立的模块彼此之间仅仅交换那些为了完成系统功能所必须的信息,而将那些自身的实现细节与数据“隐藏”起来。3.3 设计原理信息隐蔽为软件系统的修改、测试及以后的维护带来好处。在划分模块时要采取措施,如采用局部数据结构,使得大多数过程(即实现细节)和数据对软件的其他部分是隐藏的。这样修改软件时偶然引入的错误所造成的影响只局限在一个或少量几个模块内部。局部化的概念和信息隐蔽概念是密切相关的。局部化是指把一些关系密切的软件元素在物理位置上彼此靠近。在模块中使用局部数据元素就是局部化的一个例子。局部化有利于实现信息隐蔽。3.3 设计原
30、理3.3.4 模块独立性模块独立性指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。模块独立性概念是模块化、抽象、信息隐蔽这些软件工程基本原理的直接产物。只有符合和遵守这些原则才能得到高度独立的模块。良好的模块独立性能使开发的软件具有较高的质量。模块独立性强,则信息隐蔽性好,并完成独立的功能,且它的可理解、可维护性、可测试性好,导致软件的可靠性高。根据模块的外部特征和内部特征,衡量软件独立的两个定性指标是:耦合性和内聚性。3.3 设计原理1.耦合性:也称块间联系,指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,耦合性越强,模块的独立性则越差。模
31、块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。模块的耦合性有以下几种类型:非直接耦合:指两个模块之间没有直接的关系,它们分别从属于不同模块的控制与调用,它们之间不传递任何信息。因此耦合性最弱,独立性最高。数据耦合:指两个模块之间有调用关系,传递的是简单的数据值,相当于高级语言的值传递。耦合程度较低,模块的独立性较高。3.3 设计原理 标记耦合:指两个模块间传递的是数据结构,如高级语言的数组名、记录名、文件名等这些名字即为标记。两个模块必须清楚这些数据结构,并按要求对其进行操作,降低了可理解性。可采用“信息隐蔽”方法,把该数据结构及在其上的操作全部集中在一个模块,就可清除这种耦合
32、。控制耦合:如果模块传递的信息中有控制信息,就称作控制耦合,指一个模块调用另一个模块时,传递的是控制变量(如开关、标志等),被调模块通过该控制变量的值有选择地执行块内某一功能,如图3-2所示。这种耦合的实质是在单一接口上选择多功能模块中的某项功能。因此,对被控制模块的任何修改,都会影响控制模块。控制耦合属于中等程度的耦合,它增加了系统的复杂程度。3.3 设计原理图3-2 控制耦合3.3 设计原理 外部耦合:如果一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称为外部耦合。公共耦合:指通过一个公共数据环境相互作用的那些模块间的耦合。公共数据环境可以
33、是全程变量或数据结构、共享的通信区、内存的公共覆盖区及存储介质上的文件、物理设备等。公共耦合复杂程度随耦合模块的个数增加而增加。如只有两个模块之间有公共数据环境,这种公共耦合有两种情况:3.3 设计原理一个模块只给公共数据环境送数据,另一模块只从公共环境中取数据,这是数据耦合的一种形式,是比较松散的公共耦合。两个模块都既往公共数据环境送数据,又从里面取数据,这是紧密的数据耦合。公共耦合会引起以下问题:耦合的复杂程度随模块个数增加而增加,无法控制各个模块对公共数据的存取,如某个模块有错,通过公共区将错误延伸到其他模块,影响软件的可靠性。使软件的可维护性变差,若一模块修改了公共区数据,会影响到与此
34、有关的所有模块。降低软件的可理解性,某些数据被哪些模块共享,不易搞清。3.3 设计原理 内容耦合:是最高程度耦合,也是最差的耦合。如图3-3所示,内容耦合的模块常具有以下特征:一个模块直接访问另一模块的内部数据,一个模块不通过正常入口转到另一模块的内部,一个模块有多个入口或者两个模块有部分代码重迭。图3-3 内容耦合3.3 设计原理以上7 种耦合之间的关系如图3-4 所示。图3-4 7种耦合类型的关系3.3 设计原理为降低模块间的耦合度,可采取如下措施:在耦合方式上降低模块间接口的复杂性。接口复杂性包括模块的接口方式、接口信息的结构和数量。接口方式不采用直接引用(内容耦合),而采用调用方式。接
35、口信息通过参数传递且传递信息的结构尽量简单,不用复杂参数结构(如过程、指针等类型参数),参数个数不宜过多。在传递信息类型上尽量使用数据耦合,避免控制耦合,慎用公共耦合。3.3 设计原理2.内聚性:又称块内联系,指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语句间、程序段间)联系的越紧密,它的内聚性越高,内聚性有下面几种类型:偶然内聚:指一个模块内各处理元素之间没有任何联系。这样的模块不易理解也不易修改,是最差的内聚情况。逻辑内聚:指模块内执行几个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。这种模块内聚程度有所提高,各部分间在功能上有相互关系
36、,但不易修改,当某个调用模块要求修改此模块公用代码时,另一些模块又不要求修改。另外,调用时需要进行控制参数的传递,造成控制耦合;调用此模块时,不用的部分也占据内存,降低系统效率。3.3 设计原理 时间内聚:把需要同时执行的动作组合在一起形成的模块为时间内聚模块。如初始化一组变量,同时打开若干文件等。时间内聚比逻辑内聚程度高一些,但这样的模块和其他模块耦合程度较高。过程内聚:如果一个模块内的处理是相关的,而且必须以特定次序执行,则称为过程内聚。使用程序流程图作为工具设计程序时,常常通过流程图来确定模块的划分,这样得到的就是过程内聚模块。它相对时间内聚的程度更强一些,但由于仅仅为完整功能的一部分,
37、所以内聚程度仍比较低。3.3 设计原理 通信内聚:指模块内所有处理元素都在同一个数据结构上操作(有时称信息内聚),或指各处理使用相同的输入数据或产生相同的输出数据。如一个模块完成:生产日报表、周报表、月报表,都使用同一数据即日产量。通信内聚的内聚性要高于前种类型,同时可把某一数据结构、文件等操作放在一个模块内,达到信息隐藏。顺序内聚:指一个模块中各个处理元素都密切相关于同一功能且必须顺序执行,前一功能元素的输出是下一功能元素的输入。功能内聚:是最强的内聚,指模块内所有元素共同完成一个功能,缺一不可。因此模块不能再分割。功能内聚的模块易理解、易修改,它的功能是明确的、单一的,与其他模块的耦合是弱
38、的。功能内聚的模块有利于实现软件的重用,提高软件开发的效率。3.3 设计原理以上以上7 种内聚之间的关系如图种内聚之间的关系如图3-5所示。所示。图3-5 7种内聚类型的关系耦合性与内聚性是模块独立性的两个定性标准,耦合性与内聚性是模块独立性的两个定性标准,将软件系统划分模块时,尽量做到高内聚低耦合,提将软件系统划分模块时,尽量做到高内聚低耦合,提高模块独立性,为设计高质量的软件结构奠定基础。高模块独立性,为设计高质量的软件结构奠定基础。3.4 描绘软件结构的图形工具3.4.1 软件结构图软件结构图是Yourdon提出的进行软件结构设计的有力工具。图中一个方块代表一个模块,框内注明模块的名字或
39、主要功能;方框之间的箭头(或直线)表示模块的调用关系。一般可表示为层次结构,如图3-6所示。3.4 描绘软件结构的图形工具图3-6 软件结构示意图3.4 描绘软件结构的图形工具衡量软件结构的有关指标有:深度:表示软件结构中从顶层模块到最底层模块的层数;宽度:表示一层中最大的模块个数;扇出数:指一个模块直接控制下属的模块个数;扇入数:指一个模块的直接上属模块个数。3.4 描绘软件结构的图形工具软件结构图的主要内容有:1.模块:用矩形框表示,框中写有模块的名字,说明模块的功能。模块是程序对象有名字的集合。例如:过程、函数、子程序、宏等。软件结构图中主要的模块有四类,分别是传入模块、传出模块、变换模
40、块和协调模块。传入模块从下级模块获得数据经过处理传递到上级模块。传出模块从上级模块获得数据经过处理传递到下级模块。变换模块主要实现变换处理。协调模块对所有下级模块进行协调和管理,如图3-7所示。3.4 描绘软件结构的图形工具图3-7 四种模块画法3.4 描绘软件结构的图形工具2.调用:从一个模块指向另一个模块的箭头表示前一模块对后一模块的调用,一般是上层调用下层。图3-8表示模块1 调用了模块2 和模块3。3.数据:调用箭头边上的小箭头表示调用时从一个模块传送给另一模块的数据。通常在短箭头附近应注有信息的名字,如图3-8所示。3.4 描绘软件结构的图形工具图3-8 模块及模块调用3.4 描绘软
41、件结构的图形工具数据又分为数据信息和控制信息两类,如果要区分这两类信息,通常可用尾端带有空心圆的短箭头表示数据信息,用尾端带有实心圆的短箭头表示控制信息,如图3-9所示。有的结构图对这两种信息不加以区别,一律用注有信息名的短箭头“”来表示(如图3-8)。图3-9是模块间接口的表示。图3-9 模块间接口的表示3.4 描绘软件结构的图形工具为了进一步描述模块之间的调用关系,还可使用两种辅助符号,分别表示条件选择和循环。如在图3-10 中,模块A 有条件地调用另一个模块B 时(或者模块C、D),在模块A 的箭头尾部标以一个菱形符号,表示条件选择。当一个模块A 反复地调用模块B、模块C 和模块D 时,
42、在调用箭头尾部则标以一个弧形符号表示循环。如图3-10 所示,在结构图中这种条件调用所依赖的条件和循环调用所依赖的循环控制条件通常无需注明。3.4 描绘软件结构的图形工具图3-10 辅助符号3.4 描绘软件结构的图形工具3.4.2 层次图层 次 图 也 称 H I P O(H i e r a r c h y P l u s Input/Processing/Output)图,是美国IBM公司发展起来的表示软件系统结构的工具,适用于描绘软件的层次结构,特别适合于在自顶向下设计时使用。它既可描述软件总的模块层次结构H图(层次图),又可描述每个模块输入/输出数据、处理功能及模块调用的详细情况IPO图
43、(输入/处理/输出图)。HIPO图以模块分解的层次性及模块内部输入、处理、输出三大基本部分为基础建立的。1.HIPO图的H图用于描述软件的层次结构,矩形框表示一个模块,矩形框间的直线表示模块之间的调用关系,不指明调用顺序。图3-11为销售系统的HIPO图。3.4 描绘软件结构的图形工具图3-11 销售系统的HIPO图3.4 描绘软件结构的图形工具2.IPO图H图只说明软件系统由哪些模块及其控制层次结构,未说明模块间信息传递及模块内部的处理。对一些重要模块还必须根据数据流图、数据字典及H图绘制具体的IPO图。IPO图左边的框中列出了有关的输入数据,中间的框内列出了主要的处理,右边框内列出产生的输
44、出数据,处理框中列出的处理次序暗示了执行次序,各个框间用箭头指出数据通信的情况。图3-12是一个IPO的示例。3.4 描绘软件结构的图形工具这里建议使用一种改进的IPO图(也称为IPO表),这种图中包含某些附加的信息,在软件设计过程中很有用。使用方法如图3-13所示。图3-12 IPO图的示例3.4 描绘软件结构的图形工具HIPO图上无过多符号显得较清晰易读,作为概要设计的文档比较合适。在反映软件结构控制关系方面,如重复调用、选择调用、调用公共模块及重要模块间信息传递,使用结构图能较好地表达出来,有利于评价系统结构质量。图3-13 改进后的IPO图示例3.5 启发规则人们在开发软件的实践过程中
45、累积了丰富的经验,人们在开发软件的实践过程中累积了丰富的经验,总结成一些启发式准则,可以帮助设计人员设计出高质总结成一些启发式准则,可以帮助设计人员设计出高质量的软件。主要有以下几点规则。量的软件。主要有以下几点规则。1.提高模块独立性提高模块独立性设计出软件的初步结构以后,通过模块的分解或合设计出软件的初步结构以后,通过模块的分解或合并,力求降低耦合提高内聚,从而提高模块独立性。对并,力求降低耦合提高内聚,从而提高模块独立性。对各个模块公共的部分提取出来生成一个单独的高内聚模各个模块公共的部分提取出来生成一个单独的高内聚模块;也可通过分解或合并模块以减少控制信息的传递及块;也可通过分解或合并
46、模块以减少控制信息的传递及对全局数据的引用,降低接口的复杂程度。对全局数据的引用,降低接口的复杂程度。2.选择合适的模块规模选择合适的模块规模限制模块的规模也可以降低复杂性。通常规定一个限制模块的规模也可以降低复杂性。通常规定一个模块最好以一页纸为限模块最好以一页纸为限(约约50100行语句行语句),这便于程,这便于程序的阅读和理解。对于过大或过小的模块能否进一步分序的阅读和理解。对于过大或过小的模块能否进一步分解或合并,还应根据具体情况而定,关键要保证模块的解或合并,还应根据具体情况而定,关键要保证模块的独立性。独立性。3.5 启发规则3.适当选择模块的深度、宽度、扇入和扇出适当选择模块的深
47、度、宽度、扇入和扇出深度标志一个系统的大小和复杂程度。如果层数过深度标志一个系统的大小和复杂程度。如果层数过多,则对于某些简单模块考虑适当合并。多,则对于某些简单模块考虑适当合并。一般来说,宽度越大系统越复杂。一般来说,宽度越大系统越复杂。如果扇出太大,意味着模块过于复杂,缺少中间层如果扇出太大,意味着模块过于复杂,缺少中间层次,可增加中间层次的控制模块;如果扇出过小,可以次,可增加中间层次的控制模块;如果扇出过小,可以把下级模块进一步分解或把它合并到上一级模块中去。把下级模块进一步分解或把它合并到上一级模块中去。通常,一个设计得好的系统平均扇出是通常,一个设计得好的系统平均扇出是3 或或4。
48、扇入越大意味着共享该模块的上级模块数目越多,扇入越大意味着共享该模块的上级模块数目越多,这是有好处的,但不能一味强调高扇入而违背模块独立这是有好处的,但不能一味强调高扇入而违背模块独立性原则。性原则。经验表明,优秀的软件结构通常顶层扇出高,中层经验表明,优秀的软件结构通常顶层扇出高,中层扇出较少,底层扇入到公共的实用模块中去。扇出较少,底层扇入到公共的实用模块中去。3.5 启发规则4.模块的作用范围应在控制范围之内模块的作用范围应在控制范围之内模块的控制范围包括它本身以及所有直接或间接的模块的控制范围包括它本身以及所有直接或间接的下属模块。模块的作用范围是指模块内一个判定影响的下属模块。模块的
49、作用范围是指模块内一个判定影响的所有模块的集合。例如,在图所有模块的集合。例如,在图3-12 中模块中模块A 的控制域的控制域是是A、B、C、D、E、F 模块。模块。图图3-14 模块的作用范围和控制范围模块的作用范围和控制范围3.5 启发规则在一个设计良好的系统模块结构图中,所有受一个在一个设计良好的系统模块结构图中,所有受一个判定影响的模块应该都从属于该判定所在的模块,最好判定影响的模块应该都从属于该判定所在的模块,最好局限于做出判定的那个模块本身及它的直接下属模块。局限于做出判定的那个模块本身及它的直接下属模块。例如,如果图例如,如果图3-12中,模块中,模块A 做出的判定只影响模块做出
50、的判定只影响模块B,那么是符合这条规则的,但是,如果模块,那么是符合这条规则的,但是,如果模块A做出的做出的判定同时还影响模块判定同时还影响模块G 中的处理过程,这样的结构就中的处理过程,这样的结构就难于理解。为了使难于理解。为了使A 中的判定能够影响中的判定能够影响G 中的处理过中的处理过程,通常需要在程,通常需要在A中给一个标记设置状态以指示判定的中给一个标记设置状态以指示判定的结果,并且应该把这个标记传递给结果,并且应该把这个标记传递给A和和G的公共上级模的公共上级模块块M,再由,再由M 传给传给G。这个标记是控制信息而不是数据,。这个标记是控制信息而不是数据,因此将使模块间出现控制耦合
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。