资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,4,章 软件设计,第,4,章,软件设计,1,4.1,软件设计的目标和基本任务,2,4.1.1,软件设计在开发阶段中的重要性,在软件需求分析阶段已经完全弄清楚了软件的各种需求,较好地了解所开发的软件需要“做什么”的问题,并已在软件需求规格说明书和数据要求说明书中详细和充分地阐明了这些需求。,在软件设计中根据需求分析的软件需求及功能、性能需求,采用某种设计方法进行数据设计,系统结构设计和过程设计。,数据设计侧重于数据结构的定义。,结构设计则定义软件系统各主要成分之间的关系。,过程设计则是把结构成分转换为软件的过程性描述。,软件设计在整个开发阶段占有非常重要的地位。在这个阶段做出的决策最终会影响软件实现的成败,从而使得软件设计成为开发阶段最重要的一个环节,因此,它是软件开发中质量得以保证的关键步骤。同时,软件设计又是将用户要求准确地转换成为最终软件产品的唯一途径。,3,4.1.2,软件设计的任务,软件设计的任务就是把分析阶段产生的软件需求转换成用适当手段表示的软件设计文档,即把软件的需求翻译成软件的描述性过程。,换句话说,软件设计就是在明确了系统必须“做什么”之后,下一步就是要明确系统“怎么做”的问题。,从工程管理的角度来看,软件设计分为两个阶段:概要设计(总体设计)和详细设计,他们是软件开发时期的一个十分重要的阶段。,4,4.1.2,软件设计的任务,1,概要设计,概要设计的基本任务就是将需求转换为数据结构和软件的体系结构。,其具体的工作有以下几个方面:, 制定规范,在进入软件开发阶段之初,应为软件开发组制定软件设计时应遵守的标准,以便协调组内成员的工作。, 阅读和理解软件需求说明书,在给定预算范围内和技术现状下,确认用户的要求能否实现,如不能实现,则需明确实现的条件,从而取得设计的目标。, 根据目标确定最合适的设计方法。, 规定文档的编制标准,包括文档体系,用纸及样式,记述详细的程度,图形的画法等。, 规定编码的信息(代码体系)与硬件、操作系统的接口规约,命令规则等。,5,4.1.2,软件设计的任务, 软件系统结构的总体设计,总体设计过程通常由两个阶段组成:系统设计,确定系统实现的方案;结构设计,确定软件的结构。,其中结构设计是概要设计的重点,在这个阶段主要完成四个任务,这就是:, 采用某种设计方法,将一个复杂的软件系统按功能划分成模块的层次结构;, 决定每个模块的功能,建立与已确定软件需求的对应关系;, 决定每个模块的调用关系;, 决定模块间的接口,即模块之间的传递信息,设计接口的信息结构。, 评估模块划分的质量及寻出模块结构的规则。,6,4.1.2,软件设计的任务, 处理方式设计, 确定为实现软件系统的功能需求所必需的算法的性能;, 确定为满足软件条件的性能需求所必需的算法和模块之间的控制方式,性能主要指标;,周转时间,即一旦向计算机发出要求处理的请求之后,从输入开始,经过处理直到输出结果为止的整个时间。,响应时间,这是对实时联机系统的性能需求。,吞吐量,单位时间内能够处理的数据量。,精度,在进行科学计算或工程计算时,运算精确度的要求。,取得外部信号的接收发送形式。,7,4.1.2,软件设计的任务, 数据结构设计,确定软件涉及的文件的结构及数据库的模式,子模式进行数据完整性和安全性的设计。, 确定输入:输出文件的详细的数据结构;, 组合算法设计:确定算法所必须的逻辑结构及操作;, 确定对逻辑数据结构所必须的那些操作的程序模块,(,软件包,),限制和确定各个数据设计决策等影响范围;, 若需要与操作系统或调度程序接口所必须的控制表等数据时,确定其详细的数据结构和使用规则。,8,4.1.2,软件设计的任务, 数据保护性设计,防卫性设计,在软件设计中,插入能自动检错、报错和纠错的功能。,一致性,其一,是保证软件运行过程中所使用的数据类型和取值范围不变;其二,是在并发处理过程中使用封锁和解除封锁机制保持数据不被破坏。,冗余设计,针对同一问题,由两个开发者采用不同的程序设计风格,不同的算法设计软件,当两者运行结果之差不在允许范围之内时,利用检错系统予以纠正,或使用表决技术,决定一个正确的结果,以保证软件容错。,9,4.1.2,软件设计的任务, 可靠性设计,可靠性设计也叫做质量设计,在计算机的使用过程中,可靠性是很重要的,软件的可靠性简言之是指程序和文档中错误少,软件使用的越多,可靠性就越高。, 编写概要设计文档,概要设计阶段完成后,应编写以下文档:,概要设计说明书:给出系统的目标、总体设计、数据设计、处理方式设计、运行设计和出错设计等。,数据库设计说明书:给出所使用数据库简介、数据模式设计、物理设计等。,用户手册:对需求分析阶段编写的初步用户手册进行审定;,制定初步的测试计划:对测试的策略方法和步骤,提出明确要求。,10,4.1.2,软件设计的任务, 概要设计评审,在完成前几项工作后,就应组织对概要设计进行评审,其内容为:,可追溯性:即分析该软件的系统结构、子系统结构,确认该软件设计是否覆盖了所有已确定的软件需求,软件的每一成分是否可追溯到某一项需求。,接口:即分析软件各部分之间的联系,确认该软件的内部接口与外部接口是否已经明确定义,模块的作用范围是否在其控制范围之内。,风险:即确认该软件设计在现有的技术条件下和预防范围内是否能按时实现。,实用性:即确认该软件设计对于需求的解决方案是否实用。,技术清晰度:即确认该软件是否以一种易于翻译成代码的形式表达。,可维护性:从软件维护的角度出发,确认该软件设计是否考虑了方便未来的维护。,质量:即确认该软件设计是否表现出良好的质量特征。,各种选择方案:看是否考虑过其它方案,比较各种选择方案的标准是什么。,限制:评估对该软件的限制是否现实,是否于需求一致。,其它具体问题:对文档、可测试性、设计过程等进行评估。,11,4.1.2,软件设计的任务,2, 详细设计,详细设计要完成的工作有:, 确定软件各个组成部分内的算法及各部分的内部数据组织。, 选定某种过程的表达形式来描述各种算法。, 进行详细设计评审。,软件设计的最终目的是要取得最佳方案,以节省开发经费,降低资源消耗,缩短开发时间的条件,选择能够赢得较高的生产率,较高的可靠性和可维护性的方案。在整个设计过程中,各个时期的设计结果需要经过一系列的设计质量评审,以便及时发现和解决软件设计中出现的问题,防止把问题遗留到开发的最后阶段,造成后患。,12,4.2,软件设计的概念和设计原则,13,模块化的概念,在软件开发的整个过程中,为了获得高质量的软件,人们已经总结出了许多必须遵守的原则,并把这些原则主要有:模块化、抽象、信息隐藏、信息局部化、一致性、完整性、确定性。,1,模块化,模块化就是“按照一定原则把程序划分成若干个模块、使每个模块完成一个子功能”。,反之,把这些模块按某种方式组装结构成一个软件系统后,该系统可以完成指定的功能要求。,14,模块化的依据,规律一:如果问题,P,1,的复杂性大于问题,P,2,,则解决问题,P,1,需要的工作量大于解决问题,P,2,需要的工作量。,C(P,1,),C(P,2,),显然,E(P,1,),E(P,2,),这个不等式导致“各个击破”的结论,把复杂的问题分解成许多容易解决的小问题,原来的问题也就容易解决了。这就是模块化的根据。,规律二:如果一个问题,Q,分别由,P,1,和,P,2,组成而成,那么它的复杂程度大于分别考虑每个问题时的复杂程度之和。,由此可以得出,解决问题,Q,需要的工作量大于分别解决问题,P,1,和,P,2,需要的工作量之和。,C(P,1,+ P,2,),C(P,1,)+C(P,2,),也就是说,如果一个问题由和两个问题组合而成,那么它的复杂程序大于分别考虑每个问题时的复杂程度之和。,综上所述,得到下面的不等式,E(P,1,+ P,2,),E(P,1,)+E(P,2,),15,模块化两方面的问题,1),在软件开发过程中,要自顶向下地把系统分解成若干个模块,实现模块化,这有利于降低系统的复杂性,增加结构性和可理解性。,2),过多地分解模块、或分解不合理,不但不会降低系统的复杂性,还会使复杂性增加。,16,抽象的概念,2,抽象,抽象是对事物共同的本质特性进行抽取和概括,忽略次要因素。,对同一事物的抽象可以从不同层次或不同方面进行。抽象的层次取决于客观问题的需要。上层的抽象要由下层的抽象来实现。,例如:磁盘机。,当我们研究数据库系统的管理问题时,则把数据库文件的集合。,当我们研究操作系统的读写问题时,则把磁盘机及其上的信息抽象为数据块或扇区的集合。,当我们研究磁盘机物理设备的读写的物理操作时,则把磁盘机抽象为柱面、盘面号和扇区的集合。,要选取抽象描述能力高的程序语言作为开发工具。,17,抽象的概念,下面我们看一个由于使用抽象手段使软件系统设计获得很大成功的例子。,1993,年,美国微软公司推出了它的,90,年代操作系统,Windows NT,。在它的许多特色中,有一个特点是它的一体化的“输入,/,输出系统”的设计。设计者们利用抽象原则,把操作系统的文件管理、网络管理、设备管理和高速缓冲存储器这四个十分不同的事物进行分析,抽取其共性,最后将其统一为“对虚拟文件的字节流,虚拟文件可以为任何设备和实体”,从而设计出具有统一外貌、统一处理模式和规范一体化的输入,/,输出系统,获得极大成功。,18,信息隐藏,3,信息隐藏,信息隐藏是指在设计和确定模块时,使得一个模块内包含的信息(过程或数据)对于不需要这些信息的模块来说是不能访问的。,例:,在操作系统中,有几个进程都要使用缓冲区队列中的缓冲区。要实现为进程分配缓冲区的功能可以有两种不同方法。,方法一:由申请缓冲区的进程首先对缓冲区队列上锁以防止多个进程同时访问缓冲队列;然后调用分配模块为其分配缓冲区;可能还要对缓冲区指针进行移动指针的操作;最好还要对缓冲区队列开锁以便其它进程可以使用缓冲区队列。,19,信息隐藏,它存在如下缺点:,不易修改。例如想改变缓冲区队列结构形式,那么参与缓冲区分配和释放实现细节操作,(,如移动指针方法,),的所有进程的代码均需修改。,容易出错、可靠性差。例如进程要先上锁后开锁。假如在这些进程中,某个进程的编写者写错了代码,那么锁变量永远开不了,就会造成系统死琐而引起系统瘫痪。而且这种错误很难发现,因为从缓冲区管理程序中查不出错误,只有查找所有进程代码才行。,理解性不好,进程程序代码中关于缓冲区的这一段操作,与进程自己的功能是不一致、不协调的。所以不好理解。,增加了应用程序开发者的负担,(,还要编制缓冲区分配代码,),。,20,信息隐藏,方法二:是对缓冲区资源设置专门的管理者,例如缓冲管程,由它专管缓冲区的分配和释放,进程要求分配缓冲区时,唯一要做的工具是向管程发送一个消息“请求管程分给一个缓冲区”。,这种方法就符合信息隐藏的原则。,21,信息隐藏,方法二的优点在于:,便于修改。如要修改缓冲区队列数据的结构和属性,或要修改缓冲区分配的算法。其修改范围只局限于管程内部,不会涉及对进程或其他软件部分进行修改。,可靠性改善。因为缓冲区分配工作除管程外,不会受进程或其它软件成分的影响。缓冲区队列数据因不允许其它软件成分访问,从而受到保护,不会受到破坏,(,例如死锁或任意修改,),。,理解性好。进程中不在需要缓冲区分配的具体代码,只有进程向管程发送“申请缓冲区”的消息,(,调用“消息发送”原语,),简单多了,易于理解。,22,信息局部化,4,信息局部化,信息局部化是指在设计和确定模块时,把一些关系密切的软件元素,物理地放得彼此靠近。,所谓“关系密切”是指这些软件元素,(,数据和所有有关过程,),是共同解决某问题或实现某功能所需的。,如上面举例中的缓冲区队列和缓冲区分配过程和缓冲区的释放过程。,所谓“物理地放得彼此靠近”,是指最好是放在同一个模块内。,其优点是可维护性好、可靠性好、可理解性好。,信息隐藏和信息局部化不光适用于总体设计阶段,而是适用于整个软件开发阶段。,23,其他原则,5.,其他原则,一致性:一致性是指软件系统各模块使用一致的符号,没有不必要的差异;对操作有一致的控制结构和调用序列;在任一抽象层次中逻辑相关的对象的表达是相同的。,完整性:是指一个抽象成分的所有本质的东西都明显地定义或描述了,没有本质的东西被遗漏。,确定性:就是指软件系统分解时应保证所有软件成分能被容易地测试,对它们的定义是确定的,不存在歧义。,24,4.3,模块的独立性,25,4.3.1,模块,在软件中,通常把用一个名字就可以调用的一段程序称为“模块”,它们具有如下的属性:, 功能:即指该模块实现什么功能,能做什么事情;, 逻辑:即描述模块内部怎么做;, 状态:即该模块使用时的环境和条件。,在描述一个模块时,必须按模块的外部特性和内部特性分别描述:, 外部特性:模块名,参数表等;, 内部特性:指完成其功能的程序代码和仅供该模块使用的数据。,在软件设计阶段,首先确定模块的外部特性,然后确定它的内部特性,即前者是软件的概要设计,后者是软件的详细设计。,26,4.3.2,模块的独立性,模块的独立性是指软件系统中的每个模块只涉及软件要求的具体子功能,而与软件中其它模块的接口是简单的,若一个模块只有单一的功能,且与其它的模块没有太多的联系,则称此模块为独立的。,通常采用两个标准来度量模块的独立性:模块的耦合和模块的内聚。,内聚是指模块内部各个成分之间的关系,又称为块内联系,是模块功能相对强度的度量。,耦合是指一个模块与其它模块之间的联系,又称为块间联系,是模块之间相对独立性的度量。,27,4.3.3,耦合,耦合:是对模块间相互关联程度的一种度量。它表现了模块的外部特征。模块间的耦合越低,模块的独立性越好。,模块的耦合有以下几种:,低耦合:包括非直接耦合、数据耦合、标记耦合。,中耦合:包括控制耦合、外部耦合。,高耦合:包括公共耦合、内容耦合。,非直接耦合,数据偶合,标记耦合,控制耦合,外部耦合,公共耦合,内容耦合,28,4.3.3,耦合, 非直接耦合,是指两个模块能彼此独立地工作,没有直接的关系。它们的关系是非直接的,仅通过主程序的控制和调用来实现。所以两者之间也不传递任何信息。这样的模块间的关系,称为非直接耦合或称为独立耦合。,29,4.3.3,耦合, 数据耦合,是指一个模块带参数,A,调用另一个模块,而被调用模块执行后返回调用模块为参数,B,,并且参数,A,和,B,为单个数据项。或者说被调用模块的输入和输出都是数据项参数。,例如:某进程,A,调用“分配主存”模块,,A,传送一个参数给分配主存模块是数据项参数,要求的主存大小,返回,A,的参数是分给的主存的起始地址。,30,4.3.3,耦合,标记耦合,是指一个模块调用另一个模块时,不是传送数据,A,本身,而是存放数据,A,的变量名或文件名(是数据的标记,故称标记耦合)等。这种耦合比数据耦合具有更多的出错可能性,因为数据本身和标记(变量名和文件名等)两者都可能出错。,31,4.3.3,耦合, 控制耦合,是指一个模块调用另一个模块时,传送的不是数据参数,而是控制变量,开关变量等用来控制被调用模块的功能。也就是被调用模块内的逻辑控制的走向,受控于调用模块。,在控制耦合情况下,被调用模块内部的处理逻辑大多如图所示。模块内具有多个功能,根据控制参数的值而选用相应的功能部分执行。,32,4.3.3,耦合, 外部耦合,是指与计算机外部设备有关的模块,例如输入、输出及数据交换的模块,只有当需要的设备正常联机时,这些模块才能正常工作。,33,4.3.3,耦合,公共耦合,又称公共数据区耦合,是指若干个模块共同享有对公用数据区的读和写的访问权。,公共数据区可以是全程变量、共享的通信区、内存的公共覆盖区等。,当只有两个模块共享公共数据区,那么这种耦合有两种可能:,一是:一个模块往公共数据区送数据,另一个模块从公共数据区取数据,这是数据偶合的一种情形,是比较松散的耦合。,另一种是:两个模块都是既往公共数据区送数据,又从里面取数据,这种耦合比较紧密,介于数据耦合和控制耦合之间。,34,4.3.3,耦合,模块间公共耦合是一个非常不好的耦合情况,模块的独立性极差。这种耦合存在以下问题:,这种耦合使软件的可理解性降低,模块间存在错综复杂的联系。多个模块共用大量的数据,使用的方式往往是隐含的,不需要显示本模块要用公用数据区中的那些数据,因而往往搞不清某个模块究竟用了那些数据,而某个数据又有哪几个模块在使用。,公共耦合使软件可维护性也很差。例如要修改一个变量的名称或属性时,由于每个模块都可能隐式地使用这个变量,所以只有彻底检查系统每个模块后,才能确定要对哪些模块做相应修改。反过来,如果修改了一个模块,则很难确定还有哪些数据也必须予以修改。,公共耦合使软件的可靠性大大降低。其原因在于,公共数据区没有任何保护措施,哪个模块都可以随意地读写其中的数据,所以某个模块的错误可以扩散,导致某些变量错误,而这些错误又能通过使用这些数据的模块出错,最终使系统无法运行。,35,4.3.3,耦合, 内容耦合,是指一个模块直接访问另一模块的内部信息(程序代码或内部数据)。这是最不好的耦合形式,它对模块独立性破坏最大,造成软件的可维护性、可理解性和可靠性最为恶劣。,36,6.3.4,内聚,内聚:是指一个模块内部的各成分之间(如语句之间或语句段之间)的联系。内聚性越高,模块的性能越好。,内聚分为:,低内聚包括:偶然内聚、逻辑内聚、时间内聚;,中等程度内聚包括:过程内聚、通讯内聚;,高内聚包括:顺序内聚、功能内聚。,功能内聚,顺序内聚,通信内聚,过程内聚,时间内聚,逻辑内聚,偶然内聚,37,6.3.4,内聚, 偶然内聚,偶然内聚是指模块内各成分之间并不存在有意义的联系。,偶然内聚的缺点是:,可理解性差。任何人都难以理解这个模块究竟干什么,为什么存在,甚至难以命名。,可修改性差。假定,A,模块要求把语句“,MOVE O TO R”,改为“,MOVE N TO R”,,而其它模块不想改。诸如此类,可见模块,E,的修改相当困难。,38,6.3.4,内聚, 逻辑内聚,逻辑内聚是指把几个在逻辑上具有相似功能的模块合并,而形成一个新的模块,包含有若干个在逻辑上具有相似功能段的模块,由传送给模块的参数来确定该模块完成那一种功能。,逻辑内聚也属于低内聚,它的缺点是:, 不易修改。因为很可能当某个调用模块要求修改公用代码时,而其它的调用模块则不想修改。, 增强了模块的耦合强度。, 效率不高浪费主存,因为模块每次调用,只有一部分代码被执行。,39,6.3.4,内聚, 时间内聚,时间内聚是指杂一软件运行中有几个动作经常需要在同一个时间段内完成。例如为各种变量置初值的动作和打开文件的动作经常在系统初始化时进行。因此,把这些在时间上同时进行的动作组合起来形成一个模块,该模块的内聚称为时间内聚。,其特点是:, 模块各成分是在同一时间段执行的。, 时间内聚模块内各部分的处理动作只执行一次,但往往影响到其他许多模块的运行,因此和其它模块的耦合程度比较高,可维护性比较低。, 时间内聚模块内各成分的时间关系在一定程度上反映了各成分的某些实质,所以它的理解性以及内聚紧密程度比逻辑内聚要好。,40,6.3.4,内聚, 过程内聚,过程内聚是指一个模块内的各成分是相关的,并且必须以特定次序执行。过程内聚的内部结构通常是用程序流程图作为工具,通过研究程序流程图来确定模块划分。,过程内聚是属于中等程度的内聚,模块内各成分的联系紧密程度优于前面讲述的几种,也比它们好理解和维护。,41,6.3.4,内聚, 通信内聚,通信内聚是指模块内各成分有公用的数据区,或者说模块中所有成分都使用相同的输入或产生相同的输出。,例如:“查询模块”中有两个功能成分:“产生教师,学生表”与“产生学生选课表”都要用到库文件“学生,课程,教师”,显然,这种内聚使模块中各功能成分关系密切多了,因为它们使用或产生关于同一数据区中的相应数据,说明功能是密切相关的,所以理解性和维护性都较好。,42,6.3.4,内聚, 顺序内聚,顺序内聚是指模块内各成分的执行顺序是以确定的顺序进行,不能任意改变。往往前一功能成分的输出就是后一功能成分的输入。并且这些功能成分是与同一功能密切相关的。,43,6.3.4,内聚, 功能内聚,功能内聚是指模块内包括并仅包括为完成某个功能所必须的所有成分。或者说模块内的所有成分共同完成一个功能,缺一不可。,44,4.4,软件结构优化的原则,45,软件结构优化的原则,由前面的讲述我们不难看出总体设计的一个重要任务就是模块化,而且要努力设计高内聚低耦合的模块。下面讲述一些与模块划分有关的、用于软件结构优化的原则。,1.,改进软件结构以提高模块独立性。,设计出软件的初步结构以后,应该审查分析这个结构,通过模块分解或合并,力求降低耦合,提高内聚。,46,软件结构优化的原则,2,模块规模应该适中。,对模块规模的要求是为了增加模块的可理解性,并考虑了程序阅读者的心理学。,如果模块规模过大,模块复杂性增加,可理解性下降。这种情况往往是由于系统分解不够充分造成的,应进一步分解。,如果模块过小,使程序运行效率下降,模块间的转接工作增加,而且使模块接口的复杂性增加。因此在初始结构优化时,应该将它合并,通常是与它的调用模块合并。,但同时要注意,如果这个模块尽管小,但有多个模块调用它时,此时不应将它与其他模块合并。,47,软件结构优化的原则,3,深度、宽度、扇出和扇入应适当。,深度表示软件结构中控制的层数。它往往大致地说明一个系统的大小和复杂程度。,宽度表示控制分布。是指软件结构中同一层次上的(最大的)模块总数,宽度大越大则系统越复杂。,扇出是指一个模块直接控制下的模块数目。扇出过大或过小都不太好。扇出过大意味着该模块过于复杂,需要控制和协调过多的直接下层模块,此时应对该模块的上层调用模块进行分析,是否需要把该模块分为两个模块。或者对本模块进行重新分解,增加一个中间层次。一般来说扇出以,3,4,个为宜,最多不要超过,5,9,。,扇入是某个模块有多少个直接调用它的上层模块数目。扇入大,一般表明该模块设置得好,有很多模块要用该模块的功能,模块再用程度高。高扇入提高了主存利用率和节省人力 。,48,软件结构优化的原则,4,模块的作用域应该在控制域内。,一个模块的控制范围是指该模块本身及其所属的(直接或间接调用的)所有模块的集合。,5,设计单入口单出口的模块。,模块设计过程中应使所有模块均设计成单入口单出口的模块,不应允许任何模块的设计违反此原则。,因为多入口的模块设计为“直接引用”的接口方式创造了条件,必然会产生“内容耦合”的模块间的关系。所以从模块顶部进入,底部退出的单入口单出口设计,使得模块易于理解、容易维护。,6,力争降低模块接口的复杂程度。,模块接口复杂是软件发生错误的一个原因。而且接口复杂或是模块间传递的数据之间没有联系时,是高耦合低内聚的征兆,应该重新分析这个模块的独立性。,因此,应仔细设计模块接口,使得信息传递简单并且和模块功能一致。,7, 模块的功能应该可以预测。,当一个模块的功能可以预测时,该模块可以看作是一个黑箱。只要输入相同的数据就可以产生同样的输出。,49,4.5,结构的设计方法,50,结构的设计方法,面向数据流设计方法是结构化设计的方法的重要组成部分。它是在数据流图的基础上进行设计工作的。,该方法的实施要点是:,1.,首先研究、分析和审查数据流图。,2.,然后根据数据流图决定问题的类型。,3.,由数据流图推导出系统的初始结构图。,4.,运用一些优化原则来改进系统的初始结构图,直到得到符合要求的结构图为止。,5.,然后进入详细设计阶段并制定测试计划。,(,见图,),51,4.5.1,基本概念,1.,变换流。,典型的变换流,如图所示,,由输入流,变换流和输出流三部分组成。,其特征是:外部的数据信息沿输入通路进入系统,同时由外部形式变换成内部形式,进入系统的信息经过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。,52,4.5.1,基本概念,2.,事务流,当数据是“以事务为中心的”,也就是说,数据沿输入通路到达一个处理(或加工),T,,这个处理根据输入数据的类型在若干个动作序列中选出一个来执行,这类数据流就称为事务流。,53,4.5.2,变换分析,变换分析是一系列设计步骤的总称,经过这些步骤把具有变换流特点的数据流图按预先确定的模式映射成软件结构。,1.,变换分析的步骤。,第一步:复查基本系统模型并精化数据流图。,此时,复查基本系统模型并精化数据流图的出发点在于:描述系统中的数据如何流动。,主要注意:,(,1,)在需求分析阶段得到的数据流图的基础上,认真理解和研究数据流图的输入、输出、加工以及有关数据流。,(,2,)箭头表示的是数据流,而不是控制流。,(,3,)假定系统在不停地运行。,54,4.5.2,变换分析,第二步:确定数据流图具有变换特征还是事务特性。,一般来说,所有的数据流图都可以看作是变换流。但是如果数据流图具有明显的事务特性时,应该采用事务流设计方法进行设计。,第三步:若数据流图是变换流类型,应确定逻辑输入(输入流)和逻辑输出(输出流)的分界,从而孤立出变换中心。,首先明确什么是逻辑输入、物理输入、逻辑输出和物理输出。,(,见图示,),1,)物理输入(出):直接来自(指向)外部数据源(终点)的输入(输出)数据流。,2,)逻辑输入(出):距离物理输入(出)端(同一条路径上的)最远,且仍被看作是输入(出)的那个数据流。,55,4.5.2,变换分析,逻辑输入和逻辑输出的确定方法:,逻辑输入:从数据流图的物理输入端开始,一步一步向系统的中间移动,一直到遇到的数据流不再被看作是系统的输入为止,则该数据流的前一个数据流就是系统的逻辑输入。,逻辑输出:从物理输出端开始,一步一步向系统的中间移动,一直到遇到的数据流不再被看作是系统的输出为止,则该数据流的前一个数据流就是系统的逻辑输出。,从数据源到逻辑输入,构成系统的输入部分;从物理输出到逻辑输出,构成输出部分;夹在输入部分和输出部分的就是变换中心。,从数据源得到的物理输入一般要经过编辑、数制转换、格式变换、合法性检查等一系列预处理,最后才变成逻辑输入传送给变换中心。,同样,从变换中心产生的是逻辑输出,它要经过格式转换、组成物理块等一些列处理后,才成为物理输出。,56,4.5.2,变换分析,第四步:进行一级分解,设计顶层和第一层模块。,首先设计一个主模块,并用系统的名字为它命名,然后将它画在与变换中心相对应的位置上。作为系统的顶层,它的功能是调用下一层模块,完成系统所要做的各项工作。,主模块设计好之后,程序结构的第一层可以有两种方法来设计。,方法,A,:为每一个逻辑输入设计一个输入模块,它的功能是为主模块提供数据;为每一个逻辑输出设计一个输出模块,它的功能是将主模块提供的数据输出;为变换中心设计一个变换模块,它的功能是将逻辑输入转换成逻辑输出。,57,4.5.2,变换分析,方法,B,:设计三个模块称为:,CI,、,CT,、,CO,。,CI,是“输入控制模块”,它的功能是协调所有输入数据的接收和预加工,并向主模块发送所需的数据,由主模块转发给变换中心。,CT,是“变换控制模块”,它的功能是负责系统内部数据的变换和加工,把输入数据(逻辑输入)变成可供输出数据(逻辑输出)。,CO,是“输出控制模块”,它的功能是负责输出数据的加工和实现物理输出。,58,4.5.2,变换分析,第五步:进行二级分解,设计中、下层模块。,这一步工作是自顶向下,逐层细化,为第一层的每个模块设计从属模块。,方法,A,:设计下层模块的顺序是任意的。但是一般先设计输入模块的下层模块:为每个输入模块设计两个下层模块。一个是“输入模块”,它的功能是接收数据;另一个是“变换模块”,它的功能是把接收的数据变成它的上级模块所需的数据。此过程重复进行,直到输入物理数据流为止。,59,4.5.2,变换分析,方法,B,:为数据流图上的每个基本加工映射一个模块,直接把基本加工映射成加工模块。具体方法是:在数据流图上从变换中心的边界开始从每个逻辑输入出发逆向沿逻辑输入路径向外移动,把输入通路上每个加工映射成软件结构中输入控制模块,CI,控制下的一个低层模块,直到物理输入为止。然后再从逻辑输出出发,沿数据流方向按逻辑输出路径向外移动,把输出通路上每个加工映射成输出控制模块,CO,控制下的一个低层模块,直到物理输出为止。最后把变换中心内的每个加工映射成控制变换模块,CT,。下的一个低层模块。,60,4.5.2,变换分析,2,注意事项,运用变换分析方法建立系统的结构图时应当注意以下几点:,1),在选择模块设计的次序时,必须对一个模块的全部下属模块都设计完成之后,才能转向另一个模块的下层模块的设计。,2),在设计下层模块是,应考虑模块的低耦合和高内聚问题,提高初始结构图的质量。,3),如果出现了以下情况,就停止模块功能的分解:,当模块不能再细分为明显的子任务时。,当分解成用户提供的模块或程序库的子程序时。,当模块的界面是输入,/,输出设备传送的信息时。,当模块不宜分解得过小时。,61,4.5.3,事务分析,虽然在任何情况下都可以使用变换分析方法设计软件结构,但在数据流具有明显的事务特点时,也就是有一个明显的“发射中心”(事务中心)时,还是以采用事务分析方法为宜。,由事务型数据流图映射为软件结构的设计,首先应设计一个顶层模块或叫总控模块,它的功能是接收事务数据,另一个是根据事务类型调度相应的处理模块,以实现处理该事务的动作序列。,由事务型数据流图映射的软件结构包括一个接收分支和一个发送分支。,接受分支的设计方法与变换型数据流输入部分的设计方法完全相同。,62,4.5.4,综合型数据流图到软件结构的设计,单一类型的典型数据流图 “变换方法”和“事务方法”设计出软件的结构实际上是不存在的,因为实际的大型系统往往是变换型结构和事务型结构的混合结构,这时,我们通常采用的是以变换分析为主,事务分析为辅的方式进行软件结构设计。,在系统结构设计时,首先利用变换分析方法把软件系统分为输入、变换中心和输出三个部分,设计主模块和第一层模块。然后根据数据流图各部分的结构特点,适当地利用变换分析或事务分析,就可以得到初始系统结构的某个方案。,(,见图,),63,4.5.5,设计的后处理,为了有效地进行变换分析和事务分析,需要补充一些附加文档,这应是软件概要设计的一个组成部分。,在程序结构被设计和细化以后,必须做好以下迹象工作:,1.,处理说明,处理说明是一个关于模块内部处理的清晰且无歧异的正确描述,这种说明描述了模块的主要处理任务、条件抉择和输入输出。这种处理说明,可作为初始的模块说明,以后在详细设计时还将进一步具体化。,2.,接口说明,3.,数据结构说明,4.,设计评审,5.,设计优化,在得到系统的初始模块结构图后,我们还需要利用前面学习到的一些优化原则和方法对软件模块结构进行优化,以达到改进软件设计,提高设计质量的目的。,64,
展开阅读全文