第4章结构化设计本章要点结构化设计任务、工作内容及步骤总体设计的过程设计原则、启发规则面向数据流的设计方法详细设计任务及原则代码及用户界面设计基于组件的设计方法结构化设计说明书结构结构化设计概述结构化设计是面向数据流的传统软件开发方法,以数据流为中心构建软件的分析和设计模型。其工具:结构图---通过使用矩形和连接线来表示系统的不同模块以及其活动和子活动的工具。适用于变换型结构和事务性结构的目标系统。伪代码—自然语言和程序设计语言共同表示程序结构。结构化设计的任务任务:在设计阶段,主要是将需求分析阶段得到的DFD转换为软件结构和数据结构。目标:划分子系统并使子系统之间是高内聚低耦合的,从而提高软件的可理解性和可维护性。根据用信息域表示的软件需求,以及功能和性能需求,进行数据设计系统结构设计过程设计数据设计侧重于数据结构的定义。系统结构设计定义软件系统各主要成份之间的关系。过程设计则是把结构成份转换成软件的过程性描述。在编码步骤,根据这种过程性描述,生成源程序代码,然后通过测试最终得到完整有效的软件。开发阶段的信息流从工程管理的角度来看,软件设计分两步完成。概要设计,将软件需求转化为数据结构和软件的系统结构。详细设计,即过程设计。通过对结构表示进行细化,得到软件的详细的数据结构和算法。详细设计阶段概要设计阶段体系结构设计模块设计数据库设计用户界面设计需求开发实现与测试数据结构与算法设计系统设计过程示意图结构化设计的工作内容及步骤结构化设计的工作内容:结构化设计首先是根据数据流图类型将问题分析划分为事务型问题和(或)变换型问题,分别将它们映射成事务型或变换型结构图;然后对映射得到的结构图进行综合和评价改进;最后按照有关规范编写总体设计说明书进行复审。结构化设计的工作步骤图4-1所示结构化总体设计准则:模块化抽象与逐步求精信息隐蔽和局部化模块独立性目标:概括地回答系统应该如何实现。总体设计过程1.设计系统方案2.选取一组合理的方案3.推荐最佳实施方案4.功能分解5.软件结构设计6.数据库设计、文件结构的设计7.制定测试计划8.编写概要设计文档(1)用户手册(2)测试计划(3)详细项目开发实现计划(4)数据库设计结果9.审查与复审概要设计文档设计原则软件系统的模块化是指整个软件被划分成若干单独命名和可编址的部分,称之为模块。这些模块可以被组装起来以满足整个问题的需求。抽象软件系统进行模块设计时,可有不同的抽象层次。在最高的抽象层次上,可以使用问题所处环境的语言概括地描述问题的解法。在较低的抽象层次上,则采用过程化的方法。信息隐蔽由parnas方法提倡的信息隐蔽是指,每个模块的实现细节对于其它模块来说是隐蔽的。也就是说,模块中所包含的信息(包括数据和过程)不允许其它不需要这些信息的模块使用。一致性整个软件系统(文档和程序)的各个模块均应使用一致的概念、符号、术语;接口一致;规格说明与系统行为一致;设计工具、方法和编码风格一致等。总体设计的启发规则将软件的体系结构按自顶向下方式,对各个层次的过程细节和数据细节逐层细化,直到用程序设计语言的语句能够实现为止,从而最后确立整个的体系结构。软件结构包括两部分。程序的模块结构和数据的结构软件的体系结构通过一个划分过程来完成。该划分过程从需求分析确立的目标系统的模型出发,对整个问题进行分割,使其每个部分用一个或几个软件成份加以解决,整个问题就解决了程序结构程序结构表明了程序各个部件(模块)的组织情况,是软件的过程表示。结构图反映程序中模块之间的层次调用关系和联系:它以特定的符号表示模块、模块间的调用关系和模块间信息的传递①模块:模块用矩形框表示,并用模块的名字标记它。②模块的调用关系和接口:模块之间用单向箭头联结,箭头从调用模块指向被调用模块。③模块间的信息传递:当一个模块调用另一个模块时,调用模块把数据或控制信息传送给被调用模块,以使被调用模块能够运行。而被调用模块在执行过程中又把它产生的数据或控制信息回送给调用模块。④在模块A的箭头尾部标以一个菱形符号,表示模块A有条件地调用另一个模块B。当一个在调用箭头尾部标以一个弧形符号,表示模块A反复调用模块C和模块D。面向数据流的设计方法系统结构的两种典型形式:系统数据流的两种形式:变换型结构事务型结构变换型数据流事务型数据流变换中心输入输出变换型结构事务中心接受路径动作路径基本模型特征事务型结构由输入、变换中心和输出三部分组成具有在多种事务中选择执行某类事物的能力T事务中心传入变换传出大型系统DFD中,变换型和事务型结构往往共存变换流示意图信息流输入流输出流交换流外部表示内部表示系统结构图的组成传入模块─从下属模块取得数据,经过某些处理,再将其传送给上级模块。它传送的数据流叫做逻辑输入数据流。传出模块─从上级模块获得数据,进行某些处理,再将其传送给下属模块。它传送的数据流叫做逻辑输出数据流。变换模块─它从上级模块取得数据,进行特定的处理,转换成其它形式,再传送回上级模块。它加工的数据流叫做变换数据流。协调模块─对所有下属模块进行协调和管理的模块。ACBX,YZZACB21入出ZX,YZ21ACBDA根据内部判断决定是否调用BA按另一判定结果选择调用C或DABCA根据内在的循环重复调用B、C等模块27初始的SC主模块输入模块主加工模块输入模块事务控制模块接受模块动作发送模块动作1模块动作2模块动作3模块由变换分析产生由事务分析产生变换分析设计方法步骤:(1)区分传入、变换中心、传出部分,在DFD上标明分界线。BCADEQPRWUVabcedrpuwv变换中心传入部分传出部分(2)第一级分解(建立初始SC框架)设计顶层和第一层模块。第一级分解的方法MCMTMAMEMCMTMAME第一层顶层c,ec,eu,wu,w传出模块中心变换模块事务分析任何情况下都可使用变换分析方法设计软件结构,但如数据流具有明显的事务特点时(有一个明显的事务中心),以采用事务分析方法为宜。步骤:(1)在DFD上确定事务中心、接收部分和发送部分。(2)画出SC框架,把DFD上的三部分分别映射为事务控制模块、接收模块和动作发送模块。(3)分解细化接收分支和发送分支,完成初始SC。32初始的SC主模块输入模块主加工模块输入模块事务控制模块接受模块动作发送模块动作1模块动作2模块动作3模块由变换分析产生由事务分析产生33事务分析的映射方法总控调度C路径B路径A路径A路径B路径C路径接收路径混合型分析在实际应用中,一些大型问题往往是两种混合在一起的混合型问题。对于混合型问题,一般以变换型问题为主,首先找出变换中心,设计出结构图的上层;然后根据数据流图的各部分具体类型分别映射得到它们的结构图。一般在设计阶段对软件结构进行优化。结构化总体设计的工具系统流程图表4-1HIPO图图4-19系统流程图符号:符号名称说明处理能改变数据或数据位置的加工或部件。输入输出表示输入输出,是一个广义的不指明具体设备的符号。连接指出转到图的另一部分或从图的另一部分转来,通常在同一页上。换页连接指出转到另一页图上或由另一页图转来。人工操作由人工完成的处理。通信链路远程通信线路传达数据。数据流用来连接其他符号,指明数据流动方向。系统流程图的作用u制作系统流程图的过程是系统分析员全面了解系统业务处理概况的过程,是分析员作进一步分析的依据。u系统流程图是系统分析员、管理人员、业务操作人员相互交流的工具。u系统分析员可直接再系统流程图上拟出可以实现计算机处理的部分。u可利用系统流程图来分析业务流程的合理性。绘制注意事项物理部件的名称写在图形符号内,用以说明该部件的含义;系统流程图中不能出现控制流;用以表示信息流的箭头符号不需要标注名称。对于复杂的系统一般采用分层的方式进行描绘。39层次方框图层次方框图是用树形结构的一系列多层次的矩形框描述数据的层次结构。树形结构的顶层是一个单独的矩形框,代表完整的数据结构,下面的各层矩形框代表这个数据的子集,最底层的各个框代表组成这个数据的实际数据元素(不能再分隔的元素)。40某计算机公司全部产品的数据结构产品软件服务硬件系统软件处理设备应用软件软件服务硬件维修培训存储器处理机操作系统编译程序软件工具IPO表层次方框图值说明了软件由哪些模块组成及其控制层次结构,并未说明模块间的信息传递及模块内部的处理。因此需要借助IPO表。见p105表4-2。模块的结构设计模块包含的4种属性输入/出逻辑功能-表明模块能做什么事运行程序-如何用程序实现其逻辑功能内部数据-模块自己的数据理想模块的特点每个理想模块只解决一个问题;每个理想模块的功能都应该明确,易理解;理想模块之间的连接关系简单,具有独立性;由理想模块构成的系统,易理解、编程、测试、修改和维护。假设C(x)为描述问题x的复杂度的函数,E(x)为解决问题x的代价函数。根据经验,对于两个问题p1和p2,如果C(p1)C(p2),那么E(p1)E(p2)。进一步得出如下推论:C(p1+p2)C(p1)+C(p2)E(p1+p2)E(p1)+E(p2)因此推断,如果问题P能够分解为n个子问题,那么解决n个子问题的总代价肯定低于直接解决P的代价,因为P太复杂了,简直让人无从下手!44模块化与软件成本成本或工作量模块数量软件总成本接口成本成本/模块M最小成本区域模块独立性模块的独立性模块独立性,是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其它的模块的接口是简单的一般采用两个准则度量模块独立性。即模块间耦合性和模块内聚性具有独立的模块的软件比较容易开发出来独立的模块比较容易测试和维护耦合是模块之间的互相连接的紧密程度的度量。内聚是模块功能强度(一个模块内部各个元素彼此结合的紧密程度)的度量。模块独立性比较强的模块应是高内聚低耦合的模块。48非直接耦合(NondirectCoupling)两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。非直接耦合的模块独立性最强。49数据耦合(DataCoupling)一个模块访问另一个模块时,彼此之间是通过简单数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的。标记耦合(StampCoupling)一组模块通过参数表传递记录信息,就是标记耦合。这个记录是某一数据结构的子结构,而不是简单变量。50控制耦合(ControlCoupling)如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。控制耦合往往是多余的,通常可用数据耦合来代替。51外部耦合(ExternalCoupling)一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。公共耦合(CommonCoupling)若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。52公共耦合的复杂程度随耦合模块的个数增加而显著增加。若只是两模块间有公共数据环境,则公共耦合有两种情况。松散公共耦合和紧密公共耦合。53内容耦合(ContentCoupling)如果发生下列情形,两个模块之间就发生了内容耦合(1)一个模块直接访问另一个模块的内部数据;(2)一个模块不通过正常入口转到另一模块内部;(3)两个模块有一部分程序代码重迭(只可能出现在汇编语言中);(4)一个模块有多个入口。54c内容耦合是最高程度的耦合,应该坚决避免使用内容耦合(c)多入口模块55功能内聚(FunctionalCohesion)一个模块中各个部分都是完成某一具体功能必不可少的组成部分,或者说该模块中所有部分都是为了完成一项具体功能而协同工作,紧密联系,不可分割的。则称该模块为功能内聚模块。56信息内聚(Information