资源预览内容
第1页 / 共92页
第2页 / 共92页
第3页 / 共92页
第4页 / 共92页
第5页 / 共92页
第6页 / 共92页
第7页 / 共92页
第8页 / 共92页
第9页 / 共92页
第10页 / 共92页
亲,该文档总共92页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第5章 总体设计5.1 5.1 设计过程设计过程5.2 5.2 设计原理设计原理5.3 5.3 启发规则启发规则5.4 5.4 描绘软件结构的图形工具描绘软件结构的图形工具5.5 5.5 面向数据流的设计方法面向数据流的设计方法5.6 5.6 小结小结习题习题软件设计软件设计 需求分析需求分析: :软件系统必须软件系统必须“做什么做什么” ;软件设计:软件设计:“如何做如何做”才可以满足需求规格说明中才可以满足需求规格说明中规定的各项需求。规定的各项需求。 从工程管理的角度来看,软件设计通常分为两步,从工程管理的角度来看,软件设计通常分为两步,即概要设计和详细设计。即概要设计和详细设计。概要设计的基本目的是回答概要设计的基本目的是回答“概括地说,软件系统应概括地说,软件系统应如何实现如何实现”这一问题。因此,概要设计有时称为这一问题。因此,概要设计有时称为初步初步设计或总体设计设计或总体设计。这个阶段的工作将划分出组成系统的这个阶段的工作将划分出组成系统的物理元素物理元素程序、文件、数据库、人工过程和文档等,每个物理元素仍处在黑盒子级,具体内容将在以后仔细设计。概要设计的关键是确定软件的总体结构,即确定软件概要设计的关键是确定软件的总体结构,即确定软件系统的组成成份(子系统或模块)以及各组成成份之系统的组成成份(子系统或模块)以及各组成成份之间的相互关系。间的相互关系。软件设计软件设计( ( 续)续) 详细设计是对概要设计结果的进一步细化,其主要任详细设计是对概要设计结果的进一步细化,其主要任务是确定软件系统各组成成份内部的数据结构和算法务是确定软件系统各组成成份内部的数据结构和算法过程过程方法:结构化方法、面向对象方法方法:结构化方法、面向对象方法 软件设计软件设计( ( 续)续) 总体设计过程l首先寻找实现目标系统的各种不同的方案(需求分析阶段得到的数据流图是设想各种可能方案的基础)。l然后分析员从这些供选择的方案中选取若干个合理的方案,为每个合理的方案都准备一份系统流程图,列出组成系统的所有物理元素,进行成本效益/分析,并且制定实现出一个最佳方案的进度计划。l系统分析员推荐最佳方案,用户接受后,为这个最佳方案设计软件结构。进行必要的数据库设计,确定测试要求并制定测试计划。总体设计的必要性可以站在全局高度上,花较少成本,从较抽象的层次上分析对比多种可能的系统实现方案和软件结构,从中选出最佳方案和最合理的软件结构,从而用较低成本开发出较高质量的软件系统。q总体设计过程由两个主要阶段总体设计过程由两个主要阶段总体设计过程由两个主要阶段总体设计过程由两个主要阶段( ( ( (包括包括包括包括9 9 9 9个步骤个步骤个步骤个步骤) ) ) )组成:组成:组成:组成:(1)(1)(1)(1)系统设计阶段,确定系统的具体实现方案;系统设计阶段,确定系统的具体实现方案;系统设计阶段,确定系统的具体实现方案;系统设计阶段,确定系统的具体实现方案;(2)(2)(2)(2)结构设计阶段,确定软件结构。结构设计阶段,确定软件结构。结构设计阶段,确定软件结构。结构设计阶段,确定软件结构。q设计原理设计原理设计原理设计原理: : : :模块化、抽象、信息隐藏和局部化、模块独立模块化、抽象、信息隐藏和局部化、模块独立模块化、抽象、信息隐藏和局部化、模块独立模块化、抽象、信息隐藏和局部化、模块独立q模块的独立程度度量:模块的独立程度度量:模块的独立程度度量:模块的独立程度度量:内聚和耦合,在软件设计中应该追内聚和耦合,在软件设计中应该追内聚和耦合,在软件设计中应该追内聚和耦合,在软件设计中应该追求尽可能求尽可能求尽可能求尽可能松耦合、高内聚松耦合、高内聚松耦合、高内聚松耦合、高内聚的系统。的系统。的系统。的系统。q启发规则:启发规则:启发规则:启发规则:7 7 7 7条规则条规则条规则条规则q描绘软件结构的图形工具:描绘软件结构的图形工具:描绘软件结构的图形工具:描绘软件结构的图形工具:层次图、层次图、层次图、层次图、HIPOHIPOHIPOHIPO图、结构图图、结构图图、结构图图、结构图q面向数据流的设计方法:面向数据流的设计方法:面向数据流的设计方法:面向数据流的设计方法:变换流分析、事务流分析变换流分析、事务流分析变换流分析、事务流分析变换流分析、事务流分析5.1 设计过程总体设计过程通常由两个主要阶段组成:总体设计过程通常由两个主要阶段组成:总体设计过程通常由两个主要阶段组成:总体设计过程通常由两个主要阶段组成:(1)(1)(1)(1)系统设计阶段,确定系统的具体实现方案;系统设计阶段,确定系统的具体实现方案;系统设计阶段,确定系统的具体实现方案;系统设计阶段,确定系统的具体实现方案;(2)(2)(2)(2)结构设计阶段,确定软件结构。结构设计阶段,确定软件结构。结构设计阶段,确定软件结构。结构设计阶段,确定软件结构。典型的总体设计过程包括下述典型的总体设计过程包括下述典型的总体设计过程包括下述典型的总体设计过程包括下述9 9 9 9个步骤:个步骤:个步骤:个步骤:1.1.1.1.设想供选择的方案设想供选择的方案设想供选择的方案设想供选择的方案2.2.2.2.选取合理的方案选取合理的方案选取合理的方案选取合理的方案3.3.3.3.推荐最佳方案推荐最佳方案推荐最佳方案推荐最佳方案4.4.4.4.功能分解功能分解功能分解功能分解5.5.5.5.设计软件结构设计软件结构设计软件结构设计软件结构6. 6. 设计数据库设计数据库设计数据库设计数据库7. 7. 制定测试计划制定测试计划制定测试计划制定测试计划8. 8. 书写文档书写文档书写文档书写文档9. 9. 审查和复审审查和复审审查和复审审查和复审在总体设计阶段分析员应该考虑各种可能的实现方案,在总体设计阶段分析员应该考虑各种可能的实现方案,在总体设计阶段分析员应该考虑各种可能的实现方案,在总体设计阶段分析员应该考虑各种可能的实现方案,并且力求从中选出最佳方案。在总体设计阶段开始时只有并且力求从中选出最佳方案。在总体设计阶段开始时只有并且力求从中选出最佳方案。在总体设计阶段开始时只有并且力求从中选出最佳方案。在总体设计阶段开始时只有系统的逻辑模型,分析员有充分的自由分析比较不同的物系统的逻辑模型,分析员有充分的自由分析比较不同的物系统的逻辑模型,分析员有充分的自由分析比较不同的物系统的逻辑模型,分析员有充分的自由分析比较不同的物理实现方案,一旦选出了最佳的方案,将能大大提高系统理实现方案,一旦选出了最佳的方案,将能大大提高系统理实现方案,一旦选出了最佳的方案,将能大大提高系统理实现方案,一旦选出了最佳的方案,将能大大提高系统的性能的性能的性能的性能/ / / /价格比。价格比。价格比。价格比。需求分析阶段得出的数据流图是总体设计的极好的出需求分析阶段得出的数据流图是总体设计的极好的出需求分析阶段得出的数据流图是总体设计的极好的出需求分析阶段得出的数据流图是总体设计的极好的出发点。设想供选择的方案的一种常用的方法是,发点。设想供选择的方案的一种常用的方法是,发点。设想供选择的方案的一种常用的方法是,发点。设想供选择的方案的一种常用的方法是,设想把数设想把数设想把数设想把数据流图中的处理分组的各种可能的方法,抛弃在技术上行据流图中的处理分组的各种可能的方法,抛弃在技术上行据流图中的处理分组的各种可能的方法,抛弃在技术上行据流图中的处理分组的各种可能的方法,抛弃在技术上行不通的分组方法不通的分组方法不通的分组方法不通的分组方法( ( ( (例如,组内不同处理的执行时间不相容例如,组内不同处理的执行时间不相容例如,组内不同处理的执行时间不相容例如,组内不同处理的执行时间不相容) ) ) ),余下的分组方法代表可能的实现策略,并且可以启示供,余下的分组方法代表可能的实现策略,并且可以启示供,余下的分组方法代表可能的实现策略,并且可以启示供,余下的分组方法代表可能的实现策略,并且可以启示供选择的物理系统。选择的物理系统。选择的物理系统。选择的物理系统。1. 设想供选择的方案应该从前一步得到的一系列供选择的方案中选取若干应该从前一步得到的一系列供选择的方案中选取若干个合理的方案,个合理的方案,通常至少选取低成本、中等成本和高成本通常至少选取低成本、中等成本和高成本的三种方案的三种方案。在判断哪些方案合理时应该考虑在问题定义。在判断哪些方案合理时应该考虑在问题定义和可行性研究阶段确定的工程规模和目标,有时可能还需和可行性研究阶段确定的工程规模和目标,有时可能还需要进一步征求用户的意见。要进一步征求用户的意见。对每个合理的方案分析员都应该准备下列对每个合理的方案分析员都应该准备下列4 4份资料:份资料:(1) (1) 系统流程图;系统流程图;(2) (2) 组成系统的物理元素清单;组成系统的物理元素清单;(3) (3) 成本成本/ /效益分析;效益分析;(4) (4) 实现这个系统的进度计划。实现这个系统的进度计划。2. 选取合理的方案分析员应该综合分析对比各种合理方案的利弊,推荐一分析员应该综合分析对比各种合理方案的利弊,推荐一个最佳的方案,并且为推荐的方案制定详细的实现计划。制个最佳的方案,并且为推荐的方案制定详细的实现计划。制定详细实现计划的关键技术是本书第定详细实现计划的关键技术是本书第1313章中将要介绍的工程章中将要介绍的工程网络。网络。用户和有关的技术专家应该认真审查分析员所推荐的最用户和有关的技术专家应该认真审查分析员所推荐的最佳系统,如果该系统确实符合用户的需要,并且是在现有条佳系统,如果该系统确实符合用户的需要,并且是在现有条件下完全能够实现的,则应该提请使用部门负责人进一步审件下完全能够实现的,则应该提请使用部门负责人进一步审批。在使用部门的负责人也接受了分析员所推荐的方案之后,批。在使用部门的负责人也接受了分析员所推荐的方案之后,将进入总体设计过程的下一个重要阶段将进入总体设计过程的下一个重要阶段结构设计。结构设计。3. 推荐最佳方案为了最终实现目标系统,必须设计出组成这个系统的所有为了最终实现目标系统,必须设计出组成这个系统的所有程序和文件程序和文件( (或数据库或数据库) )。对程序。对程序( (特别是复杂的大型程序特别是复杂的大型程序) )的设的设计,通常分为两个阶段完成:计,通常分为两个阶段完成:首先进行结构设计,然后进行过首先进行结构设计,然后进行过程设计程设计。结构设计确定程序由哪些模块组成,以及这些模块之。结构设计确定程序由哪些模块组成,以及这些模块之间的关系;过程设计确定每个模块的处理过程。结构设计是总间的关系;过程设计确定每个模块的处理过程。结构设计是总体设计阶段的任务,过程设计是详细设计阶段的任务。体设计阶段的任务,过程设计是详细设计阶段的任务。为确定软件结构,首先需要从实现角度把复杂的功能进一为确定软件结构,首先需要从实现角度把复杂的功能进一步分解。步分解。分析员结合算法描述仔细分析数据流图中的每个处理,分析员结合算法描述仔细分析数据流图中的每个处理,如果一个处理的功能过分复杂,必须把它的功能适当地分解成如果一个处理的功能过分复杂,必须把它的功能适当地分解成一系列比较简单的功能。一般说来,经过分解之后应该使每个一系列比较简单的功能。一般说来,经过分解之后应该使每个功能对大多数程序员而言都是明显易懂的。功能分解导致数据功能对大多数程序员而言都是明显易懂的。功能分解导致数据流图的进一步细化,同时还应该用流图的进一步细化,同时还应该用IPOIPO图或其他适当的工具简要图或其他适当的工具简要描述细化后每个处理的算法。描述细化后每个处理的算法。4. 功能分解通常程序中的一个模块完成一个适当的子功能。通常程序中的一个模块完成一个适当的子功能。应该把模块组织成良好的层次系统,顶层模块调用应该把模块组织成良好的层次系统,顶层模块调用它的下层模块以实现程序的完整功能,每个下层模它的下层模块以实现程序的完整功能,每个下层模块再调用更下层的模块,从而完成程序的一个子功块再调用更下层的模块,从而完成程序的一个子功能,最下层的模块完成最具体的功能能,最下层的模块完成最具体的功能。软件结构。软件结构( (即即由模块组成的层次系统由模块组成的层次系统) )可以用层次图或结构图来描可以用层次图或结构图来描绘,第节将介绍这些图形工具。绘,第节将介绍这些图形工具。如果数据流图已经细化到适当的层次,则可以如果数据流图已经细化到适当的层次,则可以直接从数据流图映射出软件结构,这就是第节中将直接从数据流图映射出软件结构,这就是第节中将要讲述的面向数据流的设计方法。要讲述的面向数据流的设计方法。5. 设计软件结构对于需要使用数据库的那些应用系统,软件工程师应该对于需要使用数据库的那些应用系统,软件工程师应该在需求分析阶段所确定的系统数据需求的基础上,进一步设在需求分析阶段所确定的系统数据需求的基础上,进一步设计数据库。计数据库。在数据库课中已经详细讲述了设计数据库的方法,本书在数据库课中已经详细讲述了设计数据库的方法,本书不再赘述。不再赘述。6. 设计数据库在软件开发的早期阶段考虑测试问题,能促使软在软件开发的早期阶段考虑测试问题,能促使软件设计人员在设计时注意提高软件的可测试性。本书件设计人员在设计时注意提高软件的可测试性。本书第第7 7章将仔细讨论软件测试的目的和设计测试方案的章将仔细讨论软件测试的目的和设计测试方案的各种技术方法。各种技术方法。7. 制定测试计划应该用正式的文档记录总体设计的结果,在这个阶段应该应该用正式的文档记录总体设计的结果,在这个阶段应该完成的文档通常有下述几种:完成的文档通常有下述几种:(1) (1) 系统说明系统说明主要内容包括用系统流程图描绘的系统构成方案,主要内容包括用系统流程图描绘的系统构成方案,组成系统的物理元素清单,成本组成系统的物理元素清单,成本/ /效益分析;对最佳方案的概效益分析;对最佳方案的概括描述,精化的数据流图,用层次图或结构图描绘的软件结构,括描述,精化的数据流图,用层次图或结构图描绘的软件结构,用用IPOIPO图或其他工具图或其他工具( (例如,例如,PDLPDL语言语言) )简要描述的各个模块的算简要描述的各个模块的算法,模块间的接口关系,以及需求、功能和模块三者之间的交法,模块间的接口关系,以及需求、功能和模块三者之间的交叉参照关系等等。叉参照关系等等。(2) (2) 用户手册用户手册根据总体设计阶段的结果,修改更正在需求分析根据总体设计阶段的结果,修改更正在需求分析阶段产生的初步的用户手册。阶段产生的初步的用户手册。(3) (3) 测试计划测试计划包括测试策略,测试方案,预期的测试结果,测包括测试策略,测试方案,预期的测试结果,测试进度计划等等。试进度计划等等。(4) (4) 详细的实现计划详细的实现计划(5) (5) 数据库设计结果数据库设计结果8. 书写文档最后应该对总体设计的结果进行严格的技术审查,最后应该对总体设计的结果进行严格的技术审查,在技术审查通过之后再由使用部门的负责人从管理角度在技术审查通过之后再由使用部门的负责人从管理角度进行复审。进行复审。9. 审查和复审5.2 设计原理模块可以是过程、函数、子程序和宏、对象内的方法。模块可以是过程、函数、子程序和宏、对象内的方法。模块可以是过程、函数、子程序和宏、对象内的方法。模块可以是过程、函数、子程序和宏、对象内的方法。 5.2.1 5.2.1 模块化模块化C(P1)C(P2)C(P1)C(P2)C(P1)C(P2)C(P1)C(P2)显然显然显然显然E(P1)E(P2)E(P1)E(P2)E(P1)E(P2)E(P1)E(P2)而且而且而且而且C(P1+P2)C(P1)+C(P2)C(P1+P2)C(P1)+C(P2)C(P1+P2)C(P1)+C(P2)C(P1+P2)C(P1)+C(P2)故故故故E(P1+P2)E(P1)+E(P2)E(P1+P2)E(P1)+E(P2)E(P1+P2)E(P1)+E(P2)E(P1+P2)E(P1)+E(P2)其中,其中,其中,其中,C(x)C(x)C(x)C(x)问题问题问题问题x x x x的复杂程度;的复杂程度;的复杂程度;的复杂程度;模块化和软件成本模块化和软件成本模块化和软件成本模块化和软件成本当模块数目增加时每个模块的规模将减当模块数目增加时每个模块的规模将减当模块数目增加时每个模块的规模将减当模块数目增加时每个模块的规模将减小,开发单个模块需要的成本小,开发单个模块需要的成本小,开发单个模块需要的成本小,开发单个模块需要的成本( ( ( (工作量工作量工作量工作量) ) ) )确实减少了确实减少了确实减少了确实减少了; ; ; ;但是随着模块数目增加,设但是随着模块数目增加,设但是随着模块数目增加,设但是随着模块数目增加,设计模块间接口所需要的工作量也将增加。计模块间接口所需要的工作量也将增加。计模块间接口所需要的工作量也将增加。计模块间接口所需要的工作量也将增加。 虽然目前还不能精确地决定虽然目前还不能精确地决定虽然目前还不能精确地决定虽然目前还不能精确地决定M M M M的数值,但是在考的数值,但是在考的数值,但是在考的数值,但是在考虑模块化的时候总成本曲线确实是有用的指南。虑模块化的时候总成本曲线确实是有用的指南。虑模块化的时候总成本曲线确实是有用的指南。虑模块化的时候总成本曲线确实是有用的指南。采用模块化原理可以使软件结构清晰,不仅容易采用模块化原理可以使软件结构清晰,不仅容易采用模块化原理可以使软件结构清晰,不仅容易采用模块化原理可以使软件结构清晰,不仅容易设计也容易阅读和理解。因为程序错误通常局限在有设计也容易阅读和理解。因为程序错误通常局限在有设计也容易阅读和理解。因为程序错误通常局限在有设计也容易阅读和理解。因为程序错误通常局限在有关的模块及它们之间的接口中,所以模块化使软件容关的模块及它们之间的接口中,所以模块化使软件容关的模块及它们之间的接口中,所以模块化使软件容关的模块及它们之间的接口中,所以模块化使软件容易测试和调试,因而有助于提高软件的可靠性。因为易测试和调试,因而有助于提高软件的可靠性。因为易测试和调试,因而有助于提高软件的可靠性。因为易测试和调试,因而有助于提高软件的可靠性。因为变动往往只涉及少数几个模块,所以模块化能够提高变动往往只涉及少数几个模块,所以模块化能够提高变动往往只涉及少数几个模块,所以模块化能够提高变动往往只涉及少数几个模块,所以模块化能够提高软件的可修改性。模块化也有助于软件开发工程的组软件的可修改性。模块化也有助于软件开发工程的组软件的可修改性。模块化也有助于软件开发工程的组软件的可修改性。模块化也有助于软件开发工程的组织管理,一个复杂的大型程序可以由许多程序员分工织管理,一个复杂的大型程序可以由许多程序员分工织管理,一个复杂的大型程序可以由许多程序员分工织管理,一个复杂的大型程序可以由许多程序员分工编写不同的模块,并且可以进一步分配技术熟练的程编写不同的模块,并且可以进一步分配技术熟练的程编写不同的模块,并且可以进一步分配技术熟练的程编写不同的模块,并且可以进一步分配技术熟练的程序员编写困难的模块。序员编写困难的模块。序员编写困难的模块。序员编写困难的模块。5.2.2 抽象 抽象就是抽出事物的本质特性而暂时不考虑它抽象就是抽出事物的本质特性而暂时不考虑它们的细节。们的细节。 软件工程过程的每一步都是对软件解法的抽象层次软件工程过程的每一步都是对软件解法的抽象层次的一次精化。在可行性研究阶段,软件作为系统的一个的一次精化。在可行性研究阶段,软件作为系统的一个完整部件;在需求分析期间,软件解法是使用在问题环完整部件;在需求分析期间,软件解法是使用在问题环境内熟悉的方式描述的;当由总体设计向详细设计过渡境内熟悉的方式描述的;当由总体设计向详细设计过渡时,抽象的程度也就随之减少了;最后,当源程序写出时,抽象的程度也就随之减少了;最后,当源程序写出来以后,也就达到了抽象的最低层。来以后,也就达到了抽象的最低层。5.2.3 逐步求精逐步求精:逐步求精:为了能集中精力解决主要问题而尽量推为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。迟对问题细节的考虑。人类的认知过程遵守人类的认知过程遵守MillerMiller法则:一个人在任法则:一个人在任何时候都只能把注意力集中在(何时候都只能把注意力集中在(7272)个知识块上。)个知识块上。逐步求精方法的强大作用就在于,它能帮助软逐步求精方法的强大作用就在于,它能帮助软件工程师把精力集中在与当前开发阶段最相关的那件工程师把精力集中在与当前开发阶段最相关的那些方面上,而忽略那些对整体解决方案来说虽然是些方面上,而忽略那些对整体解决方案来说虽然是必要的,然而目前还不需要考虑的细节,这些细节必要的,然而目前还不需要考虑的细节,这些细节将留到以后再考虑。将留到以后再考虑。5.2.4 信息隐藏和局部化 信息隐藏原理指出:应该这样设计和确定模块,信息隐藏原理指出:应该这样设计和确定模块,信息隐藏原理指出:应该这样设计和确定模块,信息隐藏原理指出:应该这样设计和确定模块,使得一个模块内包含的信息使得一个模块内包含的信息使得一个模块内包含的信息使得一个模块内包含的信息( ( ( (过程和数据过程和数据过程和数据过程和数据) ) ) )对于不需对于不需对于不需对于不需要这些信息的模块来说,是不能访问的。要这些信息的模块来说,是不能访问的。要这些信息的模块来说,是不能访问的。要这些信息的模块来说,是不能访问的。 局部化是指把一些关系密切的软件元素物理地局部化是指把一些关系密切的软件元素物理地局部化是指把一些关系密切的软件元素物理地局部化是指把一些关系密切的软件元素物理地放得彼此靠近。放得彼此靠近。放得彼此靠近。放得彼此靠近。5.2.5 模块独立模块独立化有如下优点:模块独立化有如下优点:1.1.有效的模块化有效的模块化( (即具有独立的模块即具有独立的模块) )的软件比较容易开发出的软件比较容易开发出来。来。2.2.独立的模块比较容易测试和维护。独立的模块比较容易测试和维护。模块的独立程度可以由内聚和耦合两个定性标准度量模块的独立程度可以由内聚和耦合两个定性标准度量: :耦合耦合衡量不同模块彼此间互相依赖衡量不同模块彼此间互相依赖( (连接连接) )的紧密程度;的紧密程度;内聚内聚衡量一个模块内部各个元素彼此结合的紧密程度。衡量一个模块内部各个元素彼此结合的紧密程度。耦合是对一个软件结构内不同模块之间互连程度的度量。耦合耦合是对一个软件结构内不同模块之间互连程度的度量。耦合耦合是对一个软件结构内不同模块之间互连程度的度量。耦合耦合是对一个软件结构内不同模块之间互连程度的度量。耦合强弱取决于模块间接口的复杂程度,进入或访问一个模块的点,强弱取决于模块间接口的复杂程度,进入或访问一个模块的点,强弱取决于模块间接口的复杂程度,进入或访问一个模块的点,强弱取决于模块间接口的复杂程度,进入或访问一个模块的点,以及通过接口的数据。以及通过接口的数据。以及通过接口的数据。以及通过接口的数据。在软件设计中应该追求尽可能在软件设计中应该追求尽可能在软件设计中应该追求尽可能在软件设计中应该追求尽可能松散耦合松散耦合松散耦合松散耦合的系统。的系统。的系统。的系统。模块间的耦合程度强烈影响系统的可理解性、可测试性、可靠模块间的耦合程度强烈影响系统的可理解性、可测试性、可靠模块间的耦合程度强烈影响系统的可理解性、可测试性、可靠模块间的耦合程度强烈影响系统的可理解性、可测试性、可靠性和可维护性。性和可维护性。性和可维护性。性和可维护性。如果两个模块中的每一个都能独立地工作而不需要另一个模块如果两个模块中的每一个都能独立地工作而不需要另一个模块如果两个模块中的每一个都能独立地工作而不需要另一个模块如果两个模块中的每一个都能独立地工作而不需要另一个模块的存在,那么它们彼此完全独立,这意味着模块间无任何连接,的存在,那么它们彼此完全独立,这意味着模块间无任何连接,的存在,那么它们彼此完全独立,这意味着模块间无任何连接,的存在,那么它们彼此完全独立,这意味着模块间无任何连接,耦合程度最低。但是,在一个软件系统中不可能所有模块之间都耦合程度最低。但是,在一个软件系统中不可能所有模块之间都耦合程度最低。但是,在一个软件系统中不可能所有模块之间都耦合程度最低。但是,在一个软件系统中不可能所有模块之间都没有任何连接。没有任何连接。没有任何连接。没有任何连接。1. 耦合数据耦合:数据耦合:数据耦合:数据耦合:如果两个模块彼此间通过参数交换信息,而且交如果两个模块彼此间通过参数交换信息,而且交如果两个模块彼此间通过参数交换信息,而且交如果两个模块彼此间通过参数交换信息,而且交换的信息仅仅是数据,那么这种耦合称为数据耦合。换的信息仅仅是数据,那么这种耦合称为数据耦合。换的信息仅仅是数据,那么这种耦合称为数据耦合。换的信息仅仅是数据,那么这种耦合称为数据耦合。控制耦合:控制耦合:控制耦合:控制耦合:如果传递的信息中有控制信息如果传递的信息中有控制信息如果传递的信息中有控制信息如果传递的信息中有控制信息( ( ( (尽管有时这种控尽管有时这种控尽管有时这种控尽管有时这种控制信息以数据的形式出现制信息以数据的形式出现制信息以数据的形式出现制信息以数据的形式出现) ) ) ),则这种耦合称为控制耦合。,则这种耦合称为控制耦合。,则这种耦合称为控制耦合。,则这种耦合称为控制耦合。特征耦合:特征耦合:特征耦合:特征耦合:当把整个数据结构作为参数传递而被调用的模块当把整个数据结构作为参数传递而被调用的模块当把整个数据结构作为参数传递而被调用的模块当把整个数据结构作为参数传递而被调用的模块只需要使用其中一部分数据元素时,就出现了特征耦合。只需要使用其中一部分数据元素时,就出现了特征耦合。只需要使用其中一部分数据元素时,就出现了特征耦合。只需要使用其中一部分数据元素时,就出现了特征耦合。公共环境耦合:公共环境耦合:公共环境耦合:公共环境耦合:当两个或多个模块通过一个公共数据环境相当两个或多个模块通过一个公共数据环境相当两个或多个模块通过一个公共数据环境相当两个或多个模块通过一个公共数据环境相互作用时,它们之间的耦合称为公共环境耦合。互作用时,它们之间的耦合称为公共环境耦合。互作用时,它们之间的耦合称为公共环境耦合。互作用时,它们之间的耦合称为公共环境耦合。内容耦合:内容耦合:内容耦合:内容耦合:如果出现下列情况之一,两个模块间就发生了内容如果出现下列情况之一,两个模块间就发生了内容如果出现下列情况之一,两个模块间就发生了内容如果出现下列情况之一,两个模块间就发生了内容耦合:耦合:耦合:耦合:一个模块访问另一个模块的内部数据;一个模块访问另一个模块的内部数据;一个模块访问另一个模块的内部数据;一个模块访问另一个模块的内部数据;一个模块不通过正常入口而转到另一个模块的内部;一个模块不通过正常入口而转到另一个模块的内部;一个模块不通过正常入口而转到另一个模块的内部;一个模块不通过正常入口而转到另一个模块的内部;两个模块有一部分程序代码重叠两个模块有一部分程序代码重叠两个模块有一部分程序代码重叠两个模块有一部分程序代码重叠( ( ( (只可能出现在汇编程序中只可能出现在汇编程序中只可能出现在汇编程序中只可能出现在汇编程序中) ) ) );一个模块有多个入口一个模块有多个入口一个模块有多个入口一个模块有多个入口( ( ( (这意味着一个模块有几种功能这意味着一个模块有几种功能这意味着一个模块有几种功能这意味着一个模块有几种功能) ) ) )。总之,耦合是影响软件复杂程度的一个重要因素。应该采取下总之,耦合是影响软件复杂程度的一个重要因素。应该采取下总之,耦合是影响软件复杂程度的一个重要因素。应该采取下总之,耦合是影响软件复杂程度的一个重要因素。应该采取下述设计原则:述设计原则:述设计原则:述设计原则:尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合。耦合的范围,完全不用内容耦合。耦合的范围,完全不用内容耦合。耦合的范围,完全不用内容耦合。内聚标志一个模块内各个元素彼此结合的紧密内聚标志一个模块内各个元素彼此结合的紧密程度,简单地说,理想内聚的模块只做一件事情。程度,简单地说,理想内聚的模块只做一件事情。设计时应该力求做到高内聚,内聚和耦合是密切相设计时应该力求做到高内聚,内聚和耦合是密切相关,模块内的高内聚往往意味着模块间的松耦合。关,模块内的高内聚往往意味着模块间的松耦合。2. 内聚低内聚有如下几类:低内聚有如下几类:低内聚有如下几类:低内聚有如下几类:偶然内聚:偶然内聚:偶然内聚:偶然内聚:如果一个模块完成一组任务,这些任务彼如果一个模块完成一组任务,这些任务彼如果一个模块完成一组任务,这些任务彼如果一个模块完成一组任务,这些任务彼此间即使有关系,关系也是很松散的,就叫做偶然内此间即使有关系,关系也是很松散的,就叫做偶然内此间即使有关系,关系也是很松散的,就叫做偶然内此间即使有关系,关系也是很松散的,就叫做偶然内聚。聚。聚。聚。逻辑内聚:逻辑内聚:逻辑内聚:逻辑内聚:如果一个模块完成的任务在逻辑上属于相如果一个模块完成的任务在逻辑上属于相如果一个模块完成的任务在逻辑上属于相如果一个模块完成的任务在逻辑上属于相同或相似的一类,则称为逻辑内聚。同或相似的一类,则称为逻辑内聚。同或相似的一类,则称为逻辑内聚。同或相似的一类,则称为逻辑内聚。时间内聚:时间内聚:时间内聚:时间内聚:如果一个模块包含的任务必须在同一段时如果一个模块包含的任务必须在同一段时如果一个模块包含的任务必须在同一段时如果一个模块包含的任务必须在同一段时间内执行,就叫时间内聚。间内执行,就叫时间内聚。间内执行,就叫时间内聚。间内执行,就叫时间内聚。中内聚主要有两类:中内聚主要有两类:中内聚主要有两类:中内聚主要有两类:过程内聚:过程内聚:过程内聚:过程内聚:如果一个模块内的处理元素是相关的,如果一个模块内的处理元素是相关的,如果一个模块内的处理元素是相关的,如果一个模块内的处理元素是相关的,而且必须以特定次序执行,则称为过程内聚。而且必须以特定次序执行,则称为过程内聚。而且必须以特定次序执行,则称为过程内聚。而且必须以特定次序执行,则称为过程内聚。( ( ( (使用程序流程图作为工具设计软件时,常常通过使用程序流程图作为工具设计软件时,常常通过使用程序流程图作为工具设计软件时,常常通过使用程序流程图作为工具设计软件时,常常通过研究流程图确定模块的划分,这样得到的往往是过研究流程图确定模块的划分,这样得到的往往是过研究流程图确定模块的划分,这样得到的往往是过研究流程图确定模块的划分,这样得到的往往是过程内聚的模块程内聚的模块程内聚的模块程内聚的模块) ) ) )通信内聚:通信内聚:通信内聚:通信内聚:如果模块中所有元素都使用同一个输入如果模块中所有元素都使用同一个输入如果模块中所有元素都使用同一个输入如果模块中所有元素都使用同一个输入数据和数据和数据和数据和( ( ( (或或或或) ) ) )产生同一个输出数据,则称为通信内聚。产生同一个输出数据,则称为通信内聚。产生同一个输出数据,则称为通信内聚。产生同一个输出数据,则称为通信内聚。高内聚也有两类:高内聚也有两类:高内聚也有两类:高内聚也有两类:顺序内聚:顺序内聚:顺序内聚:顺序内聚:如果一个模块内的处理元素和同一个功如果一个模块内的处理元素和同一个功如果一个模块内的处理元素和同一个功如果一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行能密切相关,而且这些处理必须顺序执行能密切相关,而且这些处理必须顺序执行能密切相关,而且这些处理必须顺序执行( ( ( (通常一个通常一个通常一个通常一个处理元素的输出数据作为下一个处理元素的输入数处理元素的输出数据作为下一个处理元素的输入数处理元素的输出数据作为下一个处理元素的输入数处理元素的输出数据作为下一个处理元素的输入数据据据据) ) ) ),则称为顺序内聚。,则称为顺序内聚。,则称为顺序内聚。,则称为顺序内聚。功能内聚:功能内聚:功能内聚:功能内聚:根据数据流图划分模块时,通常得到顺根据数据流图划分模块时,通常得到顺根据数据流图划分模块时,通常得到顺根据数据流图划分模块时,通常得到顺序内聚的模块,这种模块彼此间的连接往往比较简序内聚的模块,这种模块彼此间的连接往往比较简序内聚的模块,这种模块彼此间的连接往往比较简序内聚的模块,这种模块彼此间的连接往往比较简单。如果模块内所有处理元素属于一个整体,完成单。如果模块内所有处理元素属于一个整体,完成单。如果模块内所有处理元素属于一个整体,完成单。如果模块内所有处理元素属于一个整体,完成一个单一的功能,则称为功能内聚。功能内聚是最一个单一的功能,则称为功能内聚。功能内聚是最一个单一的功能,则称为功能内聚。功能内聚是最一个单一的功能,则称为功能内聚。功能内聚是最高程度的内聚。高程度的内聚。高程度的内聚。高程度的内聚。耦合和内聚的概念是耦合和内聚的概念是耦合和内聚的概念是耦合和内聚的概念是Constantine,Yourdon,MyersConstantine,Yourdon,MyersConstantine,Yourdon,MyersConstantine,Yourdon,Myers和和和和StevensStevensStevensStevens等人提出来的。按照他们的观点,如果给上述七等人提出来的。按照他们的观点,如果给上述七等人提出来的。按照他们的观点,如果给上述七等人提出来的。按照他们的观点,如果给上述七种内聚的优劣评分,将得到如下结果:种内聚的优劣评分,将得到如下结果:种内聚的优劣评分,将得到如下结果:种内聚的优劣评分,将得到如下结果:功能内聚功能内聚功能内聚功能内聚10101010分分分分时间内聚时间内聚时间内聚时间内聚3 3 3 3分分分分顺序内聚顺序内聚顺序内聚顺序内聚9 9 9 9分分分分逻辑内聚逻辑内聚逻辑内聚逻辑内聚1 1 1 1分分分分通信内聚通信内聚通信内聚通信内聚7 7 7 7分分分分偶然内聚偶然内聚偶然内聚偶然内聚0 0 0 0分分分分过程内聚过程内聚过程内聚过程内聚5 5 5 5分分分分事实上,没有必要精确确定内聚的级别。重要的是设计时事实上,没有必要精确确定内聚的级别。重要的是设计时事实上,没有必要精确确定内聚的级别。重要的是设计时事实上,没有必要精确确定内聚的级别。重要的是设计时力争做到高内聚,并且能够辨认出低内聚的模块,有能力力争做到高内聚,并且能够辨认出低内聚的模块,有能力力争做到高内聚,并且能够辨认出低内聚的模块,有能力力争做到高内聚,并且能够辨认出低内聚的模块,有能力通过修改设计提高模块的内聚程度降低模块间的耦合程度,通过修改设计提高模块的内聚程度降低模块间的耦合程度,通过修改设计提高模块的内聚程度降低模块间的耦合程度,通过修改设计提高模块的内聚程度降低模块间的耦合程度,从而获得较高的模块独立性。从而获得较高的模块独立性。从而获得较高的模块独立性。从而获得较高的模块独立性。5.3 启发规则1. 1. 1. 1. 改进软件结构提高模块独立性改进软件结构提高模块独立性改进软件结构提高模块独立性改进软件结构提高模块独立性2. 2. 2. 2. 模块规模应该适中模块规模应该适中模块规模应该适中模块规模应该适中3. 3. 3. 3. 深度、宽度、扇出和扇入都应适当深度、宽度、扇出和扇入都应适当深度、宽度、扇出和扇入都应适当深度、宽度、扇出和扇入都应适当4. 4. 4. 4. 模块的作用域应该在控制域之内模块的作用域应该在控制域之内模块的作用域应该在控制域之内模块的作用域应该在控制域之内5. 5. 5. 5. 力争降低模块接口的复杂程度力争降低模块接口的复杂程度力争降低模块接口的复杂程度力争降低模块接口的复杂程度6. 6. 6. 6. 设计单入口单出口的模块设计单入口单出口的模块设计单入口单出口的模块设计单入口单出口的模块7. 7. 7. 7. 模块功能应该可以预测模块功能应该可以预测模块功能应该可以预测模块功能应该可以预测设计出软件的初步结构以后,应该审查分设计出软件的初步结构以后,应该审查分设计出软件的初步结构以后,应该审查分设计出软件的初步结构以后,应该审查分析这个结构,通过析这个结构,通过析这个结构,通过析这个结构,通过模块分解或合并,力求降低模块分解或合并,力求降低模块分解或合并,力求降低模块分解或合并,力求降低耦合提高内聚耦合提高内聚耦合提高内聚耦合提高内聚。例如,多个模块公有的一个子。例如,多个模块公有的一个子。例如,多个模块公有的一个子。例如,多个模块公有的一个子功能可以独立成一个模块,由这些模块调用;功能可以独立成一个模块,由这些模块调用;功能可以独立成一个模块,由这些模块调用;功能可以独立成一个模块,由这些模块调用;有时可以通过分解或合并模块以减少控制信息有时可以通过分解或合并模块以减少控制信息有时可以通过分解或合并模块以减少控制信息有时可以通过分解或合并模块以减少控制信息的传递及对全程数据的引用,并且降低接口的的传递及对全程数据的引用,并且降低接口的的传递及对全程数据的引用,并且降低接口的的传递及对全程数据的引用,并且降低接口的复杂程度。复杂程度。复杂程度。复杂程度。1. 改进软件结构提高模块独立性经验表明,一个模块的规模不应过大,最好能写在一页纸内经验表明,一个模块的规模不应过大,最好能写在一页纸内经验表明,一个模块的规模不应过大,最好能写在一页纸内经验表明,一个模块的规模不应过大,最好能写在一页纸内( ( ( (通通通通常不超过常不超过常不超过常不超过60606060行语句行语句行语句行语句) ) ) )。有人从心理学角度研究得知,当一个模块。有人从心理学角度研究得知,当一个模块。有人从心理学角度研究得知,当一个模块。有人从心理学角度研究得知,当一个模块包含的语句数超过包含的语句数超过包含的语句数超过包含的语句数超过30303030以后,模块的可理解程度迅速下降。以后,模块的可理解程度迅速下降。以后,模块的可理解程度迅速下降。以后,模块的可理解程度迅速下降。过大的模块往往是由于分解不充分,但是进一步分解必须符合问过大的模块往往是由于分解不充分,但是进一步分解必须符合问过大的模块往往是由于分解不充分,但是进一步分解必须符合问过大的模块往往是由于分解不充分,但是进一步分解必须符合问题结构,一般说来,分解后不应该降低模块独立性。题结构,一般说来,分解后不应该降低模块独立性。题结构,一般说来,分解后不应该降低模块独立性。题结构,一般说来,分解后不应该降低模块独立性。过小的模块开销大于有效操作,而且模块数目过多将使系统接口过小的模块开销大于有效操作,而且模块数目过多将使系统接口过小的模块开销大于有效操作,而且模块数目过多将使系统接口过小的模块开销大于有效操作,而且模块数目过多将使系统接口复杂。因此过小的模块有时不值得单独存在,特别是只有一个模复杂。因此过小的模块有时不值得单独存在,特别是只有一个模复杂。因此过小的模块有时不值得单独存在,特别是只有一个模复杂。因此过小的模块有时不值得单独存在,特别是只有一个模块调用它时,通常可以把它合并到上级模块中去而不必单独存在。块调用它时,通常可以把它合并到上级模块中去而不必单独存在。块调用它时,通常可以把它合并到上级模块中去而不必单独存在。块调用它时,通常可以把它合并到上级模块中去而不必单独存在。2. 模块规模应该适中模块过大:可理解程度下降模块过大:可理解程度下降模块过大:可理解程度下降模块过大:可理解程度下降模块过小:开销大于有效操作、接口复杂模块过小:开销大于有效操作、接口复杂模块过小:开销大于有效操作、接口复杂模块过小:开销大于有效操作、接口复杂深度深度深度深度表示软件结构中控制的层数。表示软件结构中控制的层数。表示软件结构中控制的层数。表示软件结构中控制的层数。宽度宽度宽度宽度是软件结构内同一个层次上的模块总数的最大是软件结构内同一个层次上的模块总数的最大是软件结构内同一个层次上的模块总数的最大是软件结构内同一个层次上的模块总数的最大值。值。值。值。扇出扇出扇出扇出是一个模块直接控制是一个模块直接控制是一个模块直接控制是一个模块直接控制( ( ( (调用调用调用调用) ) ) )的模块数目。的模块数目。的模块数目。的模块数目。扇出扇出扇出扇出太大,应增加中间层次的控制模块;扇出小时,把太大,应增加中间层次的控制模块;扇出小时,把太大,应增加中间层次的控制模块;扇出小时,把太大,应增加中间层次的控制模块;扇出小时,把下级模块进一步分解成若干个子功能模块或合并到下级模块进一步分解成若干个子功能模块或合并到下级模块进一步分解成若干个子功能模块或合并到下级模块进一步分解成若干个子功能模块或合并到它的上级模块中去。它的上级模块中去。它的上级模块中去。它的上级模块中去。扇入扇入扇入扇入是表明有多少个上级模块直接调用它。是表明有多少个上级模块直接调用它。是表明有多少个上级模块直接调用它。是表明有多少个上级模块直接调用它。3. 深度、宽度、扇出和扇入都应适当设计得很好的软件结构通常顶层扇出比较高,中层扇出较设计得很好的软件结构通常顶层扇出比较高,中层扇出较设计得很好的软件结构通常顶层扇出比较高,中层扇出较设计得很好的软件结构通常顶层扇出比较高,中层扇出较少,底层扇入到公共的实用模块中去少,底层扇入到公共的实用模块中去少,底层扇入到公共的实用模块中去少,底层扇入到公共的实用模块中去( ( ( (底层模块有高扇入底层模块有高扇入底层模块有高扇入底层模块有高扇入) ) ) )。(1)(1)(1)(1)深度和程序长度之间应该有粗略的对应关系,当深度和程序长度之间应该有粗略的对应关系,当深度和程序长度之间应该有粗略的对应关系,当深度和程序长度之间应该有粗略的对应关系,当然这个对应关系是在一定范围内变化的。如果层数然这个对应关系是在一定范围内变化的。如果层数然这个对应关系是在一定范围内变化的。如果层数然这个对应关系是在一定范围内变化的。如果层数过多则应该考虑是否有许多管理模块过分简单了,过多则应该考虑是否有许多管理模块过分简单了,过多则应该考虑是否有许多管理模块过分简单了,过多则应该考虑是否有许多管理模块过分简单了,能否适当合并。能否适当合并。能否适当合并。能否适当合并。(2)(2)(2)(2)一般说来,宽度越大系统越复杂。对宽度影响最一般说来,宽度越大系统越复杂。对宽度影响最一般说来,宽度越大系统越复杂。对宽度影响最一般说来,宽度越大系统越复杂。对宽度影响最大的因素是模块的扇出。大的因素是模块的扇出。大的因素是模块的扇出。大的因素是模块的扇出。(3) (3) (3) (3) 一个设计得好的典型系统的平均扇出通常是一个设计得好的典型系统的平均扇出通常是一个设计得好的典型系统的平均扇出通常是一个设计得好的典型系统的平均扇出通常是3 3 3 3或或或或4(4(4(4(扇出的上限通常是扇出的上限通常是扇出的上限通常是扇出的上限通常是5 5 5 59)9)9)9)。(4)(4)(4)(4)扇入越大则共享该模块的上级模块数目越多,这扇入越大则共享该模块的上级模块数目越多,这扇入越大则共享该模块的上级模块数目越多,这扇入越大则共享该模块的上级模块数目越多,这是有好处的,但是,不能违背模块独立原理单纯追是有好处的,但是,不能违背模块独立原理单纯追是有好处的,但是,不能违背模块独立原理单纯追是有好处的,但是,不能违背模块独立原理单纯追求高扇入。求高扇入。求高扇入。求高扇入。高扇出的模块结构举例:编外编外人员人员工资工资取得取得工资工资数据数据 计时计时制工制工资额资额薪金薪金制工制工资额资额编外编外人员人员税款税款编外编外人员人员扣款扣款常规常规扣款扣款税收税收扣款扣款计算实发工资计算实发工资避免平铺结构编外编外人员人员工资工资取得工取得工资数据资数据 计时计时制工制工资额资额薪金薪金制工制工资额资额编外编外人员人员税款税款编外编外人员人员扣款扣款常规常规扣款扣款税收税收扣款扣款计算实发工资计算实发工资计时工人计时工人实发工资实发工资计薪工人计薪工人实发工资实发工资编外人员编外人员实发工资实发工资增加中间层降低扇出增加中间层降低扇出模块的作用域定义为受该模块内一个判模块的作用域定义为受该模块内一个判模块的作用域定义为受该模块内一个判模块的作用域定义为受该模块内一个判定影响的所有模块的集合。模块的控制定影响的所有模块的集合。模块的控制定影响的所有模块的集合。模块的控制定影响的所有模块的集合。模块的控制域是这个模块本身以及所有直接或间接域是这个模块本身以及所有直接或间接域是这个模块本身以及所有直接或间接域是这个模块本身以及所有直接或间接从属于它的模块的集合。从属于它的模块的集合。从属于它的模块的集合。从属于它的模块的集合。模块模块模块模块C C C C的控制范围的控制范围的控制范围的控制范围: C: C: C: C、D D D D、E E E E、F F F F、G G G G、H,H,H,H,如果模块如果模块如果模块如果模块C C C C 作出的决策影响了模块作出的决策影响了模块作出的决策影响了模块作出的决策影响了模块L L L L,L L L L超出了超出了超出了超出了C C C C 的控制范围的控制范围的控制范围的控制范围. . . .(难于理解;会(难于理解;会(难于理解;会(难于理解;会出现控制耦合)出现控制耦合)出现控制耦合)出现控制耦合)1 1 1 1、把做决策的点、把做决策的点、把做决策的点、把做决策的点C C C C上移上移上移上移2 2 2 2、把、把、把、把L L L L移到移到移到移到C C C C的控制域中的控制域中的控制域中的控制域中在一个设计得很好的系统中,所有受判在一个设计得很好的系统中,所有受判在一个设计得很好的系统中,所有受判在一个设计得很好的系统中,所有受判定影响的模块应该都从属于做出判定的定影响的模块应该都从属于做出判定的定影响的模块应该都从属于做出判定的定影响的模块应该都从属于做出判定的那个模块,最好局限于做出判定的那个那个模块,最好局限于做出判定的那个那个模块,最好局限于做出判定的那个那个模块,最好局限于做出判定的那个模块本身及它的直属下级模块。模块本身及它的直属下级模块。模块本身及它的直属下级模块。模块本身及它的直属下级模块。4. 模块的作用域应该在控制域之内CHDEGXFAILJKB模块接口复杂是软件发生错误的一个主要原因。模块接口复杂是软件发生错误的一个主要原因。模块接口复杂是软件发生错误的一个主要原因。模块接口复杂是软件发生错误的一个主要原因。应该仔细设计模块接口,使得信息传递简单并且和应该仔细设计模块接口,使得信息传递简单并且和应该仔细设计模块接口,使得信息传递简单并且和应该仔细设计模块接口,使得信息传递简单并且和模块的功能一致。模块的功能一致。模块的功能一致。模块的功能一致。接口复杂或不一致接口复杂或不一致接口复杂或不一致接口复杂或不一致( ( ( (即看起来传递的数据之间即看起来传递的数据之间即看起来传递的数据之间即看起来传递的数据之间没有联系没有联系没有联系没有联系) ) ) ),是紧耦合或低内聚的征兆,是紧耦合或低内聚的征兆,是紧耦合或低内聚的征兆,是紧耦合或低内聚的征兆,应该重新,应该重新,应该重新,应该重新分析这个模块的独立性。分析这个模块的独立性。分析这个模块的独立性。分析这个模块的独立性。5. 力争降低模块接口的复杂程度这条启发式规则警告软件工程师这条启发式规则警告软件工程师这条启发式规则警告软件工程师这条启发式规则警告软件工程师不要使不要使不要使不要使模块间出现内容耦合模块间出现内容耦合模块间出现内容耦合模块间出现内容耦合。当从顶部进入模块并。当从顶部进入模块并。当从顶部进入模块并。当从顶部进入模块并且从底部退出来时,软件是比较容易理解的,且从底部退出来时,软件是比较容易理解的,且从底部退出来时,软件是比较容易理解的,且从底部退出来时,软件是比较容易理解的,因此也是比较容易维护的。因此也是比较容易维护的。因此也是比较容易维护的。因此也是比较容易维护的。6. 设计单入口单出口的模块模块的功能应该能够预测,但也要防止模块功模块的功能应该能够预测,但也要防止模块功模块的功能应该能够预测,但也要防止模块功模块的功能应该能够预测,但也要防止模块功能过分局限。能过分局限。能过分局限。能过分局限。如果一个模块可以当做一个黑盒子,也就是说,如果一个模块可以当做一个黑盒子,也就是说,如果一个模块可以当做一个黑盒子,也就是说,如果一个模块可以当做一个黑盒子,也就是说,只要输入的数据相同就产生同样的输出只要输入的数据相同就产生同样的输出只要输入的数据相同就产生同样的输出只要输入的数据相同就产生同样的输出,这个模块,这个模块,这个模块,这个模块的功能就是可以预测的。带有内部的功能就是可以预测的。带有内部的功能就是可以预测的。带有内部的功能就是可以预测的。带有内部“ “存储器存储器存储器存储器” ”的模的模的模的模块的功能可能是不可预测的,因为它的输出可能取块的功能可能是不可预测的,因为它的输出可能取块的功能可能是不可预测的,因为它的输出可能取块的功能可能是不可预测的,因为它的输出可能取决于内部存储器决于内部存储器决于内部存储器决于内部存储器( ( ( (例如某个标记例如某个标记例如某个标记例如某个标记) ) ) )的状态。由于内部的状态。由于内部的状态。由于内部的状态。由于内部存储器对于上级模块而言是不可见的,所以这样的存储器对于上级模块而言是不可见的,所以这样的存储器对于上级模块而言是不可见的,所以这样的存储器对于上级模块而言是不可见的,所以这样的模块既不易理解又难于测试和维护。模块既不易理解又难于测试和维护。模块既不易理解又难于测试和维护。模块既不易理解又难于测试和维护。7. 模块功能应该可以预测5.4 描绘软件结构的图形工具层次图层次图HIPO图(可追踪)IPO图来描述处理过程结构图循环循环循环循环调用调用调用调用条件条件条件条件调用调用调用调用模块的名字或主要功能调用关系传递的信息(数据流和控制流)5.5 面向数据流的设计方法(结构化设计 方法SD)面向数据流的设计方法的目标是给出设计软件面向数据流的设计方法的目标是给出设计软件面向数据流的设计方法的目标是给出设计软件面向数据流的设计方法的目标是给出设计软件结构的一个系统化的途径。结构的一个系统化的途径。结构的一个系统化的途径。结构的一个系统化的途径。面向数据流的设计方法定义了一些不同的面向数据流的设计方法定义了一些不同的面向数据流的设计方法定义了一些不同的面向数据流的设计方法定义了一些不同的“ “映映映映射射射射” ”,利用这些映射可以把数据流图变换成软件,利用这些映射可以把数据流图变换成软件,利用这些映射可以把数据流图变换成软件,利用这些映射可以把数据流图变换成软件结构。结构。结构。结构。因为任何软件系统都可以用数据流图表示,所因为任何软件系统都可以用数据流图表示,所因为任何软件系统都可以用数据流图表示,所因为任何软件系统都可以用数据流图表示,所以面向数据流的设计方法理论上可以设计任何软以面向数据流的设计方法理论上可以设计任何软以面向数据流的设计方法理论上可以设计任何软以面向数据流的设计方法理论上可以设计任何软件的结构。件的结构。件的结构。件的结构。5.5.1 概念结构化设计方法(结构化设计方法(结构化设计方法(结构化设计方法(SDSDSDSD)以数据流图为基础,它定义)以数据流图为基础,它定义)以数据流图为基础,它定义)以数据流图为基础,它定义了把了把了把了把DFDDFDDFDDFD变换成变换成变换成变换成软件结构软件结构软件结构软件结构的不同的不同的不同的不同映射映射映射映射方法。方法。方法。方法。数据流图可分为两种类型:数据流图可分为两种类型: 变换型数据流变换型数据流事务型数据流事务型数据流参看图,信息沿输入通路进入系统,同时由外部形式变换参看图,信息沿输入通路进入系统,同时由外部形式变换参看图,信息沿输入通路进入系统,同时由外部形式变换参看图,信息沿输入通路进入系统,同时由外部形式变换成内部形式,进入系统的信息通过变换中心,经加工处理成内部形式,进入系统的信息通过变换中心,经加工处理成内部形式,进入系统的信息通过变换中心,经加工处理成内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。当数据以后再沿输出通路变换成外部形式离开软件系统。当数据以后再沿输出通路变换成外部形式离开软件系统。当数据以后再沿输出通路变换成外部形式离开软件系统。当数据流图具有这些特征时,这种信息流就叫作变换流。流图具有这些特征时,这种信息流就叫作变换流。流图具有这些特征时,这种信息流就叫作变换流。流图具有这些特征时,这种信息流就叫作变换流。1. 变换流图图图图5.8 5.8 5.8 5.8 变换流变换流变换流变换流当数据流图具有和图类似的形状时,当数据流图具有和图类似的形状时,当数据流图具有和图类似的形状时,当数据流图具有和图类似的形状时,这种数据流是这种数据流是这种数据流是这种数据流是“ “以事务为中心的以事务为中心的以事务为中心的以事务为中心的” ”,也就是说,数据沿输入通路到达一个也就是说,数据沿输入通路到达一个也就是说,数据沿输入通路到达一个也就是说,数据沿输入通路到达一个处理处理处理处理T T T T,这个处理根据输入数据的类型,这个处理根据输入数据的类型,这个处理根据输入数据的类型,这个处理根据输入数据的类型在若干个动作序列中选出一个来执行。在若干个动作序列中选出一个来执行。在若干个动作序列中选出一个来执行。在若干个动作序列中选出一个来执行。这类数据流应该划为一类特殊的数据这类数据流应该划为一类特殊的数据这类数据流应该划为一类特殊的数据这类数据流应该划为一类特殊的数据流,称为事务流。图中的处理流,称为事务流。图中的处理流,称为事务流。图中的处理流,称为事务流。图中的处理T T T T称为事称为事称为事称为事务中心,它完成下述任务:务中心,它完成下述任务:务中心,它完成下述任务:务中心,它完成下述任务:(1) (1) (1) (1) 接收输入数据接收输入数据接收输入数据接收输入数据 (2) (2) (2) (2) 分析每个事务以确定它的类型;分析每个事务以确定它的类型;分析每个事务以确定它的类型;分析每个事务以确定它的类型;(3) (3) (3) (3) 根据事务类型选取一条活动通路。根据事务类型选取一条活动通路。根据事务类型选取一条活动通路。根据事务类型选取一条活动通路。2. 事务流图图图图5.9 5.9 5.9 5.9 事务流事务流事务流事务流图(见书图(见书图(见书图(见书96969696页)页)页)页)说明了使用面向说明了使用面向说明了使用面向说明了使用面向数据流方法逐步数据流方法逐步数据流方法逐步数据流方法逐步设计的过程。设计的过程。设计的过程。设计的过程。应该注意,任何应该注意,任何应该注意,任何应该注意,任何设计过程都不是设计过程都不是设计过程都不是设计过程都不是机械地一成不变机械地一成不变机械地一成不变机械地一成不变的,设计首先需的,设计首先需的,设计首先需的,设计首先需要人的判断力和要人的判断力和要人的判断力和要人的判断力和创造精神,这往创造精神,这往创造精神,这往创造精神,这往往会凌驾于方法往会凌驾于方法往会凌驾于方法往会凌驾于方法的规则之上。的规则之上。的规则之上。的规则之上。3. 设计过程精化数据流图精化数据流图精化数据流图精化数据流图区分事务中心区分事务中心区分事务中心区分事务中心和数据接收路径和数据接收路径和数据接收路径和数据接收路径映射成变换结构映射成变换结构映射成变换结构映射成变换结构流类型流类型区分输入和区分输入和区分输入和区分输入和输出分支输出分支输出分支输出分支映射成事务结构映射成事务结构映射成事务结构映射成事务结构用启发式设计规则精化软件结构用启发式设计规则精化软件结构用启发式设计规则精化软件结构用启发式设计规则精化软件结构导出接口描述和全程数据结构导出接口描述和全程数据结构导出接口描述和全程数据结构导出接口描述和全程数据结构复查复查详细设计详细设计详细设计详细设计“ “事务事务事务事务” ”“ “变换变换变换变换” ”事务分析事务分析变换分析变换分析5.5.2 变换分析变换分析是一系列设计步骤的总称,经过这些步变换分析是一系列设计步骤的总称,经过这些步变换分析是一系列设计步骤的总称,经过这些步变换分析是一系列设计步骤的总称,经过这些步骤把具有变换流特点的数据流图按预先确定的模骤把具有变换流特点的数据流图按预先确定的模骤把具有变换流特点的数据流图按预先确定的模骤把具有变换流特点的数据流图按预先确定的模式映射成软件结构。式映射成软件结构。式映射成软件结构。式映射成软件结构。映射映射映射映射DFDDFD( ( ( (问题结构问题结构问题结构问题结构) ) ) )软件系统的结构软件系统的结构软件系统的结构软件系统的结构( ( ( (程序结构程序结构程序结构程序结构) ) ) )变换流映射步骤:步骤:步骤:步骤:(1)(1)(1)(1)区分传入、变换中心、传出部分区分传入、变换中心、传出部分区分传入、变换中心、传出部分区分传入、变换中心、传出部分, , , ,在在在在DFDDFD上标明分界线上标明分界线上标明分界线上标明分界线(2)(2)(2)(2)第一级分解第一级分解第一级分解第一级分解( ( ( (建立初始建立初始建立初始建立初始SCSCSCSC框架框架框架框架) ) ) )设计顶层和第一层模块设计顶层和第一层模块设计顶层和第一层模块设计顶层和第一层模块(3)(3)(3)(3)第二级分解第二级分解第二级分解第二级分解( ( ( (分解分解分解分解SCSCSCSC各分支各分支各分支各分支) ) ) )自顶向下分解,设计出每个分支的中、下层模块自顶向下分解,设计出每个分支的中、下层模块自顶向下分解,设计出每个分支的中、下层模块自顶向下分解,设计出每个分支的中、下层模块MCMTMAMEc,ec,eu,wu,wCBAEDabdecQPRepc,prru,wWUVwuv假设的仪表板将完成下述功能:假设的仪表板将完成下述功能:假设的仪表板将完成下述功能:假设的仪表板将完成下述功能:(1) (1) (1) (1) 通过模数转换实现传感器和微处理机接口;通过模数转换实现传感器和微处理机接口;通过模数转换实现传感器和微处理机接口;通过模数转换实现传感器和微处理机接口;(2) (2) (2) (2) 在发光二极管面板上显示数据;在发光二极管面板上显示数据;在发光二极管面板上显示数据;在发光二极管面板上显示数据;(3) (3) (3) (3) 指示每小时英里数指示每小时英里数指示每小时英里数指示每小时英里数(mph)(mph)(mph)(mph),行驶的里程,每加仑油行驶,行驶的里程,每加仑油行驶,行驶的里程,每加仑油行驶,行驶的里程,每加仑油行驶的英里数的英里数的英里数的英里数(mpg)(mpg)(mpg)(mpg)等等;等等;等等;等等;(4) (4) (4) (4) 指示加速或减速;指示加速或减速;指示加速或减速;指示加速或减速;(5) (5) (5) (5) 超速警告:如果车速超过超速警告:如果车速超过超速警告:如果车速超过超速警告:如果车速超过55555555英里英里英里英里/ / / /小时,则发出超速警小时,则发出超速警小时,则发出超速警小时,则发出超速警告铃声。告铃声。告铃声。告铃声。在软件需求分析阶段应该对上述每条要求以及系统的其他在软件需求分析阶段应该对上述每条要求以及系统的其他在软件需求分析阶段应该对上述每条要求以及系统的其他在软件需求分析阶段应该对上述每条要求以及系统的其他特点进行全面的分析评价,建立起必要的文档资料,特别特点进行全面的分析评价,建立起必要的文档资料,特别特点进行全面的分析评价,建立起必要的文档资料,特别特点进行全面的分析评价,建立起必要的文档资料,特别是数据流图。是数据流图。是数据流图。是数据流图。1. 例子第第第第1 1 1 1步步步步 复查基本系统模型。复查基本系统模型。复查基本系统模型。复查基本系统模型。复查的目的是确保系统的输入数据和输出数据符合实际。复查的目的是确保系统的输入数据和输出数据符合实际。复查的目的是确保系统的输入数据和输出数据符合实际。复查的目的是确保系统的输入数据和输出数据符合实际。第第第第2 2 2 2步步步步 复查并精化数据流图。复查并精化数据流图。复查并精化数据流图。复查并精化数据流图。应该对需求分析阶段得出的数据流图认真复查,并且在必应该对需求分析阶段得出的数据流图认真复查,并且在必应该对需求分析阶段得出的数据流图认真复查,并且在必应该对需求分析阶段得出的数据流图认真复查,并且在必要时进行精化。不仅要确保数据流图给出了目标系统的正要时进行精化。不仅要确保数据流图给出了目标系统的正要时进行精化。不仅要确保数据流图给出了目标系统的正要时进行精化。不仅要确保数据流图给出了目标系统的正确的逻辑模型,而且应该使数据流图中每个处理都代表一确的逻辑模型,而且应该使数据流图中每个处理都代表一确的逻辑模型,而且应该使数据流图中每个处理都代表一确的逻辑模型,而且应该使数据流图中每个处理都代表一个规模适中相对独立的子功能。个规模适中相对独立的子功能。个规模适中相对独立的子功能。个规模适中相对独立的子功能。第第第第3 3 3 3步步步步 确定数据流图具有变换特性还是事务特性确定数据流图具有变换特性还是事务特性确定数据流图具有变换特性还是事务特性确定数据流图具有变换特性还是事务特性一般地说,一个系统中的所有信息流都可以认为是变换流,一般地说,一个系统中的所有信息流都可以认为是变换流,一般地说,一个系统中的所有信息流都可以认为是变换流,一般地说,一个系统中的所有信息流都可以认为是变换流,但是,当遇到有明显事务特性的信息流时,建议采用事务但是,当遇到有明显事务特性的信息流时,建议采用事务但是,当遇到有明显事务特性的信息流时,建议采用事务但是,当遇到有明显事务特性的信息流时,建议采用事务分析方法进行设计。分析方法进行设计。分析方法进行设计。分析方法进行设计。2. 设计步骤输入流和输出流的边界和对输入流和输出流的边界和对输入流和输出流的边界和对输入流和输出流的边界和对它们的解释有关,也就是说,它们的解释有关,也就是说,它们的解释有关,也就是说,它们的解释有关,也就是说,不同设计人员可能会在流内不同设计人员可能会在流内不同设计人员可能会在流内不同设计人员可能会在流内选取稍微不同的点作为边界选取稍微不同的点作为边界选取稍微不同的点作为边界选取稍微不同的点作为边界的位置。当然在确定边界时的位置。当然在确定边界时的位置。当然在确定边界时的位置。当然在确定边界时应该仔细认真,但是把边界应该仔细认真,但是把边界应该仔细认真,但是把边界应该仔细认真,但是把边界沿着数据流通路移动一个处沿着数据流通路移动一个处沿着数据流通路移动一个处沿着数据流通路移动一个处理框的距离,通常对最后的理框的距离,通常对最后的理框的距离,通常对最后的理框的距离,通常对最后的软件结构只有很小的影响。软件结构只有很小的影响。软件结构只有很小的影响。软件结构只有很小的影响。第4步 确定输入流和输出流的边界,从而孤立出变换中心图具有边界的数据流图图具有边界的数据流图图说明了第一级分解的图说明了第一级分解的图说明了第一级分解的图说明了第一级分解的方法。位于软件结构最方法。位于软件结构最方法。位于软件结构最方法。位于软件结构最顶层的控制模块顶层的控制模块顶层的控制模块顶层的控制模块CmCmCmCm协调协调协调协调下述从属的控制功能:下述从属的控制功能:下述从属的控制功能:下述从属的控制功能:输入信息处理控制模块输入信息处理控制模块输入信息处理控制模块输入信息处理控制模块Ca,Ca,Ca,Ca,协调对所有输入数协调对所有输入数协调对所有输入数协调对所有输入数据的接收;变换中心控据的接收;变换中心控据的接收;变换中心控据的接收;变换中心控制模块制模块制模块制模块Ct,Ct,Ct,Ct,管理对内部管理对内部管理对内部管理对内部形式的数据的所有操作;形式的数据的所有操作;形式的数据的所有操作;形式的数据的所有操作;第5步 完成“第一级分解”图图5.13 5.13 第一级分解的方法第一级分解的方法图图5.14 5.14 数字仪表板系统的第一级分解数字仪表板系统的第一级分解所谓第二级分解就是把数据流图中的每个处理所谓第二级分解就是把数据流图中的每个处理所谓第二级分解就是把数据流图中的每个处理所谓第二级分解就是把数据流图中的每个处理映射成软件结构中一个适当的模块。完成第二级分映射成软件结构中一个适当的模块。完成第二级分映射成软件结构中一个适当的模块。完成第二级分映射成软件结构中一个适当的模块。完成第二级分解的方法是,从变换中心的边界开始沿着输入通路解的方法是,从变换中心的边界开始沿着输入通路解的方法是,从变换中心的边界开始沿着输入通路解的方法是,从变换中心的边界开始沿着输入通路向外移动,把输入通路中每个处理映射成软件结构向外移动,把输入通路中每个处理映射成软件结构向外移动,把输入通路中每个处理映射成软件结构向外移动,把输入通路中每个处理映射成软件结构中中中中CaCaCaCa控制下的一个低层模块;然后沿输出通路向外控制下的一个低层模块;然后沿输出通路向外控制下的一个低层模块;然后沿输出通路向外控制下的一个低层模块;然后沿输出通路向外移动,把输出通路中每个处理映射成直接或间接受移动,把输出通路中每个处理映射成直接或间接受移动,把输出通路中每个处理映射成直接或间接受移动,把输出通路中每个处理映射成直接或间接受模块模块模块模块CeCeCeCe控制的一个低层模块;最后把变换中心内的控制的一个低层模块;最后把变换中心内的控制的一个低层模块;最后把变换中心内的控制的一个低层模块;最后把变换中心内的每个处理映射成受每个处理映射成受每个处理映射成受每个处理映射成受CtCtCtCt控制的一个模块。图表示进行控制的一个模块。图表示进行控制的一个模块。图表示进行控制的一个模块。图表示进行第二级分解的普遍途径。第二级分解的普遍途径。第二级分解的普遍途径。第二级分解的普遍途径。第6步 完成“第二级分解”。图图5.15 5.15 第二级分解的方法第二级分解的方法图图图图5.17 5.17 5.17 5.17 未经精化的变换结构未经精化的变换结构未经精化的变换结构未经精化的变换结构图图图图5.18 5.18 5.18 5.18 未经精化的输出结构未经精化的输出结构未经精化的输出结构未经精化的输出结构图图图图5.16 5.16 5.16 5.16 未经精化的输入结构未经精化的输入结构未经精化的输入结构未经精化的输入结构第7步 使用设计度量和启发式规则对第一次分割得到的软件结构进一步精化。图图图图5.19 5.19 5.19 5.19 精化后的数字仪表板系统的软件结构精化后的数字仪表板系统的软件结构精化后的数字仪表板系统的软件结构精化后的数字仪表板系统的软件结构输入结构中的模块输入结构中的模块输入结构中的模块输入结构中的模块“ “转换成转换成转换成转换成rpmrpmrpmrpm” ”和和和和“ “收集收集收集收集spsspsspssps” ”可以合并;可以合并;可以合并;可以合并;模块模块模块模块“ “确定加速确定加速确定加速确定加速/ / / /减速减速减速减速” ”可以放在可以放在可以放在可以放在模块模块模块模块“ “计算计算计算计算mphmphmphmph” ”下面,以减少耦下面,以减少耦下面,以减少耦下面,以减少耦合;合;合;合;5.5.3 事务分析虽然在任何情况下都可以使用变换分析方法设计软件结构,虽然在任何情况下都可以使用变换分析方法设计软件结构,虽然在任何情况下都可以使用变换分析方法设计软件结构,虽然在任何情况下都可以使用变换分析方法设计软件结构,但是在数据流具有明显的事务特点时,也就是有一个明显的但是在数据流具有明显的事务特点时,也就是有一个明显的但是在数据流具有明显的事务特点时,也就是有一个明显的但是在数据流具有明显的事务特点时,也就是有一个明显的“ “发射中心发射中心发射中心发射中心” ”( ( ( (事务中心事务中心事务中心事务中心) ) ) )时,还是以采用事务分析方法为宜。时,还是以采用事务分析方法为宜。时,还是以采用事务分析方法为宜。时,还是以采用事务分析方法为宜。事务分析的设计步骤和变换分析的设计步骤大部分相同或事务分析的设计步骤和变换分析的设计步骤大部分相同或事务分析的设计步骤和变换分析的设计步骤大部分相同或事务分析的设计步骤和变换分析的设计步骤大部分相同或类似,主要差别仅在于由数据流图到软件结构的映射方法不同。类似,主要差别仅在于由数据流图到软件结构的映射方法不同。类似,主要差别仅在于由数据流图到软件结构的映射方法不同。类似,主要差别仅在于由数据流图到软件结构的映射方法不同。由事务流映射成的软件结构包括一个接收分支和一个发送由事务流映射成的软件结构包括一个接收分支和一个发送由事务流映射成的软件结构包括一个接收分支和一个发送由事务流映射成的软件结构包括一个接收分支和一个发送分支。映射出接收分支结构的方法和变换分析映射出输入结构分支。映射出接收分支结构的方法和变换分析映射出输入结构分支。映射出接收分支结构的方法和变换分析映射出输入结构分支。映射出接收分支结构的方法和变换分析映射出输入结构的方法很相像,即从事务中心的边界开始,把沿着接收流通路的方法很相像,即从事务中心的边界开始,把沿着接收流通路的方法很相像,即从事务中心的边界开始,把沿着接收流通路的方法很相像,即从事务中心的边界开始,把沿着接收流通路的处理映射成模块。发送分支的结构包含一个的处理映射成模块。发送分支的结构包含一个的处理映射成模块。发送分支的结构包含一个的处理映射成模块。发送分支的结构包含一个调度模块调度模块调度模块调度模块,它控,它控,它控,它控制下层的所有活动模块;然后把数据流图中的每个活动流通路制下层的所有活动模块;然后把数据流图中的每个活动流通路制下层的所有活动模块;然后把数据流图中的每个活动流通路制下层的所有活动模块;然后把数据流图中的每个活动流通路映射成与它的流特征相对应的结构。图说明了上述映射过程。映射成与它的流特征相对应的结构。图说明了上述映射过程。映射成与它的流特征相对应的结构。图说明了上述映射过程。映射成与它的流特征相对应的结构。图说明了上述映射过程。事务流映射方法:一般说来,如果数据流不具有显著的事务特点,一般说来,如果数据流不具有显著的事务特点,一般说来,如果数据流不具有显著的事务特点,一般说来,如果数据流不具有显著的事务特点,最好使用变换分析;反之,如果具有明显的事务中最好使用变换分析;反之,如果具有明显的事务中最好使用变换分析;反之,如果具有明显的事务中最好使用变换分析;反之,如果具有明显的事务中心,则应该采用事务分析技术。但是,机械地遵循心,则应该采用事务分析技术。但是,机械地遵循心,则应该采用事务分析技术。但是,机械地遵循心,则应该采用事务分析技术。但是,机械地遵循变换分析或事务分析的映射规则,很可能会得到一变换分析或事务分析的映射规则,很可能会得到一变换分析或事务分析的映射规则,很可能会得到一变换分析或事务分析的映射规则,很可能会得到一些不必要的控制模块,如果它们确实用处不大,那些不必要的控制模块,如果它们确实用处不大,那些不必要的控制模块,如果它们确实用处不大,那些不必要的控制模块,如果它们确实用处不大,那么可以而且应该把它们合并。反之,如果一个控制么可以而且应该把它们合并。反之,如果一个控制么可以而且应该把它们合并。反之,如果一个控制么可以而且应该把它们合并。反之,如果一个控制模块功能过分复杂,则应该分解为两个或多个控制模块功能过分复杂,则应该分解为两个或多个控制模块功能过分复杂,则应该分解为两个或多个控制模块功能过分复杂,则应该分解为两个或多个控制模块,或者增加中间层次的控制模块。模块,或者增加中间层次的控制模块。模块,或者增加中间层次的控制模块。模块,或者增加中间层次的控制模块。混合流设计对于一个大系统,常常把变换分析和事务分析应用到同一个数据对于一个大系统,常常把变换分析和事务分析应用到同一个数据对于一个大系统,常常把变换分析和事务分析应用到同一个数据对于一个大系统,常常把变换分析和事务分析应用到同一个数据流图的不同部分,由此得到的子结构形成流图的不同部分,由此得到的子结构形成流图的不同部分,由此得到的子结构形成流图的不同部分,由此得到的子结构形成“ “构件构件构件构件” ”,可以利用它,可以利用它,可以利用它,可以利用它们构造完整的软件结构。们构造完整的软件结构。们构造完整的软件结构。们构造完整的软件结构。5.5.4 设计优化考虑设计优化问题时应该记住,考虑设计优化问题时应该记住,考虑设计优化问题时应该记住,考虑设计优化问题时应该记住,“ “一个不能工一个不能工一个不能工一个不能工作的作的作的作的 最佳设计最佳设计最佳设计最佳设计 的价值是值得怀疑的的价值是值得怀疑的的价值是值得怀疑的的价值是值得怀疑的” ”。软件设。软件设。软件设。软件设计人员应该致力于开发能够满足所有功能和性能要计人员应该致力于开发能够满足所有功能和性能要计人员应该致力于开发能够满足所有功能和性能要计人员应该致力于开发能够满足所有功能和性能要求,而且按照设计原理和启发式设计规则衡量是值求,而且按照设计原理和启发式设计规则衡量是值求,而且按照设计原理和启发式设计规则衡量是值求,而且按照设计原理和启发式设计规则衡量是值得接收的软件。得接收的软件。得接收的软件。得接收的软件。应该在设计的早期阶段尽量对软件结构进行精应该在设计的早期阶段尽量对软件结构进行精应该在设计的早期阶段尽量对软件结构进行精应该在设计的早期阶段尽量对软件结构进行精化。可以导出不同的软件结构,然后对它们进行评化。可以导出不同的软件结构,然后对它们进行评化。可以导出不同的软件结构,然后对它们进行评化。可以导出不同的软件结构,然后对它们进行评价和比较,力求得到价和比较,力求得到价和比较,力求得到价和比较,力求得到“ “最好最好最好最好” ”的结果。这种优化的的结果。这种优化的的结果。这种优化的的结果。这种优化的可能,是把软件结构设计和过程设计分开的真正优可能,是把软件结构设计和过程设计分开的真正优可能,是把软件结构设计和过程设计分开的真正优可能,是把软件结构设计和过程设计分开的真正优点之一。点之一。点之一。点之一。注意,结构简单通常既表示设计风格优雅,又表注意,结构简单通常既表示设计风格优雅,又表注意,结构简单通常既表示设计风格优雅,又表注意,结构简单通常既表示设计风格优雅,又表明效率高。设计优化应该力求做到在有效的模块化的明效率高。设计优化应该力求做到在有效的模块化的明效率高。设计优化应该力求做到在有效的模块化的明效率高。设计优化应该力求做到在有效的模块化的前提下使用最少量的模块,以及在能够满足信息要求前提下使用最少量的模块,以及在能够满足信息要求前提下使用最少量的模块,以及在能够满足信息要求前提下使用最少量的模块,以及在能够满足信息要求的前提下使用最简单的数据结构。的前提下使用最简单的数据结构。的前提下使用最简单的数据结构。的前提下使用最简单的数据结构。对于时间是决定性因素的应用场合,可能有必要对于时间是决定性因素的应用场合,可能有必要对于时间是决定性因素的应用场合,可能有必要对于时间是决定性因素的应用场合,可能有必要在详细设计阶段,也可能在编写程序的过程中进行优在详细设计阶段,也可能在编写程序的过程中进行优在详细设计阶段,也可能在编写程序的过程中进行优在详细设计阶段,也可能在编写程序的过程中进行优化。软件开发人员应该认识到,程序中相对说比较小化。软件开发人员应该认识到,程序中相对说比较小化。软件开发人员应该认识到,程序中相对说比较小化。软件开发人员应该认识到,程序中相对说比较小的部分的部分的部分的部分( ( ( (典型地,典型地,典型地,典型地,10%10%10%10%20%)20%)20%)20%),通常占用全部处理时间,通常占用全部处理时间,通常占用全部处理时间,通常占用全部处理时间的大部分的大部分的大部分的大部分(50%(50%(50%(50%80%)80%)80%)80%)。用下述方法对时间起决定性作用的软件进行优化用下述方法对时间起决定性作用的软件进行优化用下述方法对时间起决定性作用的软件进行优化用下述方法对时间起决定性作用的软件进行优化是合理的:是合理的:是合理的:是合理的:( ( ( (1) 1) 1) 1) 在不考虑时间因素的前提下开发并精化软件结构;在不考虑时间因素的前提下开发并精化软件结构;在不考虑时间因素的前提下开发并精化软件结构;在不考虑时间因素的前提下开发并精化软件结构;(2) (2) (2) (2) 在详细设计阶段选出最耗费时间的那些模块,仔细地设计在详细设计阶段选出最耗费时间的那些模块,仔细地设计在详细设计阶段选出最耗费时间的那些模块,仔细地设计在详细设计阶段选出最耗费时间的那些模块,仔细地设计它们的处理过程它们的处理过程它们的处理过程它们的处理过程( ( ( (算法算法算法算法) ) ) ),以求提高效率;,以求提高效率;,以求提高效率;,以求提高效率;(3) (3) (3) (3) 使用高级程序设计语言编写程序;使用高级程序设计语言编写程序;使用高级程序设计语言编写程序;使用高级程序设计语言编写程序;(4) (4) (4) (4) 在软件中孤立出那些大量占用处理机资源的模块;在软件中孤立出那些大量占用处理机资源的模块;在软件中孤立出那些大量占用处理机资源的模块;在软件中孤立出那些大量占用处理机资源的模块;(5) (5) (5) (5) 必要时重新设计或用依赖于机器的语言重写上述大量占用必要时重新设计或用依赖于机器的语言重写上述大量占用必要时重新设计或用依赖于机器的语言重写上述大量占用必要时重新设计或用依赖于机器的语言重写上述大量占用资源的模块的代码,以求提高效率。资源的模块的代码,以求提高效率。资源的模块的代码,以求提高效率。资源的模块的代码,以求提高效率。上述优化方法遵守了一句格言:上述优化方法遵守了一句格言:上述优化方法遵守了一句格言:上述优化方法遵守了一句格言:“ “先使它能工作,然先使它能工作,然先使它能工作,然先使它能工作,然后再使它快起来。后再使它快起来。后再使它快起来。后再使它快起来。” ” (1)(1)(1)(1)计计计计算算算算标标标标准准准准分分分分: : : :根根根根据据据据考考考考生生生生原原原原始始始始分分分分计计计计算算算算, , , ,得得得得到到到到标标标标准准准准分分分分, , , ,存存存存入入入入考考考考生分数文件。生分数文件。生分数文件。生分数文件。 (2)(2)(2)(2)计计计计算算算算录录录录取取取取线线线线分分分分: : : :根根根根据据据据标标标标准准准准分分分分、招招招招生生生生计计计计划划划划文文文文件件件件中中中中的的的的招招招招生生生生人人人人数数数数, , , ,计算录取线计算录取线计算录取线计算录取线, , , ,存人录取线文件。存人录取线文件。存人录取线文件。存人录取线文件。试试试试根根根根据据据据要要要要求求求求画画画画出出出出该该该该系系系系统统统统的的的的数数数数据据据据流流流流程程程程图图图图, , , ,并并并并将将将将其其其其转转转转换换换换为为为为软软软软件件件件结结结结构图。构图。构图。构图。案例高校录取统分子系统有如下功能:源点源点/终点终点 处理处理 计算标准分计算标准分计算标准分计算标准分计算录取线分计算录取线分计算录取线分计算录取线分数据流数据流 数据存储数据存储 原始分原始分原始分原始分标准分标准分标准分标准分录取线分录取线分录取线分录取线分招生人数招生人数招生人数招生人数考生分数文件考生分数文件考生分数文件考生分数文件招生计划文件招生计划文件招生计划文件招生计划文件录取线文件录取线文件录取线文件录取线文件计算标准分计算标准分计算标准分计算标准分计算录取线分计算录取线分计算录取线分计算录取线分标准分标准分标准分标准分录取线分录取线分录取线分录取线分招生人数招生人数招生人数招生人数原始分原始分原始分原始分考生分数文件考生分数文件招生计划文件招生计划文件录取线文件录取线文件标准分标准分标准分标准分数据流图:系统的软件结构图:原始分原始分标准分标准分招生人数招生人数录取线分录取线分统分子系统统分子系统处理标准分处理标准分取得原始分取得原始分计算标准分计算标准分存取标准分存取标准分计算录取线分计算录取线分取得招生人数取得招生人数存录取线分存录取线分 计算计算标准分标准分计算计算录取线分录取线分招生计划文件招生计划文件考生分数文件考生分数文件录取线文件录取线文件标准分文件标准分文件原始分原始分标准分标准分标准分标准分标准分标准分招生数招生数录取线分录取线分系统的数据流图:统分子系统取得标准分取得招生数计算录取分数线取得原始分计算标准分登录考生分数登录录取线分原始分标准分招生数录取线分统分子系统统分子系统取得标准分取得标准分取得招生数取得招生数计算录取分计算录取分数线数线取得原始分取得原始分计算标准分计算标准分登录考生分登录考生分数数登录录取线登录录取线分分原始分原始分标准分标准分招生数招生数录录 取取 线线分分系统的软件结构图:5.6 小结总体设计阶段的基本目的是用比较抽象概括的方总体设计阶段的基本目的是用比较抽象概括的方总体设计阶段的基本目的是用比较抽象概括的方总体设计阶段的基本目的是用比较抽象概括的方式确定系统如何完成预定的任务,也就是说,应该确式确定系统如何完成预定的任务,也就是说,应该确式确定系统如何完成预定的任务,也就是说,应该确式确定系统如何完成预定的任务,也就是说,应该确定系统的物理配置方案,并且进而确定组成系统的每定系统的物理配置方案,并且进而确定组成系统的每定系统的物理配置方案,并且进而确定组成系统的每定系统的物理配置方案,并且进而确定组成系统的每个程序的结构。因此,总体设计阶段主要由两个小阶个程序的结构。因此,总体设计阶段主要由两个小阶个程序的结构。因此,总体设计阶段主要由两个小阶个程序的结构。因此,总体设计阶段主要由两个小阶段组成。首先需要进行系统设计,从数据流图出发设段组成。首先需要进行系统设计,从数据流图出发设段组成。首先需要进行系统设计,从数据流图出发设段组成。首先需要进行系统设计,从数据流图出发设想完成系统功能的若干种合理的物理方案,分析员应想完成系统功能的若干种合理的物理方案,分析员应想完成系统功能的若干种合理的物理方案,分析员应想完成系统功能的若干种合理的物理方案,分析员应该仔细分析比较这些方案,并且和用户共同选定一个该仔细分析比较这些方案,并且和用户共同选定一个该仔细分析比较这些方案,并且和用户共同选定一个该仔细分析比较这些方案,并且和用户共同选定一个最佳方案。然后进行软件结构设计,确定软件由哪些最佳方案。然后进行软件结构设计,确定软件由哪些最佳方案。然后进行软件结构设计,确定软件由哪些最佳方案。然后进行软件结构设计,确定软件由哪些模块组成以及这些模块之间的动态调用关系。层次图模块组成以及这些模块之间的动态调用关系。层次图模块组成以及这些模块之间的动态调用关系。层次图模块组成以及这些模块之间的动态调用关系。层次图和结构图是描绘软件结构的常用工具。和结构图是描绘软件结构的常用工具。和结构图是描绘软件结构的常用工具。和结构图是描绘软件结构的常用工具。在进行软件结构设计时应该遵循的最主要的原理是在进行软件结构设计时应该遵循的最主要的原理是在进行软件结构设计时应该遵循的最主要的原理是在进行软件结构设计时应该遵循的最主要的原理是模块独立原理,也就是说,软件应该由一组完成相对独模块独立原理,也就是说,软件应该由一组完成相对独模块独立原理,也就是说,软件应该由一组完成相对独模块独立原理,也就是说,软件应该由一组完成相对独立的子功能的模块组成,这些模块彼此之间的接口关系立的子功能的模块组成,这些模块彼此之间的接口关系立的子功能的模块组成,这些模块彼此之间的接口关系立的子功能的模块组成,这些模块彼此之间的接口关系应该尽量简单。应该尽量简单。应该尽量简单。应该尽量简单。抽象和求精是一对互补的概念,也是人类解决复杂抽象和求精是一对互补的概念,也是人类解决复杂抽象和求精是一对互补的概念,也是人类解决复杂抽象和求精是一对互补的概念,也是人类解决复杂问题时最常用、最有效的方法。在进行软件结构设计时问题时最常用、最有效的方法。在进行软件结构设计时问题时最常用、最有效的方法。在进行软件结构设计时问题时最常用、最有效的方法。在进行软件结构设计时一种有效的方法就是,由抽象到具体地构造出软件的层一种有效的方法就是,由抽象到具体地构造出软件的层一种有效的方法就是,由抽象到具体地构造出软件的层一种有效的方法就是,由抽象到具体地构造出软件的层次结构。次结构。次结构。次结构。软件工程师在开发软件的长期实践中积累了丰富的软件工程师在开发软件的长期实践中积累了丰富的软件工程师在开发软件的长期实践中积累了丰富的软件工程师在开发软件的长期实践中积累了丰富的经验,总结这些经验得出一些很有参考价值的启发式规经验,总结这些经验得出一些很有参考价值的启发式规经验,总结这些经验得出一些很有参考价值的启发式规经验,总结这些经验得出一些很有参考价值的启发式规则,它们往往能对如何改进软件设计给出宝贵的提示。则,它们往往能对如何改进软件设计给出宝贵的提示。则,它们往往能对如何改进软件设计给出宝贵的提示。则,它们往往能对如何改进软件设计给出宝贵的提示。在软件开发过程中既要充分重视和利用这些启发式规则,在软件开发过程中既要充分重视和利用这些启发式规则,在软件开发过程中既要充分重视和利用这些启发式规则,在软件开发过程中既要充分重视和利用这些启发式规则,又要从实际情况出发避免生搬硬套。又要从实际情况出发避免生搬硬套。又要从实际情况出发避免生搬硬套。又要从实际情况出发避免生搬硬套。自顶向下逐步求精是进行软件结构设计的常用自顶向下逐步求精是进行软件结构设计的常用自顶向下逐步求精是进行软件结构设计的常用自顶向下逐步求精是进行软件结构设计的常用途径;但是,如果已经有了详细的数据流图,也可途径;但是,如果已经有了详细的数据流图,也可途径;但是,如果已经有了详细的数据流图,也可途径;但是,如果已经有了详细的数据流图,也可以使用面向数据流的设计方法,用形式化的方法由以使用面向数据流的设计方法,用形式化的方法由以使用面向数据流的设计方法,用形式化的方法由以使用面向数据流的设计方法,用形式化的方法由数据流图映射出软件结构。应该记住,这样映射出数据流图映射出软件结构。应该记住,这样映射出数据流图映射出软件结构。应该记住,这样映射出数据流图映射出软件结构。应该记住,这样映射出来的只是软件的初步结构,还必须根据设计原理并来的只是软件的初步结构,还必须根据设计原理并来的只是软件的初步结构,还必须根据设计原理并来的只是软件的初步结构,还必须根据设计原理并且参考启发式规则,认真分析和改进软件的初步结且参考启发式规则,认真分析和改进软件的初步结且参考启发式规则,认真分析和改进软件的初步结且参考启发式规则,认真分析和改进软件的初步结构,以得到质量更高的模块和更合理的软件结构。构,以得到质量更高的模块和更合理的软件结构。构,以得到质量更高的模块和更合理的软件结构。构,以得到质量更高的模块和更合理的软件结构。在进行详细的过程设计和编写程序之前,首先在进行详细的过程设计和编写程序之前,首先在进行详细的过程设计和编写程序之前,首先在进行详细的过程设计和编写程序之前,首先进行结构设计,其好处正在于可以在软件开发的早进行结构设计,其好处正在于可以在软件开发的早进行结构设计,其好处正在于可以在软件开发的早进行结构设计,其好处正在于可以在软件开发的早期站在全局高度对软件结构进行优化。在这个时期期站在全局高度对软件结构进行优化。在这个时期期站在全局高度对软件结构进行优化。在这个时期期站在全局高度对软件结构进行优化。在这个时期进行优化付出的代价不高,却可以使软件质量得到进行优化付出的代价不高,却可以使软件质量得到进行优化付出的代价不高,却可以使软件质量得到进行优化付出的代价不高,却可以使软件质量得到重大改进。重大改进。重大改进。重大改进。习题5-1 5-1 为每种类型的模块耦合举一个具体例子。为每种类型的模块耦合举一个具体例子。为每种类型的模块耦合举一个具体例子。为每种类型的模块耦合举一个具体例子。5-2 5-2 为每种类型的模块内聚举一个具体例子。为每种类型的模块内聚举一个具体例子。为每种类型的模块内聚举一个具体例子。为每种类型的模块内聚举一个具体例子。5-3 5-3 用面向数据流的方法设计下列系统的软件结构:用面向数据流的方法设计下列系统的软件结构:用面向数据流的方法设计下列系统的软件结构:用面向数据流的方法设计下列系统的软件结构:(1) (1) 储蓄系统储蓄系统储蓄系统储蓄系统( (参见习题参见习题参见习题参见习题2 2第第第第2 2题题题题) );(2) (2) 机票预订系统机票预订系统机票预订系统机票预订系统( (参见习题参见习题参见习题参见习题2 2第第第第3 3题题题题) );(3) (3) 患者监护系统患者监护系统患者监护系统患者监护系统( (参见习题参见习题参见习题参见习题2 2第第第第4 4题题题题) )。5-4 5-4 美国某大学共有美国某大学共有美国某大学共有美国某大学共有200200名教师,校方与教师工会刚名教师,校方与教师工会刚名教师,校方与教师工会刚名教师,校方与教师工会刚刚签订一项协议。按照协议,所有年工资超过刚签订一项协议。按照协议,所有年工资超过刚签订一项协议。按照协议,所有年工资超过刚签订一项协议。按照协议,所有年工资超过26 26 000(000(含含含含26 000)26 000)的教师工资将保持不变,年工资少的教师工资将保持不变,年工资少的教师工资将保持不变,年工资少的教师工资将保持不变,年工资少于于于于26 00026 000的教师将增加工资,所增加的工资数按下的教师将增加工资,所增加的工资数按下的教师将增加工资,所增加的工资数按下的教师将增加工资,所增加的工资数按下述方法计算:给每个由此教师所赡养的人述方法计算:给每个由此教师所赡养的人述方法计算:给每个由此教师所赡养的人述方法计算:给每个由此教师所赡养的人( (包括教师包括教师包括教师包括教师本人本人本人本人) )每年补助每年补助每年补助每年补助100100,此外,教师有一年工龄每年再,此外,教师有一年工龄每年再,此外,教师有一年工龄每年再,此外,教师有一年工龄每年再多补助多补助多补助多补助5050,但是,增加后的年工资总额不能多于,但是,增加后的年工资总额不能多于,但是,增加后的年工资总额不能多于,但是,增加后的年工资总额不能多于26 00026 000。教师的工资档案储存在行政办公室的磁带上,档案教师的工资档案储存在行政办公室的磁带上,档案教师的工资档案储存在行政办公室的磁带上,档案教师的工资档案储存在行政办公室的磁带上,档案中有目前的年工资、赡养的人数、雇用日期等信息。中有目前的年工资、赡养的人数、雇用日期等信息。中有目前的年工资、赡养的人数、雇用日期等信息。中有目前的年工资、赡养的人数、雇用日期等信息。需要写一个程序计算并印出每名教师的原有工资和需要写一个程序计算并印出每名教师的原有工资和需要写一个程序计算并印出每名教师的原有工资和需要写一个程序计算并印出每名教师的原有工资和调整后的新工资。要求:调整后的新工资。要求:调整后的新工资。要求:调整后的新工资。要求:(1) (1) 画出此系统的数据流图;画出此系统的数据流图;画出此系统的数据流图;画出此系统的数据流图;(2) (2) 写出需求说明;写出需求说明;写出需求说明;写出需求说明;(3) (3) 设计上述的工资调整程序设计上述的工资调整程序设计上述的工资调整程序设计上述的工资调整程序( (要求用要求用要求用要求用HIPOHIPO图描绘设图描绘设图描绘设图描绘设计结果计结果计结果计结果) ),设计时请分别采用下述两种算法,并比较,设计时请分别采用下述两种算法,并比较,设计时请分别采用下述两种算法,并比较,设计时请分别采用下述两种算法,并比较这两种算法的优缺点:这两种算法的优缺点:这两种算法的优缺点:这两种算法的优缺点:(a) (a) 搜索工资档案数据,找出年工资少于搜索工资档案数据,找出年工资少于搜索工资档案数据,找出年工资少于搜索工资档案数据,找出年工资少于26 00026 000的人,的人,的人,的人,计算新工资,校核是否超过计算新工资,校核是否超过计算新工资,校核是否超过计算新工资,校核是否超过26 00026 000,储存新工资,储存新工资,储存新工资,储存新工资,印出新旧工资对照表;印出新旧工资对照表;印出新旧工资对照表;印出新旧工资对照表;(b) (b) 把工资档案数据按工资从最低到最高的次序排序,把工资档案数据按工资从最低到最高的次序排序,把工资档案数据按工资从最低到最高的次序排序,把工资档案数据按工资从最低到最高的次序排序,当工资数额超过当工资数额超过当工资数额超过当工资数额超过26 00026 000时即停止排序,计算新工资,时即停止排序,计算新工资,时即停止排序,计算新工资,时即停止排序,计算新工资,校核是否超过限额,储存新工资,印出结果。校核是否超过限额,储存新工资,印出结果。校核是否超过限额,储存新工资,印出结果。校核是否超过限额,储存新工资,印出结果。(4) (4) 你所画出的数据流图适用于哪种算法你所画出的数据流图适用于哪种算法你所画出的数据流图适用于哪种算法你所画出的数据流图适用于哪种算法? ?图图1:工资支付系统的第一级分解:工资支付系统的第一级分解5.4 参考答案图图2:工资支付系统的第二级分解:工资支付系统的第二级分解图图3:优化后的工资支付软件结构:优化后的工资支付软件结构
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号