《软件工程软件设计方法.ppt》由会员分享,可在线阅读,更多相关《软件工程软件设计方法.ppt(249页珍藏版)》请在三一办公上搜索。
1、1,2,软件设计的目标和任务软件设计基础模块独立性结构化设计方法数据设计和文件设计过程设计,软件设计方法,3,软件设计的目标和任务,根据用信息域表示的软件需求,以及功能和性能需求,进行 数据设计 系统结构设计 过程设计。,4,数据设计侧重于数据结构的定义。系统结构设计定义软件系统各主要成份之间的关系。(两个含义)过程设计则是把结构成份转换成软件的过程性描述。在编码步骤,根据这种过程性描述,生成源程序代码,然后通过测试最终得到完整有效的软件。,5,开发阶段的信息流,程序模块,测试,编码,设计,信息域需求,功能与性能需求,数据设计,过程设计,系统结构设计,组装好的有效的软件,6,软件设计是后续开发
2、步骤及软件维护工作的基础。如果没有设计,只能建立一个不稳定的系统结构,7,软件设计任务,从工程管理的角度来看,软件设计分两步完成。概要设计,将软件需求转化为数据结构和软件的系统结构。详细设计,即过程设计。通过对结构表示进行细化,得到软件的详细的数据结构和算法。,8,9,软件设计过程,1.制定规范在进入软件开发阶段之初,首先应为软件开发组制定在设计时应该共同遵守的标准,以便协调组内各成员的工作。包括:,10,阅读和理解软件需求说明书,确认用户要求能否实现,明确实现的条件,从而确定设计的目标,以及它们的优先顺序 根据目标确定最合适的设计方法 规定设计文档的编制标准 规定编码的信息形式,与硬件,操作
3、系统的接口规约,命名规则,11,2.软件系统结构的总体设计,基于功能层次结构建立系统。采用某种设计方法,将系统按功能划分成模块的层次结构 确定每个模块的功能 建立与已确定的软件需求的对应关系 确定模块间的调用关系 确定模块间的接口 评估模块划分的质量,12,3.处理方式设计,确定为实现系统的功能需求所必需的算法,评估算法的性能确定为满足系统的性能需求所必需的算法和模块间的控制方式 周转时间 响应时间 吞吐量 精度确定外部信号的接收发送形式,13,4.数据结构设计,确定软件涉及的文件系统的结构以及数据库的模式、子模式,进行数据完整性和安全性的设计确定输入,输出文件的详细的数据结构结合算法设计,确
4、定算法所必需的逻辑数据结构及其操作确定对逻辑数据结构所必需的那些操作的程序模块(软件包),14,限制和确定各个数据设计决策的影响范围若需要与操作系统或调度程序接口所必须的控制表等数据时,确定其详细的数据结构和使用规则数据的保护性设计 防卫性设计:在软件设计中就插入自动检错,报错和纠错的功能,15,一致性设计:保证软件运行过程中所使用的数据的类型和取值范围不变 在并发处理过程中使用封锁和解除封锁机制保持数据不被破坏冗余性设计:针对同一问题,由两个开发者采用不同的程序设计风格不同的算法设计软件,当两者运行结果之差不在允许范围内时,利用检错系统予以纠正,或使用表决技术决定一个正确结果。,16,5.可
5、靠性设计,可靠性设计也叫做质量设计在运行过程中,为了适应环境的变化和用户新的要求,需经常对软件进行改造和修正。在软件开发的一开始就要确定软件可靠性和其它质量指标,考虑相应措施,以使得软件易于修改和易于维护。,17,6.编写概要设计阶段的文档,概要设计阶段完成时应编写以下文档:概要设计说明书 数据库设计说明书 用户手册 制定初步的测试计划,18,7.概要设计评审,可追溯性:确认该设计是否复盖了所有已确定的软件需求,软件每一成份是否可追溯到某一项需求接口:确认该软件的内部接口与外部接口是否已经明确定义。模块是否满足高内聚和低耦合的要求。模块作用范围是否在其控制范围之内风险:确认该设计在现有技术条件
6、下和预算范围内是否能按时实现,19,实用性:确认该设计对于需求的解决方案是否实用技术清晰度:确认该设计是否以一种易于翻译成代码的形式表达可维护性:确认该设计是否考虑了方便未来的维护质量:确认该设计是否表现出良好的质量特征,20,各种选择方案:看是否考虑过其它方案,比较各种选择方案的标准是什么限制:评估对该软件的限制是否现实,是否与需求一致其它具体问题:对于文档、可测试性、设计过程.等进行评估,21,在详细设计过程中,需要完成的工作是:确定软件各个组成部分内的算法以及各部分的内部数据组织 选定某种过程的表达形式来描述各种算法。进行详细设计的评审,详细设计,22,软件设计基础,自顶向下,逐步细化
7、软件结构 程序结构 结构图 模块化 抽象化 信息隐蔽,23,自顶向下,逐步细化,将软件的体系结构按自顶向下方式,对各个层次的过程细节和数据细节逐层细化,直到用程序设计语言的语句能够实现为止,从而最后确立整个的体系结构。,24,软件结构,软件结构包括两部分。程序的模块结构和数据的结构软件的体系结构通过一个划分过程来完成。该划分过程从需求分析确立的目标系统的模型出发,对整个问题进行分割,使其每个部分用一个或几个软件成份加以解决,整个问题就解决了,25,26,程序结构,程序结构表明了程序各个部件(模块)的组织情况,是软件的过程表示。,27,结构图,结构图反映程序中模块之间的层次调用关系和联系:它以特
8、定的符号表示模块、模块间的调用关系和模块间信息的传递,28,模块:模块用矩形框表示,并用模块的名字标记它。,29,模块的调用关系和接口:模块之间用单向箭头联结,箭头从调用模块指向被调用模块。,30,模块间的信息传递:当一个模块调用另一个模块时,调用模块把数据或控制信息传送给被调用模块,以使被调用模块能够运行。而被调用模块在执行过程中又把它产生的数据或控制信息回送给调用模块,31,在模块A的箭头尾部标以一个菱形符号,表示模块A有条件地调用另一个模块B。当一个在调用箭头尾部标以一个弧形符号,表示模块A反复调用模块C和模块D。,32,程序的系统结构图,33,模块化,软件系统的模块化是指整个软件被划分
9、成若干单独命名和可编址的部分,称之为模块。这些模块可以被组装起来以满足整个问题的需求。把问题子问题的分解与软件开发中的系统子系统或系统模块对应起来,就能够把一个大而复杂的软件系统划分成易于理解的比较单纯的模块结构。,34,模块化的理论根据设函数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),35,模块化:把程序划分成为若干个模块,独立完成若干个功能,再把他们组成一个集体,可
10、以完成指定的功能,满足问题的要求。“各个击破”原则不能无限分割,36,模块化原理的作用:使软件结构清晰;使软件容易测试和调试,从而提高软件的可靠性;提高软件的可修改性例子1:库存管理系统的模块划分事务接收模块更新库存清单订货处理生成报表例子2:人事管理系统人事部 人事部,37,模块的概念,模块(Module)“模块”,又称“组件”。它一般具有如下三个基本属性:功能:描述该模块实现什么功能逻辑:描述模块内部怎么做状态:该模块使用时的环境和条件,38,在描述一个模块时,还必须按模块的外部特性与内部特性分别描述模块的外部特性 模块的模块名、参数表、其中的输入参数和输出参数,以及给程序以至整个系统造成
11、的影响模块的内部特性 完成其功能的程序代码和仅供该模块内部使用的数据,39,在结构化系统设计中。人们主要关心的是模块的外部属性,至于内部属性,将在系统实施工作中完成模块有大有小,它可以是一个程序,也可以是程序中的一个程序段或者一个子程序。,40,理想模块(黑箱模块)理想模块的特点:(1)每个理想模块只解决一个问题。(2)每个理想模块的功能都应该明确,使人容易理解。(3)理想模块之间的联结关系简单,具有独立性。(4)由理想模块构成的系统,容易使人理解,易于编程,易于测试,易于修改和维护。对用户来说,其感兴趣是模块的功能,而不必去理解模块内部的结构和原理。,41,模块的图形及符号(1)模块的图形:
12、用矩形表示。模块的名称写在方框内,由一个动词和一个作为宾语的名词组成。例如:(2)模块间通讯的图形模块间通讯有两种:数据通讯、控制通讯。数据通讯是一个数据流,它表示了一个经过处理的数据从一个模块传向另一个模块。控制通讯,只传送一个标志,该标志只表达了处理工作的某种状态,而不是由被发送模块真正进行过处理的数据。,修改库存,42,(3)模块间判断调用的图形一个模块是否调用某一个从属模块,依赖于调用模块中判断的条件。如果条件成立,则产生调用命令。,43,(4)模块间循环调用的图形指一个模块需要循环调用某一个或若干个从属模块。(5)层次图和HIPO图,44,45,46,模块独立性 模块独立性,是指软件
13、系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其它的模块的接口是简单的 例如,若一个模块只具有单一的功能且与其它模块没有太多的联系,则称此模块具有模块独立性 一般采用两个准则度量模块独立性。即模块间耦合和模块内聚,47,耦合是模块之间的互相连接的紧密程度的度量。内聚是模块功能强度(一个模块内部各个元素彼此结合的紧密程度)的度量。模块独立性比较强的模块应是高内聚低耦合的模块。,48,模块间的耦合,49,非直接耦合(Nondirect Coupling)两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。非直接耦合的模块独立性最强。,50,数据耦合(Data
14、Coupling)一个模块访问另一个模块时,彼此之间是通过简单数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的。这是模块之间影响最小的联结关系,51,特征耦合如果两个模块都与同一个数据结构有关,则称为特征耦合。,模块之间的特征联结,52,住户详情数据结构中包括“本月用水量”、“本月用电量”。上面的“特征耦合”图可改进为下面“数据耦合”图。,模块之间的数据耦合,53,控制耦合(Control Coupling)如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。,54,控制信息可以看作是一个开关量,它传递了一个控制信息或状态的标志。控
15、制信息不同于数据信息,数据信息一般是通过处理过程处理和被处理的数据,而控制信息则是控制处理过程中的某些参数。当要查找的库存编号找不到时,经上级模块反馈一个控制信息,要求上级模块打印“无此库存记录”错误信息。,55,外部耦合(External Coupling)一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。公共耦合(Common Coupling)若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。,56,公共耦合的复杂程度随耦合模块的个数增加而显
16、著增加。若只是两模块间有公共数据环境,则公共耦合有两种情况。松散公共耦合和紧密公共耦合。,57,公用耦合是一种不良的耦合关系,它给模块的维护和修改带来困难。如公共数据要作修改,很难判定有多少模块应用了该公共数据,故在模块设计时,一般不允许有公共联结关系的模块存在。,58,内容耦合(Content Coupling)如果发生下列情形,两个模块之间就发生了内容耦合(1)一个模块直接访问另一个模块的内部数据;(2)一个模块不通过正常入口转到另一模块内部;(3)两个模块有一部分程序代码重迭(只可能出现在汇编语言中);(4)一个模块有多个入口。,59,内容耦合(病态耦合)如果一个模块和另一个模块的内部属
17、性(即运行程序和内部数据)有关,则称为内部耦合。例如:模块A中TRC:模块B中GO TO TRC模块A与模块B存在内容耦合,这是一种最坏的耦合。,60,c,61,设计模块时,应以数据联结为主,辅以特征联结与控制联结,消除公共联结和内容联结。,62,例:分析下图和表,确定模块间的耦合类型,图 一个程序的模块互连图 表 模块接口描述,注:模块p、t、u更新同一个数据库,63,模块内聚模块的聚合是指一个模块内部的各个组成部分的紧凑性,其处理动作的组合强度。,64,功能内聚(Functional Cohesion)一个模块中各个部分都是完成某一具体功能必不可少的组成部分,或者说该模块中所有部分都是为了
18、完成一项具体功能而协同工作,紧密联系,不可分割的。则称该模块为功能内聚模块。,65,顺序内聚如果一个模块内部的各个组成部分执行的几个处理动作有这样的特征:前一个处理动作所产生的输出数据是后一个处理动作的输入数据,称为顺序内聚。顺序聚合维护起来不如功能聚合方便,要修改模块中的一个功能,会影响到同一个模块中的其他功能。,66,通信内聚(Communication Cohesion)如果一个模块内各功能部分都使用了相同的输入数据,或产生了相同的输出数据,则称之为通信内聚模块。通常,通信内聚模块是通过数据流图来定义的。,67,68,两个工作:1.按配件编号查询“数据存储”,获得单价。2.按配件编号查询
19、“数据存储”,获得库存量。,这两个处理动作都使用相同的输入数据,称为通讯聚合。,69,过程内聚(Procedural Cohesion)使用流程图做为工具设计程序时,把流程图中的某一部分划出组成模块,就得到过程内聚模块。例如,把流程图中的循环部分、判定部分、计算部分分成三个模块,这三个模块都是过程内聚模块。,70,一个模块内部的各个组成部分的处理动作各不相同,彼此也没有联系,但他们都受同一个控制流支配,决定他们的执行次序。,通过循环体,计算两种累积数。,71,时间内聚(Classical Cohesion)时间内聚又称为经典内聚。这种模块大多为多功能模块,但模块的各个功能的执行与时间有关,通常
20、要求所有功能必须在同一时间段内执行。例如初始化模块和终止模块。,72,逻辑内聚(Logical Cohesion)这种模块把几种 相关的功能组合 在一起,每次被 调用时,由传送 给模块的判定参 数来确定该模块 应执行哪一种功 能。,73,巧合内聚(Coincidental Cohesion)巧合内聚(偶然内聚)。当模块内各部分之间没有联系,或者即使有联系,这种联 系也很松散,则称这种模 块为巧合内 聚模块,它 是内聚程度 最低的模块。,74,模块聚合性的判断,该模块只能执行一个功能吗?,功能聚合,模块内各组成部分的关系如何?,是,否,次序重要吗?,次序重要吗?,逻辑相似吗?,数据流,控制流,两
21、者都不是,是,是,是,否,否,否,顺序聚合,通讯聚合,过程聚合,暂时聚合,逻辑聚合,巧合聚合,75,七种聚合模块的性能比较,76,例:分析图中所示的层次图,确定每个模块的内聚类型,图 计算多地点日平均温度的程序,77,模块设计的其他原则(1)模块的分解分解是指把一个模块分解成若干个从属于它的下层模块。一般按功能分解,分解到成为一个小的功能单一的模块为止。一般一个模块内包含的语句在3050条左右较好(指高级语言)。(2)模块的扇出和扇入模块的扇出指一个模块拥有的直属下级模块的个数,一般扇出数控制在7以内。模块的扇入是指一个模块的直接上级模块的个数。在设计中,扇入系数大,说明模块分解得好,通用性强
22、,冗余度低。,78,(3)模块的控制范围和判断作用范围模块的控制范围:本身及其所有下级模块。模块的判断作用范围:被判断调用的模块。原则:A.对于任何一个内部存在判断调用的模块,它的判断作用的范围应该是其控制范围的一个子集。B.存在判断调用的模块,所在层次不要与那些属于判断作用范围的模块所在的层次相隔太远。,模块G中有一条判断调用D的语句,违反第1条原则,79,(1)(2)违反第2条原则,80,正确,81,(4)力争降低模块接口的复杂程度模块接口复杂是软件发生错误的一个主要原因。应该仔细设计模块接口,使得信息传递简单并且和模块的功能一致。接口复杂或不一致(即看起来传递的数据之间没有联系),是紧联
23、结或低聚合的征兆,应该重新分析这个模块的独立性。(5)设计单入口单出口的模块(6)模块功能应该可以预测模块的功能应该能够预测,但也要防止模块功能过分局限。,82,抽象化,随着软件规模的不断增大,设计的复杂性也不断增大。抽象便成了控制复杂性的基本策略之一。软件工程是一种层次化的技术,抽象也是分层次的。如传统软件工程中:分层数据流图(分析文档)、SC图(设计文档)软件系统进行模块设计时,可有不同的抽象层次。最高层的抽象程度最高,若需要系统某部分的细节,就移向较低层次的抽象。越到较低层次,越可看到更多的细节。,83,在最高的抽象层次上,可以使用问题所处环境的语言(面向问题域的语言)概括地描述问题的解
24、法。然后不断具体化,降低抽象级别。在较低的抽象层次上,则采用过程化的方法。最后在最低的抽象级别上给出实现问题的解,即源代码。,84,在由高级抽象到低级抽象的转换过程中,要进行一连串的过程抽象和数据抽象细化(Refinement)。过程抽象把完成一个特定功能的动作序列抽象为一个过程名和参数表,以后通过指定的过程名和实际参数调用此过程;数据抽象把一个数据对象的定义抽象为一个数据类型名,用此类型名可定义多个具有相同性质的数据对象。细化是与抽象相反而又互补的一个概念。细化的实质就是分解。,85,(1)过程的抽象在软件工程中,从系统定义到实现,每进展一步都可以看做是对软件解决方法的抽象化过程的一次细化。
25、在软件需求分析阶段,用“问题所处环境的为大家所熟悉的术语”来描述软件的解决方法。在从概要设计到详细设计的过程中,抽象化的层次逐次降低。当产生源程序时到达最低抽象层次。,86,例:开发一个CAD软件的三层抽象,抽象层次.用问题所处环境的术语来描述这个软件:该软件包括一个计算机绘图界面,向绘图员显示图形,以及一个数字化仪界面,用以代替绘图板和丁字尺。所有直线、折线、矩形、圆及曲线的描画、所有的几何计算、所有的剖面图和辅助视图都可以用这个CAD软件实现。,87,抽象层次.任务需求的描述。CAD SOFTWARE TASKS user interaction task;2-D drawing crea
26、tion task;graphics display task;drawing file management task;end.在这个抽象层次上,未给出“怎样做”的信息,不能直接实现。,88,抽象层次.程序过程表示。以2-D(二维)绘图生成任务为例:PROCEDURE:2-D drawing creation REPEAT UNTIL(drawing creation task terminates)DO WHILE(digitizer interaction occurs)digitizer interface task;DETERMINE drawing request CASE;lin
27、e:line drawing task;rectangle:rectangle drawing task;circle:circle drawing task;,89,(2)数据抽象在不同层次上描述数据对象的细节,定义与该数据对象相关的操作。例如,在CAD软件中,定义一个叫做drawing的数据对象。可将drawing规定为一个抽象数据类型,定义它的内部细节为:,90,TYPE drawing IS STRUCTURE DEFIND number IS STRING LENGTH(12);geometry DEFIND notes IS STRING LENGTH(256);BOM DEFIN
28、D END drawing TYPE;,91,数据抽象drawing本身由另外一些数据抽象,如geometry、BOM(bill of materials)构成定义drawing的抽象数据类型之后,可引用它来定义其它数据对象,而不必涉及drawing的内部细节例如,定义:blue-print IS INSTANCE OF drawing;或 schematic IS INSTANCE OF drawing;,92,信息隐蔽,由 parnas 方法提倡(1972年)的信息隐蔽是指,每个模块的实现细节对于其它模块来说是隐蔽的。也就是说,模块中所包含的信息(包括数据和过程)不允许其它不需要这些信息的
29、模块使用。,93,信息隐蔽的目的,是为了提高模块的独立性,当修改或维护模块时减少把一个模块的错误扩散到其他模块中去的机会。如一下设计方法:“数据封装(Data Encapsulation)”:是指在一个模块中包含一个数据结构和在此数据结构上执行的操作。“抽象数据类型(Abstract Datatype)”:指一种数据类型,其中可包含在该类型的实例上执行的操作。,94,局部化,把一些关系密切的软件元素物理地放的彼此靠近,更有助于实现信息隐蔽。比如:在模块中使用局部数据元素局部化有助于实现信息隐蔽。,95,结构化设计方法(Structured Design简称SD),作为面向数据流的设计方法,SD
30、方法的中心任务就是把DFD图表示的系统分析模型方便的转换为软件结构的设计模型。它所提供的方法和原则,主要是为了确定软件的体系结构与接口。SC图(Structure Chart,结构图)作为描述工具,描述软件的总体结构。,96,首先研究、分析和审查数据流图。从软件的需求规格说明中弄清数据流加工的过程,对于发现的问题及时解决。然后根据数据流图决定问题的类型。数据处理问题典型的类型有两种:变换型和事务型。针对两种不同的类型分别进行分析处理。,97,由数据流图推导出系统的初始结构图。利用一些启发式原则来改进系统的初始结构图,直到得到符合要求的结构图为止。修改和补充数据词典。制定测试计划。,98,在系统
31、结构图中的模块,传入模块 从下属模块取得数据,经过某些处理,再将其传送给上级模块。它传送的数据流叫做逻辑输入数据流。,99,传出模块 从上级模块获得数据,进行某些处理,再将其传送给下属模块。它传送的数据流叫做逻辑输出数据流。,100,变换模块 它从上级模块取得数据,进行特定的处理,转换成其它形式,再传送回上级模块。它加工的数据流叫做变换数据流。协调模块 对所有下属模块进行协调和管理的模块。,101,在设计开始之前,首先要分清楚DFD图所显示的系统特征。在DFD图所代表的SA模型中,所有系统均可纳入两种典型的形式:变换型结构事务性结构,102,变换流,信息沿输入通路进入系统,同时由外部形式变换成
32、内部形式,进入系统的信息通过变换中心,经过加工处理以后再沿输出通路变换成外部形式离开软件系统。当数据流具有这些特征时,这种信息流称为变换流。,103,变换型系统结构图,变换型数据处理问题的工作过程大致分为三步,即取得数据,变换数据和给出数据。,104,相应于取得数据、变换数据、给出数据,变换型系统结构图由传入路径(Afferent Path)、变换中心(Transform Center)和传出路径(Efferent Path)三部分组成。,105,106,事务流,数据沿输入通路到达一个处理T,这个处理根据输入数据的类型在若干个动作序列中选出一个来执行。这种“以事务为中心的”的数据流,称为“事务
33、流”。,处理T称为事务中心,完成以下任务:接收输入数据;分析每个事务以确定它的类型;根据事务类型选取一条活动通路。,107,事务型结构由至少一条接受路径(Reception Path),一个事务中心(Transaction Cent),与若干条动作路径(Action Path)组成。特征:具有在多种事务中执行某类事务的能力。注:在一个大型系统的DFD图中,变换型和事务型两类结构往往同时存在。(如:系统的总体结构是事务型的,但在它的某(几)条动作路径中,很可能出现变换结构),108,事务型系统结构图,它接受一项事务,根据事务处理的特点和性质,选择分派一个适当的处理单元,然后给出结果。在事务型系统
34、结构图中,事务中心模块按所接受的事务的类型,选择某一事务处理模块执行。各事务处理模块并列。每个事务处理模块可能要调用若干个操作模块,而操作模块又可能调用若干个细节模块。,109,110,变换分析,变换分析方法由以下四步组成:重画数据流图;区分有效(逻辑)输入、有效(逻辑)输出和中心变换部分;进行一级分解,设计上层模块;进行二级分解,设计输入、输出和中心变换部分的中、下层模块。,111,112,在选择模块设计的次序时,必须对一个模块的全部直接下属模块都设计完成 之后,才 能转向另 一个模块 的下层模 块的设计。,113,在设计下层模块时,应考虑模块的耦合和内聚问题,以提高初始结构图的质量。使用“
35、黑箱”技术:在设计当前模块时,先把这个模块的所有下层模块定义成“黑箱”,在设计中利用它们时,暂时不考虑其内部结构和实现。在这一步定义好的“黑箱”,在下一步就可以对它们进行设计和加工。这样,又会导致更多的“黑箱”。最后,全部“黑箱”的内容和结构应完全被确定。,114,在模块划分时,一个模块的直接下属模块一般在5个左右。如果直接下属模块超过10个,可设立中间层次。如果出现了以下情况,就停止模块的功能分解:当模块不能再细分为明显的子任务时;当分解成用户提供的模块或程序库的子程序时;当模块的界面是输入输出设备传送的信息时;当模块不宜再分解得过小时。,115,事务分析,在很多软件应用中,存在某种作业数据
36、流,它可以引发一个或多个处理,这些处理能够完成该作业要求的功能。这种数据流就叫做事务。与变换分析一样,事务分析也是从分析数据流图开始,自顶向下,逐步分解,建立系统到结构图。,116,117,事务分析过程,识别事务源利用数据流图和数据词典,从问题定义和需求分析的结果中,找出各种需要处理的事务。通常,事务来自物理输入装置。有时,设计人员还必须区别系统的输入、中心加工和输出中产生的事务。,118,规定适当的事务型结构在确定了该数据流图具有事务型特征之后,根据模块划分理论,建立适当的事务型结构。识别各种事务和它们定义的操作。从问题定义和需求分析中找出的事务及其操作所必需的全部信息,对于系统内部产生的事
37、务,必须仔细地定义它们的操作。,119,注意利用公用模块在事务分析的过程中,如果不同事务的一些中间模块可由具有类似的语法和语义的若干个低层模块组成,则可以把这些低层模块构造成公用模块。对每一事务,或对联系密切的一组事务,建立一个事务处理模块;如果发现在系统中有类似的事务,可以把它们组成一个事务处理模块。,120,对事务处理模块规定它们全部的下层操作模块 对操作模块规定它们的全部细节模块变换分析是软件系统结构设计的主要方法。一般,一个大型的软件系统是变换型结构和事务型结构的混合结构。所以,我们通常利用以变换分析为主,事务分析为辅的方式进行软件结构设计。,121,122,软件模块结构的改进,模块功
38、能的完善化一个完整的模块应当有以下几部分:执行规定的功能的部分;出错处理的部分。当模块不能完成规定的功能时,必须回送出错标志,出现例外情况的原因。如果需要返回数据给它的调用者,在完成数据加工或结束时,应当给它的调用者返回一个状态码。,123,消除重复功能,改善软件结构 完全相似:在结构上完全相似,可能只是在数据类型上不一致。此时可以采取完全合并的方法。局部相似:找出其相同部分,分离出去,重新定义成一个独立的下一层模块。还可以与它的上级模块合并。,124,125,模块的作用范围应在控制范围之内模块的控制范围包括它本身及其所有的从属模块。模块的作用范围是指模块内一个判定的作用范围,凡是受这个判定影
39、响的所有模块都属于这个判定的作用范围。如果一个判定的作用范围包含在这个判定所在模块的控制范围之内,则这种结构是简单的,否则,它的结构是不简单的。,126,127,尽可能减少高扇出结构,随着深度增大扇入。如果一个模块的扇出数过大,就意味着该模块过分复杂,需要协调和控制过多的下属模块。应当适当增加中间层次的控制模块。,128,避免或减少使用病态联接应限制使用如下三种病态联接:直接病态联接 即模块A直接从模块B内部取出某些数据,或者把某些数据直接送到模块B内部。,129,公共数据域病态联接 模块A和模块B通过公共数据域,直接传送或接受数据,而不是通过它们的上级模块。这种方式将使得模块间的耦合程度剧增
40、。它不仅影响模块和模块,而且影响与公共数据域有关联的所有模块。,130,通信模块联接 即模块A和模块B通过通信模块TABLEIT传送数据。从表面看,这不是病态联接,因为模块和模块B都未涉及通信模块TABLEIT 的内部。然而,它们之间的通信(即数据传送)没有通过它们的上级模块。从这个意义上讲,这种联接是病态的。,131,模块的大小要适中模块的大小,可以用模块中所含语句的数量的多少来衡量。把模块的大小限制在一定的范围之内。通常规定其语句行数在50100左右,保持在一页纸之内,最多不超过500行。,132,设计功能可预测的模块,但要避免过分受限制的模块 一个功能可预测的模块,不论内部处理细节如何,
41、但对相同的输入数据,总能产生同样的结果。但是,如果模块内部蕴藏有一些特殊的鲜为人知的功能时,这个模块就可能是不可预测的。对于这种模块,如果调用者不小心使用,其结果将不可预测。,133,134,如果一个模块的局部数据结构的大小、控制流的选择或者与外界(人、硬软件)的接口模式被限制死了,则很难适应用户新的要求或环境的变更。为了能够适应将来的变更,软件模块中局部数据结构的大小应当是可控制的,控制流的选择对于调用者来说,应当是可预测的。而与外界的接口应当是灵活的。,135,软件包应满足设计约束和可移植性为了使得软件包可以在某些特定的环境下能够安装和运行,对软件包提出了一些设计约束和可移植的要求。例如,
42、设计约束有时要求一个程序段在存储器中覆盖自身。当这种情况出现时,设计出来的软件程序结构不得不根据重复程度、访问频率、调用间隔等等特性,重新加以组织。,136,设计的后处理,为每一个模块写一份处理说明为每一个模块提供一份接口说明确定全局数据结构和局部数据结构指出所有的设计约束和限制进行概要设计的评审进行设计的优化(如果需要和可能的话),137,数据设计及文件设计,数据设计的原则文件设计,138,数据设计的原则,R.S.Pressman数据设计的过程 为在需求分析阶段所确定的数据对象选择逻辑表示,需要对不同结构进行算法分析,以便选择一个最有效的结构;设计对于这种逻辑数据结构的一组操作,以实现各种所
43、期望的运算。,139,确定对逻辑数据结构所必需的那些操作的程序模块(软件包),以便限制或确定各个数据设计决策的影响范围。Pressman提出了一组原则,用来定义和设计数据。实际上,在进行需求分析时往往就开始了数据设计。,140,1.用于软件的系统化方法也适用于数据。在导出、评审和定义软件的需求和软件系统结构时,必须定义和评审其中所用到的数据流、数据对象及数据结构的表示。应当考虑几种不同的数据组织方案,还应当分析数据设计给软件设计带来的影响。,141,2.确定所有的数据结构和在每种数据结构上施加的操作。设计有效的数据结构,必须考虑到要对该数据结构进行的各种操作。3.应当建立一个数据词典并用它来定
44、义数据和软件的设计。数据词典清楚地说明了各个数据之间的关系和对数据结构内各个数据元素的约束。,142,4.低层数据设计的决策应推迟到设计过程的后期进行。在进行需求分析时确定的总体数据组织,应在概要设计阶段加以细化,在详细设计阶段才规定具体的细节。5.数据结构的表示只限于那些必须直接使用该数据结构内数据的模块才能知道。此原则就是信息隐蔽和与此相关的耦合性原则。,143,6.应当建立一个存放有效数据结构及相关操作的库。数据结构应当设计成为可复用的。建立一个存有各种可复用的数据结构模型的部件库。7.软件设计和程序设计语言应当支持抽象数据类型的定义和实现。以上原则适用于软件工程的定义阶段和开发阶段。“
45、清晰的信息定义是软件开发成功的关键”。,144,文件设计,文件设计的过程,主要分两个阶段。第一个阶段是文件的逻辑设计,主要在概要设计阶段实施。,145,(1)整理必须的数据元素:在软件设计中所使用的数据,有长期的,有短期的,还有临时的。它们都可以存放在文件中,在需要时对它们进行访问。因此首先必须整理应存储的数据元素,给它们一个易于理解的名字,指明其类型和位数,以及其内容涵义。,146,(2)分析数据间的关系:分析在业务处理中哪些数据元素是同时使用的。把同时使用次数多的数据元素归纳成一个文件进行管理。分析数据元素的内容,研究数据元素与数据元素之间的逻辑关系,根据分析,弄清数据元素的含义及其属性。
46、,147,(3)确定文件的逻辑设计:根据数据关联性分析,明确哪些数据元素应当归于一组进行管理,把应当归于一组的数据元素进行统一布局,产生文件的逻辑设计。应用关系模型设计文件的逻辑结构时,必须使其达到第三范式(3NF),以减少数据的冗余,提高存取的效率。,148,顾客文件 商品文件,X:英文字母数字;K:汉字;N:数字,149,第二个阶段是文件的物理设计,主要在软件的详细设计阶段实施(4)理解文件的特性:对于文件的逻辑规格说明,研究从业务处理的观点来看所要求的一些特性,包括文件的使用率、追加率和删除率,以及保护和保密等。考虑需要采用什么文件组织形式。,150,(5)确定文件的组织方式 一般要根据
47、文件的特性,来确定文件的组织方式。顺序文件:连续文件串联文件。直接存取文件:无关键字直接存取文件带关键字直接存取文件桶式直接存取文件。,151,索引顺序文件:其基本数据记录按顺序文件组织,记录排列顺序必须按关键字值升序或降序安排,且具有索引部分,也按同一关键字进行索引。分区文件:这类文件主要用于存放程序。它由若干称为成员的顺序组织的记录组和索引组成。,152,虚拟存储文件:这是基于操作系统的请求页式存储管理功能而建立的索引顺序文件。倒排文件:按候选属性建立索引表。,153,(6)确定文件的存储介质;(7)确定文件的记录格式;确定文件记录中各数据项以及它们在记录中的物理安排。记录的长度:设计记录
48、的长度要确保能满足需要,还要考虑使用设备的制约和效率,尽可能与读写单位匹配,并尽可能减少处理过程中内外存的交换次数。,154,数据项的顺序:对于可变长记录,应在记录的开头记入长度信息;对于关键字项,应尽量按级别高低,顺序配置;联系较密切的数据项,应归纳在一起进行配置。数据项的属性:属性相同的数据项,应尽量归纳在一起配置;数据项应按双字长,全字长,半字长和字节的属性,顺序配置。,155,预留空间:考虑到将来可能的变更或扩充,应当预先留一些空闲空间。不必统一地预留,可在有可能变更或扩充的项旁边,在相邻接处预留。(8)估算存取时间和存储容量。,156,第五章 详细设计,从软件开发的工程化观点来看,在
49、使用程序设计语言编制程序以前,需要对所采用算法的逻辑关系进行分析,设计出全部必要的过程细节,并给予清晰的表达。这就是详细设计的任务。,157,基本任务回答的关键问题:“怎样具体地实现这个系统”主要任务是设计出程序的“蓝图”,供程序员日后根据这个蓝图编写出实际的程序代码。注意:设计程序的蓝图,不是具体地编写程序。设计程序主要采用结构化的程序设计方法。,158,什么是结构程序设计结构程序设计是一种设计程序的技术,它采用自顶向下逐步求精的设计方法和单入口单出口的控制结构。*只使用三种基本的控制结构*单入口单出口的控制结构,结构程序设计,经典的结构程序设计:顺序,选择,当型循环扩展的结构程序设计:顺序
50、,选择+多分支,当型循环+直到型循环修正的结构程序设计:顺序,选择+多分支,当型循环+直到型循环,break结构,160,结构程序设计的优点显著提高软件开发工程的成功率和生产率;程序具有清晰的层次结构,容易阅读和理解;程序的静态结构和动态结构较一致,程序容易读和理解,开发较易保证程序的正确性;控制结构有确定的逻辑模式,编写程序代码简单源程序清晰流畅,易读易懂易测试;可以重用的代码量最大;程序的逻辑结构清晰,有利于程序正确性证明。结构程序设计的缺点存贮容量和运行时间较大(增加10%-20%)。,161,逐步求精的含义总体设计阶段逐步求精的含义:把一个复杂问题的解法分解和细化成一个由许多模块组成的