第四章 软件概要设计.docx
- 文档编号:9251079
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:32
- 大小:345.36KB
第四章 软件概要设计.docx
《第四章 软件概要设计.docx》由会员分享,可在线阅读,更多相关《第四章 软件概要设计.docx(32页珍藏版)》请在冰豆网上搜索。
第四章软件概要设计
第四章软件概要设计
在软件需求分析阶段,已经搞清楚了软件“做什么”的问题,并把这些需求通过规格说明书描述了出来,这也是目标系统的逻辑模型。
进入了设计阶段,要把软件“做什么”的逻辑模型变换为“怎么做”的物理模型,即着手实现软件的需求,并将设计的结果反映在“设计规格说明书”文档中,所以软件设计是一个把软件需求转换为软件表示的过程,而概要设计(又称结构设计)就是软件设计最初形成的一个表示(这里的表示是一个名词),它描述了软件的总的体系结构。
简单地说软件概要设计就是设计出软件的总体结构框架。
而后对结构的进一步细化的设计就是软件的详细设计或过程设计。
本章所学内容主要就是软件的概要设计内容。
4.1软件概要设计的基本任务
4.1.1基本任务
1.设计软件系统结构(简称软件结构)
为了实现目标系统,最终必须设计出组成这个系统的所有程序和数据库(文件),对于程序,则首先进行结构设计,具体为:
(1)采用某种设计方法,将一个复杂的系统按功能划分成模块。
(2)确定每个模块的功能。
(3)确定模块之间的调用关系。
(4)确定模块之间的接口,即模块之间传递的信息。
(5)评价模块结构的质量。
根据以上内容,软件结构的设计是以模块为基础的,在需求分析阶段,已经把系统分成层次结构。
设计阶段,以需求分析的结果为依据,从实现的角度进一步划分为模块,并组成模块的层次结构。
软件结构的设计是概要设计关键的一步,直接影响到下一阶段详细设计与编码的工作软件系统的质量及一些整体特性都在软件结构的设计中决定。
2.数据结构及数据库设计
对于大型数据处理的软件系统,除了控制结构的模块设计外,数据结构与数据库设计也是很重要的。
(1)数据结构的设计
逐步细化的方法也适用于数据结构的设计。
在需求分析阶段,已通过数据字典对数据的组成、操作约束、数据之间的关系等方面进行了描述,确定了数据的结构特性,在概要设计阶段要加以细化,详细设计阶段则规定具体的实现细节。
在概要设计阶段,宜使用抽象的数据类型。
(2)数据库的设计
数据库的设计指数据存储文件的设计,主要进行以下几方面设计:
①概念设计。
在数据分析的基础上,采用自底向上的方法从用户角度进行视图设计,一般用ER模型来表示数据模型,这是一个概念模型。
②逻辑设计。
ER模型或IDEFlx模型是独立于数据库管理系统(DBMS)的,要结合具体的DBMS特征来建立数据库的逻辑结构,对于关系型的DBMS来说将概念结构转换为数据模式、子模式并进行规范,要给出数据结构的定义,即定义所含的数据项、类型、长度及它们之间的层次或相互关系的表格等等。
③物理设计。
对于不同的DBMS,物理环境不同,提供的存储结构与存取方法各不相同。
物理设计就是设计数据模式的一些物理细节,如数据项存储要求、存取方式、索引的建立。
3.编写概要设计文档
在概要设计阶段,还要编写概要设计文档,我们初学者有一个不是很好的做法,就是在编程序时,往往不注意文档的编写,导致以后软件修改和升级很不方便,用户使用时也得不到帮助。
所以应该在软件设计的每个阶段编写相应文档,在概要设计阶段,主要有以下文档需要编写:
(1)概要设计说明书。
(2)数据库设计说明书,主要给出所使用的DBMS简介、数据库的概念模型、逻辑设计、结果。
(3)用户手册,对需求分析阶段编写的用户手册进行补充。
(4)修订测试计划,对测试策略、方法、步骤提出明确要求。
4.评审
对设计部分是否完整地实现了需求中规定的功能、性能等要求,设计方案的可行性,关键的处理及内外部接口定义正确性、有效性,各部分之间的一致性等等都一一进行评审。
以上就是软件概要设计的四个基本任务,总结一下用八个字表示:
两类结构文档评审。
(两类结构就是指软件结构和数据结构及数据库设计)
4.1.2软件概要设计说明书的主要内容
概要设计说明书是概要设计阶段结束时提交的技术文档,按国标GB8576-88的“计算机软件产品开发文件编制指南”规定,软件设计文档可分为“概要设计说明书”、“详细设计说明书”、“数据库设计说明书”。
4.2软件设计的基本原理
软件设计中最重要的一个问题就是软件质量问题,用什么标准对软件设计的技术进行衡量呢?
本节介绍几种基本原理。
4.2.1模块化
何为模块?
模块就是指在程序中的数据说明、可执行语句等程序对象的集合,或者是单独命名和编址的元素。
如高级语言中的过程、函数、子程序等等。
模块是可组合、分解和更新的单元。
模块有以下基本属性:
接口:
指模块的输入与输出。
功能:
指模块实现什么功能。
逻辑:
描述内部如何实现要求的功能及所需的数据。
状态:
该模块的运行环境,即模块的调用与被调用关系。
功能、状态与接口反映模块的外在特性,逻辑反映它的内在特性。
模块化是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。
模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能。
设问题x,表示它的复杂性函数为C(x),解决它所需的工作量函数为E(x)。
对于问题P1和P2,如果C(P1)>C(P2)即Pl比P2复杂,那么E(P1)>E(P2)即问题越复杂,所需要的工作量越大。
根据解决一般问题的经验,规律是:
C(P1十P2)>C(P1)十C(P2)
即一个问题由两个问题组合而成的复杂度大于分别考虑每个问题的复杂度之和。
这样可以推出:
E(Pl十P2)>E(P1)十E(P2)
由此可知,开发一个大而复杂的软件系统,将它进行适当的分解,不但可降低其复杂性,还可减少开发工作量,从而降低开发成本,提高软件生产率,但是模块划分越多,块内的工作量减少,模块之间接口的工作量增加了,如图4—l所示。
因此在划分模块时,应减少接口的代价,提高模块的独立性。
4.2.2抽象
抽象是认识复杂现象过程中使用的思维工具,即抽出事物本质的共同性而暂不考虑它的细节,不考虑其他因素。
抽象的概念被广泛应用于计算机软件领域,在软件工程学中更是如此。
软件工程过程中的每一步都可以看作是对软件解决方法的抽象层次的一次细化。
4.2.3信息隐蔽
通过抽象,可以确定组成软件的过程实体。
通过信息隐蔽,可以定义和实现对模块的过程细节和局数据结构的存取限制。
信息隐蔽指在设计和确定模块时,使得一个模块内包含的信息(过程或数据),对于不需要这些信息的其他模块来说,是不能访问的。
举个例子吧,假设我是程序中的一个模块,电话机是另一个模块,我在使用电话机时,对电话机的控制是通过几个按键来确定的,输入的数据是我的语音,输出的数据是对方的语音,而这些输入、输出的数据变换以及控制在电话机内部是怎么实现的我不需要知道,同时也不能加以直接控制,这样,如果电话机坏了,修复或更换后对我的使用是没有任何影响的。
所以说,电话机这个模块的信息隐蔽是十分完善的。
在软件设计中,模块的划分也要采取措施使它实现信息隐蔽。
4.2.4模块独立性
为了降低软件系统的复杂性,提高可理解性、可维护性,必须把系统划分成为多个模块,模块不能任意划分,应尽量保持其独立性。
模块独立性指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。
如何衡量软件的独立性呢?
根据模块的外部特征和内部特征,提出了两个定性的度量标准--耦合性和内聚性。
1.耦合性
也称快间联系,指软件系统结构中各模块间相互联系紧密程度的一种度量。
模块之间系越紧密,其耦合性就越强,模块的独立性则越差。
模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。
模块的耦合性有以下几种类型,分为:
(假设人为一模块)
(1)无直接耦合
指两个模块之间没有直接的关系,它们分别从属于不同模块的控制与调用,它们之间不传递任何信息。
因此模块间耦合性最弱,模块独立性最高。
(比如陌生人之间的联系)
(2)数据耦合
指两个模块之间有调用关系,传递的是简单的数据值,相当于高级语言中的值传递。
(比如售货员与顾客之间的联系)
(3)标记耦合
指两个模块传递的是数据结构,如:
高级语言中的数组名、记录名、文件名等这些名字即为标记,其实传递的是这个数据结构的地址。
(比如两个人下棋)
(4)控制耦合
指一个模块调用另一个模块时,传递的是控制变量(如开关、标志等),被调模块通过该控制变量的值有选择地执行块内某些功能。
(领导和下属之间的联系)
(5)公共耦合
指通过一个公共数据环境相互作用的那些模块间的耦合。
公共数据环境可以是全程变量或数据结构、共享的通信区、内存的公共覆盖区及任何存储介质上的文件、物理设备等。
(比如图书馆的所有借书者之间的联系)
(6)内容耦合
这是最高程度的耦合,也是最差的耦合。
当一个模块直接使用另一个模块的内部数据,或通过非正常入口而转入另一个模块内部,这种模块之间的耦合为内容耦合,这种情况往往出现在汇编程序设计中。
(比如小两口之间的联系)
在软件设计中,提高模块的独立性,建立模块间尽可能松散的系统,是模块化设计的目标。
为了降低模块间的耦合度,可以采取以下措施:
(1)在耦合方式上降低模块间接口的复杂性。
(2)在传递信息类型上尽量采用数据耦合,避免使用控制耦合,慎用或有控制地使用公共耦合。
在实践中要根据实际情况综合考虑。
2内聚性
又称块内联系,指模块内部各个元素彼此结合的紧密程度。
若一个模块内各元素(语句之间、程序段之间)联系的越紧密,则它的内聚性就越高,内聚性有以下几种类型:
(1)偶然内聚
指一个模块内的各处理元素之间没有任何联系。
(如公共汽车内的人群)
(2)逻辑内聚
指模块内执行几个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。
(如警察局里的警察)
(3)时间内聚
把需要同时执行的动作组合在一起形成的模块为时间内聚模块。
(如交响乐团的演奏员)
(4)通信内聚
指模块内所有处理元素都在同一个数据结构上操作(有时称之为信息内聚),或者指各处理使用相同的输人数据或者产生相同的输出数据。
(如建筑工地上的工人)
(5)顺序内聚
指一个模块中各个处理元素都密切相关于同一功能且必须顺序执行,前一功能元素的输出就是下一功能元素的输入。
(我们可以想像纺织厂中从纺纱到织布的各个操作形成的一个模块,就是一种顺序内聚)
(6)功能内聚
这是最强的内聚;指模块内所有元素共同完成一个功能,缺一不可。
(就如两个人演狮子舞,要完成狮子形象的再现,两个人缺一不可.)
耦合性与内聚性是模块独立性的两个定性标准,将软件系统划分模块时,尽量做到高内聚低耦合,提高模块的独立性,为设计高质量的软件结构奠定基础。
在内聚性与耦合性发生矛盾的时候,最好优先考虑耦合性,也就是先保证耦合性低一些。
4.3软件结构优化准则
4.3.1软件结构图
软件结构图是系统的模块层次结构,反映了整个系统的功能实现,即将来程序的控制层次体系。
对于一个“问题”,可用不同的软件结构来解决,不同的设计方法和不同的划分和组织,得出不同的软件结构。
结构图的主要内容是:
(1)模块:
模块用方框表示,并用名字标识该模块,名字应体现该模块的功能。
(2)模块的控制关系:
两个模块间用单向箭头(或直线)连接表示它们的控制关系,如图4-2
(3)模块间的信息传递:
模块问还经常用带注释的短箭头表示模块调用过程中来回传递的信息。
有时箭头尾部带空心圆的表示传递的是数据,带实心圆的表示传递的是控制信息,如图4-2
(4)两个附加符号:
表示模块有选择地调用或循环调用。
如图4-3
(5)结构图的形态特征:
①深度:
指结构图控制的层次,也是模块的层数,如图4—4,结构图的深度为5。
②宽度:
指一层中最大的模块个数,如图4—4宽度为8。
③扇出:
指一个模块直接下属模块的个数,如图4—4,模块M的扇出为3。
④扇入:
指一个模块直接上属模块的个数,如图4—4,模块T的扇人为4。
(6)画结构图应注意的事项
①同名字的模块在结构图中仅出现一次。
②调用关系只能从上到下。
③不严格表示模块的调用次序,习惯上从左到右。
有时为了减少连线的交叉,适当地调整同一层模块左右位置,以保持结构图的清晰性。
4.3.2软件结构设计优化准则
(1)划分模块时,尽量做到高内聚,低耦合,保持模块相对独立性,并以此原则优化初始的软件结构。
(2)一个模块的作用范围应在其控制范围之内,且判定所在的模块应与其影响的模块在层次上尽量靠近。
一个模块的作用范围指该模块内一个判定影响的所有模块的集合。
一个模块的控制范围是指模块本身以及其所有下属模块(直接或间接从属于它的模块)的集合。
(3)软件结构的深度、宽度、扇入、扇出应适当。
(4)模块的大小应适中。
(5)模块的接口要简单、清晰、含义明确,便于理解,易于实现、测试与维护。
图4-5 模块的判定作用范围
4.4面向数据流的设计方法(这是需要我们熟练掌握的方法)
面向数据流的设计是以需求分析阶段产生的数据流图为基础,按一定的步骤映射成软件结构,因此“又称结构化设计(StructuredDesign,简称SD)。
该方法由美国IBM公司L.Constantine和E.Yourdon等人于1974年提出,与结构化分析(SA)衔接,构成了完整的结构化分析与设计技术,是目前使用最广泛的软件设计方法之一。
4.4.1数据流的类型
要把数据流图(DFD)转化为软件结构,首先必须研究DFD的类型。
各种软件系统,不论DFD如何庞大和复杂,一般可分为变换型和事务型。
1变换型数据流图
变换型的DFD是由输入、变换和输出组成,如图4-6
变换型数据处理的工作过程一般分为三步:
取得数据、变换数据和给出数据,这三步体现了变换型DFD的基本思想。
变换是系统的主加工,变换输入端的数据流为系统的逻辑输入,输出端为逻辑输出。
2事务型的数据流图
若某个加工将它的输入流分离成许多发散的数据流,形成许多加工路径,并根据输入的值选择其中一条路径来执行,这种特征的DFD称为事务型的数据流图,这个加工称为事务处理中心。
举个例子,好比有一个邮件分发中心,把收进的邮件根据其发送地址进行分流,有的用飞机邮送,有的用汽车来运输等等。
如图4-7
在大型软件系统中的DFD数据流图中,这两种类型特征都有可能存在。
4.4.2设计过程
面向数据流设计方法的过程如下:
(1)精化DFD。
指把DFD转换成软件结构图前,设计人员要仔细地研究分析DFD并参照数据字典,认真理解其中的有关元素,检查有无遗漏或不合理之处,进行必要的修改。
(2)确定DFD类型,如果是变换型,确定变换中心和逻辑输入、逻辑输出的界线,映射为变换结构的顶层和第一层;如果是事务型,确定事务中心和加工路径,映射为事务结构的顶层和第一层。
(3)分解上层模块,设计中下层模块结构。
(4)根据优化准则对软件结构求精。
(5)描述模块功能、接口及全局数据结构。
(6)复查,如果有错,转向
(2)修改完善,否则进入详细设计。
4.4.3变换分析设计
(1)确定DFD中的变换中心、逻辑输入和逻辑输出。
(2)设计软件结构的顶层和第一层——变换结构。
变换中心确定以后,就相当于决定了主模块的位置,这就是软件结构的顶层。
其主要功能是主要完成所有模块的控制,它的名字应该是系统名称,以体现完成整个系统的功能。
主要模块确定后,设计软件结构的第一层。
第一层一般至少有三种功能的模块:
输入、输出和变换模块。
(3)设计中、下层模块。
对第一层的输入、输出、变换模块自顶向下逐层分解。
①输入模块下属的设计。
输入模块的功能是向它的调用模块提供数据,所以必须有数据来源。
每个输入模块可以设计成两个下属模块:
一个接收,一个转换,用类似的方法一直分解下去,直到物理输入端。
②输出模块下属模块的设计。
输出模块的功能是将它的调用模块产生的数据送出。
这样每个输出模块可以设计成两个下属模块:
一个转换,一个发送,直到物理输出端。
③变换模块下属模块的设计。
④设计的优化。
以上步骤设计出的软件结构仅仅是初始结构,还必须根据设计准则对初始结构精细和改进。
以课本53页图4-8为例说明变换分析设计。
根据面向数据流的设计方法,第一步是精化DFD,也就是研究分析这个数据流图,我们可以看到图中从A到H的数据流向和加工,图形比较简单。
第二步是确定DFD类型并确定加工中心,在这里已经说明为本图为变换型,在实际分析中应该根据每个相关操作来确定其类型。
在图中,我们可以直观地看到中间几股数据流的汇合处是系统的变换中心。
也可以通过双向寻找法来确定,左边是物理输入端,从f1沿着单向路径一直到f3,后面的f4是从C流出的,同时C还有f5流出,则可见f4,f5不能再看作是系统的输入,因此可确定f4,f5前一个数据流f3就是系统的逻辑输入,同样,我们从右边的物理输出端往左边沿数据流的反向寻找,可以发现f4,f6不能看作是整个系统的输出,因此可以确定f7,f8是逻辑输出端,然后在这两个分界处添上虚线,这样,DFD的三部份就确定了。
第三步设计软件结构的顶层和第一层,根据变换中心可以对应得到主模块的位置,就可以画出顶层模块(即主模块,在实际应用中,这个模块的名字就是系统的名字,如销售管理系统等)。
然后在这个模块下方根据划分好的三个部分画出三个功能模块,即输入、变换和输出模块,就是图中的getf3,将f3变换成f7和f8模块,putf7及putf8模块,注意,这里应当为每个输入和输出设计一个模块。
然后将这些模块与顶层模块用连线连上表示所属控制。
画上相应的数据传送箭头。
第四步分解上层模块,设计中下层模块。
根据上面的方法,分解输入模块,图中的getf3模块的功能是向主模块提供数据,而在DFD中可以看到f3是数据流f2经过B操作后流出的,因此这里有两个部分,就是接收f2数据,再通过B转换流出。
所以在getf3模块下画出两个子模块getf2和B操作模块。
就这样一一分解,可以画出所有的输入和输出子模块,直到物理输入和输出为止。
对于变换中心的下属模块,根据数据流和变换操作,以每个基本加工建立一个功能模块,可以画出CDE三个子模块。
整个过程并不复杂,画好后根据实际情况对软件结构进行优化,也就是进行必要的合并或分解。
以求设计出高内聚低耦合的模块组成的、具有良好特性的软件结构。
4.4.4事务分析设计
对于具有事务型特征的DFD,则采用事务分析的设计方法。
如图4-8
(1)确定DFD中事务中心和加工路径。
(2)设计软件结构的顶层和第一层——事务结构。
①接收分支:
负责接收数据,它的设计与变换型DFD的输入部分设计方法相同。
②发送分支:
通常包含一个调度模块,它控制管理所有的下层的事务处理模块。
当事务类型不多时,调度模块可与主模块合并。
(3)事务结构中、下层模块的设计、优化等工作同变换结构。
4.4.5综合型数据流图与分层数据流图映射成软件结构的设计
有了上面的基础,对综合型的数据流图也可以一一分开来进行设计了。
4.4.6设计后的处理,在软件结构形成之后,我们知道,概要设计的基本任务还有文档的编写,在这个阶段就是要编写一些文档,包括:
(1)为每个模块写一份处理说明
(2)为每个模块提供一份接口说明
(3)数据结构说明
(4)给出设计约束或限制
(5)进行概要评审
(6)设计优化。
本节介绍的设计方法是本章的重点,要求熟练掌握。
4.4.7实例:
将3.3.3实例——销售管理系统的数据流图转化为软件结构
分析该系统的0层图,它有四个主要功能:
订货处理、进货处理、缺货处理和销售统计,这四个处理可平行工作,因此从整体上分析可按事务类型数据流图来设计,根据功能来选择四个处理中的一个。
4.5基于IDEF0图的设计方法
基于IDEF0图的设计也是结构化设计技术之一,它以系统的功能模型和信息结构为基础设计系统的软件结构。
由于IDEF0图自顶向下逐层对系统进行分解,并且对系统的每一功能的输入、输出、约束、机制都进行了全面的描述。
因此,在系统概要设计时,一般按照IDEF0图的分解层次,逐层将其转换成软件结构图。
对于某一层的IDEF0图按以下方法转换:
(1)找出该IDEF0图的父图,搞清父图、子图之间的输入输出、控制关系。
(2)以父图的活动为上层模块,子图中的活动为下层模块,画出系统的单层结构图。
(3)根据IDEF0图各个活动的输入、输出数据,控制信息及数据库的结构,数据项定义等,确定模块的接口。
(4)综合所有层次的结构图,得到系统初始的软件结构图。
(5)根据软件结构的优化准则进行精化。
4.6表示软件结构的另一种图形工具——HIPO图
HIPO图(HierarchyPlusInput/Processing/Output)图是美国IBM公司70年代发展起来的表示软件系统结构的工具。
它既可以描述软件总的模块层次结构--H图(层次图),又可以描述每个模块输入/输出数据、处理功能及模块调用的详细情况--IPO图。
HIPO图以模块分解的层次性以及模块内部输入、处理、输出三大基本部分为基础建立的。
它是表示软件系统结构的工具。
HIPO图以模块分解的层次性以及模块内部输入、处理、输出三大基本部分为基础建立的。
1.HIPO图的H图
用于描述软件的层次结构,矩形框表示一个模块,矩形框之间的直线表示模块之间的调用关系,同结构图一样未指明调用顺序。
如图4-10为销售管理系统的层次图。
2.IPO图
H图只说明了软件系统由那些模块组成及其控制层次结构,并未说明模块间的信息传递及模块内部的处理。
因此对一些重要模块还必须根据数据流图、数据字典及H图绘制具体的IPO图,如图4-11
系统名称:
销售管理系统
设计人:
模块名:
确定能否订货
日期
模块编号:
上层调用模块:
订货处理
文件名:
库存文件
下层被调用模块:
可供货处理
缺货订单留底
输入数据:
订单订货量X
相应货物库存量Y
输出数据:
处理:
IFY-X>0THEN(调用“可供货处理”)
ELSE(调用“”缺货订单留底)
ENDIF
注释:
图4-11 确定能否供货模块的IPO图
第4章例题分析与解答
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第四章 软件概要设计 第四 软件 概要 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)