软件工程与开发技术(西电第二版)第4章-结构化软件设计课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《软件工程与开发技术(西电第二版)第4章-结构化软件设计课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件工程 开发 技术 第二 结构 软件设计 课件
- 资源描述:
-
1、第4章 软件设计 第4章 结构化软件设计 4.1 软件设计中的基本概念和原理软件设计中的基本概念和原理4.2 体系结构设计概述体系结构设计概述 4.3 面向数据流的体系结构设计方法面向数据流的体系结构设计方法 4.4 详细设计概述详细设计概述 4.5 面向数据流的详细设计方法面向数据流的详细设计方法4.6 面向数据结构的设计方法面向数据结构的设计方法4.7 小结小结 第4章 软件设计 4.1 4.1 软件设计中的基本概念和原理软件设计中的基本概念和原理 1.1.模块化模块化 所谓模块,是指具有相对独立性的,由数据说明、执行语句等程序对象构成的集合。程序中的每个模块都需要单独命名,通过名字可实现
2、对指定模块的访问。在高级语言中,模块具体表现为函数、子程序、过程等。一个模块具有输入/输出(接口)、功能、内部数据和程序代码四个特征。输入/输出用于实现模块与其他模块间的数据传送,即向模块传入所需的原始数据及从模块传出得到的结果数据。功能指模块所完成的工作。模块的输入/输出和功能构成了模块的外部特征。内部数据是指仅能在模块内部使用的局部量。程序代码用于描述实现模块功能的具体方法和步骤。模块的内部数据和程序代码反映的是模块的内部特征。第4章 软件设计 模块化是指将整个程序划分为若干个模块,每个模块用于实现一个特定的功能。划分模块对于解决大型复杂的问题是非常必要的,可以大大降低解决问题的难度。为了
3、说明这一点,我们可对问题复杂性、开发工作量和模块数之间的关系进行以下推理。首先,我们设C(x)为问题x所对应的复杂度函数,E(x)为解决问题x所需要的工作量函数。对于两个问题P1和P2,如果:C(P1)C(P2)即问题P1的复杂度比P2高,则显然有:E(P1)E(P2)即解决问题P1比P2所需的工作量大。第4章 软件设计 在人们解决问题的过程中,发现存在有另一个有趣的规律:C(P1+P2)C(P1)+C(P2)即解决由多个问题复合而成的大问题的复杂度大于单独解决各个问题的复杂度之和。也就是说,对于一个复杂问题,将其分解成多个小问题分别解决比较容易。由此我们可以推出:E(P1+P2)E(P1)+
4、E(P2)即将复杂问题分解成若干个小问题,各个击破,所需要的工作量小于直接解决复杂问题所需的工作量。第4章 软件设计 根据上面的推理,我们可以得到这样一个结论,模块化可以降低解决问题的复杂度,从而降低软件开发的工作量。但是不是模块划分得越多越好呢?虽然增加程序中的模块数可以降低开发每个模块的工作量,但同时却增加了设计模块接口的工作量。通过图5.1所示的模块数与软件开发成本的关系图中可以看出,当划分的模块数处于最小成本区时,开发软件的总成本最低。虽然目前还不能得到模块数M的精确取值,但总成本曲线对我们进行模块划分具有重要的指导意义。模块化不但可以降低软件开发的难度,而且可以使程序结构清晰,增加易
5、读性和易修改性。此外,模块化还有利于提高代码的可重用性及团队合作开发大型软件的可行性。第4章 软件设计 图4.1 模块数与软件开发成本第4章 软件设计 2.抽象抽象抽象是人类在解决复杂问题时经常采用的一种思维方式,它是指将现实世界中具有共性的一类事物的相似的、本质的方面集中概括起来,而暂时忽略它们之间的细节差异。在软件开发中运用抽象的概念,可以将复杂问题的求解过程分层,在不同的抽象层上实现难度的分解。在抽象级别较高的层次上,可以将琐碎的、细节的信息暂时隐藏起来,以利于解决系统中的全局性的问题。软件开发过程中从问题定义到最终的软件生成,每一阶段都是在前一阶段基础上对软件解法的抽象层上的一次求精和
6、细化。第4章 软件设计 结构化程序中自顶向下、逐步求精的模块划分思想正是人类思维中运用抽象方法解决复杂问题的体现。软件结构中顶层的模块抽象级别最高,控制并协调软件的主要功能且影响全局;软件结构中底层的模块抽象级别最低,具体实现数据的处理过程。采用自顶向下、由抽象到具体的思维方式,不但降低了软件开发中每个阶段的工作难度,简化了软件的设计和实现过程,而且还有助于提高软件的可读性、可测试性和可维护性。此外,在程序设计中运用抽象的方法还能够提高代码的可重用性。第4章 软件设计 3.信息隐蔽信息隐蔽信息隐蔽是指一个模块将自身的内部信息向其他模块隐藏起来,以避免其他模块不恰当的访问和修改,只有对那些为了完
7、成系统功能所必须的数据交换才被允许在模块间进行。信息隐蔽的目的主要是为了提高模块的独立性,减少将一个模块中的错误扩散到其他模块的机会。但是需要强调一点,信息隐蔽并不意味着某个模块中的内部信息对其他模块来说是完全不可见或不能使用的,而是说模块之间的信息传递只能通过合法的调用接口来实现。显然,信息隐蔽对提高软件的可读性和可维护性都是非常重要的。第4章 软件设计 .模块独立性模块独立性 1)耦合性 耦合性是对一个软件结构内部不同模块间联系紧密程度的度量指标。模块间的联系越紧密,耦合性就越高,模块的独立性也就越低。由于模块间的联系是通过模块接口实现的,因此,模块耦合性的高低主要取决于模块接口的复杂程度
8、、调用模块的方式以及通过模块接口的数据。模块间的耦合性主要可划分为如下几种类型。第4章 软件设计 (1)数据耦合。若两个模块之间仅通过模块参数交换信息,且交换的信息全部为简单数据,则称这种耦合为数据耦合。数据耦合的耦合性最低,通常软件中都包含有数据耦合。数据耦合的例子如下所示:第4章 软件设计 sum(int a,int b)int c;c=a+b;return(c);main()int x,y;printf(x+y=%d,sum(x,y);/*主函数与sum函数之间即为数据耦合关系*/第4章 软件设计 (2)公共耦合。若两个或多个模块通过引用公共数据相互联系,则称这种耦合为公共耦合。例如,在
9、程序中定义了全局变量,并在多个模块中对全局变量进行了引用,则引用全局变量的多个模块间就具有了公共耦合关系。FORTRAN语言中使用的common语句也会在多个模块间建立公共耦合关系。公共耦合的复杂度随着耦合的模块个数的增加而显著增加。在程序设计中,若两个模块间需要交换的数据较多,仅通过参数传递难以实现时,可以考虑采用公共耦合完成,但一定注意尽量降低公共耦合的程度。第4章 软件设计 (3)控制耦合。若模块之间交换的信息中包含有控制信息(尽管有时控制信息是以数据的形式出现的),则称这种耦合为控制耦合。控制耦合是中等程度的耦合,它会增加程序的复杂性。控制耦合的例子如下所示:void output(f
10、lag)if(flag)printf(OK!);else printf(NO!);main()int flag;output(flag);/*主函数与output函数之间即为控制耦合关系*/第4章 软件设计 (4)内容耦合。若一个模块对另一模块中的内容(包括数据和程序段)进行了直接的引用甚至修改,或通过非正常入口进入到另一模块内部,或一个模块具有多个入口,或两个模块共享一部分代码,则称模块间的这种耦合为内容耦合。内容耦合是所有耦合关系中程度最高的,会使因模块间的联系过于紧密而对后期的开发和维护工作带来很大的麻烦,因此,应坚决避免任何形式的内容耦合。实际上,许多高级程序设计语言在设计时就充分考虑
11、到了内容耦合的危害,因而在规定语法时就已经杜绝了任何形式的内容耦合。耦合是影响软件复杂度的一个重要因素,设计过程中应力求降低程序的耦合性。在以上所介绍的耦合中,数据耦合的程度最低,其次是公共耦合,再其次是控制耦合,程度最高的是内容耦合。第4章 软件设计 2)内聚性 内聚性是对一个模块内部各个组成元素之间相互结合的紧密程度的度量指标。模块中组成元素结合的越紧密,模块的内聚性就越高,模块的独立性也就越高。理想的内聚性要求模块的功能应明确、单一,即一个模块只做一件事情。模块的内聚性和耦合性是两个相互对立且又密切相关的概念。事实上,它们是同一事物的两个方面,模块的高内聚性往往就意味着模块间的低耦合性。
12、因为程序中的各个部分必定是有联系的,若将其中密切相关的部分放在同一个模块中,模块间的联系就会降低;反之,若将密切相关的部分分散放在不同的模块之中,模块间的联系必然会加强。在进行模块化设计时,耦合性和内聚性都是必须考虑的重要指标。但经实践证明,保证模块的高内聚性比低耦合性更为重要,在软件设计时应将更多的注意力集中在提高模块的内聚性上。第4章 软件设计 (1)偶然内聚。若一个模块由多个完成不同任务的语句段组成,各语句段之间的联系十分松散或根本没有任何联系,则称此模块的内聚为偶然内聚。例如,程序中多处出现一些无联系的语句段序列,为了节省内存空间将其组合成为一个模块,这个模块就属于偶然内聚。偶然内聚的
13、模块由于组成部分之间没有实质的联系,因此难于理解和修改,会给软件开发带来很大的困扰。事实上,偶然内聚的模块出错的机率要比其他类型的模块大得多。偶然内聚是内聚程度最低的一种,在软件设计时应尽量避免。第4章 软件设计 (2)逻辑内聚。若一个模块可实现多个逻辑上相同或相似的一类功能,则称该模块的内聚为逻辑内聚。例如,将程序中多种不同类型数据的输出放在同一个模块中实现,这个模块就属于逻辑聚合。逻辑内聚比偶然内聚的内聚程度高一些。虽然逻辑聚合模块的组成部分之间有一定的关系,但不同功能混在一起并公用模块中的部分代码,给修改带来了一定的麻烦。另外,为了在调用模块时能选择执行其中的某个功能,需要传递相应的控制
14、参数,因而会造成模块间的控制耦合,降低模块的独立性。第4章 软件设计 (3)时间内聚。若一个模块包含了需要在同一时间段中执行的多个任务,则称该模块的内聚为时间内聚。例如,将多个变量的初始化放在同一个模块中实现,或将需要同时使用的多个库文件的打开操作放在同一个模块中,都会产生时间内聚的模块。由于时间内聚模块中的各个部分在时间上的联系,其内聚程度比逻辑内聚高一些。但这样的模块往往会和其他相关模块有着紧密的联系,因而会造成耦合性的增加。第4章 软件设计 (4)过程内聚。若一个模块中的各个部分相关,并且必须按特定的次序执行,则称该模块的内聚为过程内聚。在结构化程序中,通常采用程序流程图作为设计软件和确
15、定模块划分的工具,因此,这样得到的模块往往具有过程内聚的特性。(5)通信内聚。若一个模块中的各个部分使用同一个输入数据或产生同一个输出数据,则称该模块的内聚为通信内聚。由于通信内聚模块中的各个部分都与某个共同的数据密切相关,因此内聚性高于前几种内聚。第4章 软件设计 (6)顺序内聚。若一个模块中的各个部分都与同一个功能密切相关,并且必须按照先后顺序执行(通常前一个部分的输出数据就是后一个部分的输入数据),则称该模块的内聚为顺序内聚。例如,在一个处理学生成绩的模块中,前一个部分根据成绩统计出及格的学生人数,后一个部分根据及格人数计算出学生的及格率。根据数据流图划分出的模块通常都是顺序内聚的模块。
16、由于顺序内聚模块中的各个部分在功能和执行顺序上都密切相关,因此内聚程度很高且易于理解。第4章 软件设计 (7)功能内聚。若一个模块中各个组成部分构成一个整体并共同完成一个单一的功能,则称该模块的内聚为功能内聚。由于功能内聚模块中的各个部分关系非常密切,构成一个不可分割的整体,因此功能内聚是所有内聚中内聚程度最高的一种。在以上所介绍的七种内聚中,按照内聚性从低到高进行排列的结果如图4.2所示。第4章 软件设计 图图.2 内聚性的排列内聚性的排列 第4章 软件设计 4.2 4.2 体系结构设计概述体系结构设计概述4.2.1 4.2.1 体系结构设计的任务体系结构设计的任务 在体系结构设计过程中,首
17、先要根据需求分析阶段产生的成果寻求实现目标系统的各种可能的方案,然后由系统分析员对所有可能的方案进行综合分析比较,从中选择出一个最佳方案向用户推荐。在与用户达成共识之后,系统分析员就可以着手对选择出的最佳方案进行体系结构的设计,并为软件确定数据结构及设计数据库。体系结构设计阶段结束时,系统分析员需要提交软件的体系结构说明书并参加该阶段的评审。体系结构设计的主要任务有如下四点。第4章 软件设计 1.1.软件体系结构设计软件体系结构设计 设计软件的体系结构需要在对需求分析阶段生成的数据流图进一步分析和精化的基础上,首先将系统按照功能划分为模块,接着需要确定模块之间的调用关系及其接口,最后还应该对划
18、分的结果进行优化和调整。良好的软件结构设计对详细设计及编码阶段的工作都是至关重要的。第4章 软件设计 2.2.数据结构和数据库设计数据结构和数据库设计 体系结构设计中应对需求分析阶段所生成的数据字典加以细化,从计算机技术实现的角度出发,确定软件涉及的文件系统及各种数据的结构。主要包括确定输入、输出文件的数据结构及确定算法所需的逻辑数据结构等。在需求分析阶段仅为系统所需的数据库建立了概念数据模型(最常采用的是E-R模型)。体系结构设计阶段需要将原本独立于数据库实现的概念模型与具体的数据库管理系统的特征结合起来,建立数据库的逻辑结构,主要包括确定数据库的模式、子模式及对数据库进行规范和优化等。第4
19、章 软件设计 3.3.系统可靠性、安全性设计系统可靠性、安全性设计 可靠性设计也称为质量设计,目的是为了保证程序及其文档具有较高的正确性和容错性,并对可能出现的错误易于修改和维护。安全性设计的主要目的是为了增强系统的自我防护能力和运行的稳定性,防止系统遭受到有意或无意地入侵和破坏,保证系统在安全的环境下正常地工作。第4章 软件设计 4.4.编写文档,参加复审编写文档,参加复审 体系结构设计阶段应交付的文档通常包括:体系结构设计说明书、用户手册、数据库设计说明书及系统初步测试计划。(1)体系结构设计说明书:给出系统总体结构设计的结果,为系统的详细设计提供基础。(2)用户手册:根据体系结构设计成果
20、,对需求分析阶段编写的用户手册进行补充和修改。(3)测试计划:明确测试中应采用的策略、方案、预期的测试结果及测试的进度安排。第4章 软件设计 (4)数据库设计说明书:主要用于给出目标系统中数据库管理系统的选择及逻辑结构等的设计结果。体系结构设计阶段复审的重点主要是系统的总体结构、模块划分和内/外接口等方面,复审的对象就是该阶段的设计文档。由于体系结构设计中的微小失误可能会导致软件开发中的重大问题,因此复审一定要按严格的步骤,通过正式会议的方式进行,争取尽可能地及早发现设计中的缺陷和错误。除软件开发人员以外,体系结构设计复审必须有用户参加,必要时还可以邀请相关领域的专家参加会议。第4章 软件设计
21、 4.2.2 4.2.2 体系结构设计中可采用的工具体系结构设计中可采用的工具 1.HIPO1.HIPO图图 HIPO(Hierarchy Plus Input/Processing/Output)图是IBM公司在20世纪70年代发展起来的用于描述软件结构的图形工具。它实质上是在描述软件总体模块结构的层次图(H图)的基础上,加入了用于描述每个模块输入/输出数据和处理功能的IPO图,因此它的中文全名为层次图加输入/处理/输出图。第4章 软件设计 1)HIPO图中的H图 H图用于在体系结构设计过程中描绘软件的层次结构。在H图中,每一个矩形框代表一个模块,图中最顶层的矩形框表示系统中的主控模块,矩形
22、框之间的连线用于表示模块之间的调用关系。为了使H图更具有可追踪性,可以为除顶层矩形框以外的其他矩形框加上能反映层次关系的编号。H图比较适用于自顶向下进行分解的软件结构设计方法。工资计算系统的H图如图4.3所示。第4章 软件设计 图4.3 工资计算系统的H图第4章 软件设计 2)IPO2)IPO图图 IPO图能够方便、清晰地描绘出模块的输入数据、加工和输出数据之间的关系。与层次图中每个矩形框相对应,应该有一张IPO图描述该矩形框所代表的模块的具体处理过程,作为对层次图中内容的补充说明。IPO图的基本形式为:在图中左边的框中列出模块涉及的所有输入数据,在中间的框中列出主要的加工,在右边的框中列出处
23、理后产生的输出数据;图中的箭头用于指明输入数据、加工和输出结果之间的关系。工资计算系统中的计算工资模块的IPO图如图4.4所示。第4章 软件设计 图4.4 计算工资模块的IPO图第4章 软件设计 2.2.结构图结构图 在软件工程中,软件结构经常采用20世纪70年代中期由Yourdon等人提出的结构图(SC,Structure Chart)这种图形工具来表示。结构图能够描述出软件系统的模块层次结构,清楚地反映出程序中各模块之间的调用关系和联系。结构图中的基本符号及其含义见表4.1。第4章 软件设计 表表4.1 4.1 结构图中的基本符号结构图中的基本符号ABCABC符 号含 义用于表示模块,方框
24、中标明模块的名称用于描述模块之间的调用关系用于表示模块调用过程中传递的信息,箭头上标明信息的名称;箭头尾部为空心圆表示传递的信息是数据,若为实心圆则表示传递的是控制信息 表示模块A选择调用模块B或模块C表示模块A循环调用模块B和模块C第4章 软件设计 4.2.3 4.2.3 体系结构设计的原则体系结构设计的原则 体系结构设计的原则有如下6点。(1)降低模块的耦合性,提高模块的内聚性。为了提高软件中各个模块的独立性,提高程序的可读性、可测试性和可维护性,在软件体系结构设计时应尽可能采用内聚性高的模块,如最好实现功能内聚;尽量只使用数据耦合,限制公共耦合的使用,避免控制耦合的使用,杜绝内容耦合的出
25、现。第4章 软件设计 (2)保持适中的模块规模。程序中模块的规模过大,会降低程序的可读性;而模块规模过小,势必会导致程序中的模块数目过多,增加接口的复杂性。对于模块的适当规模并没有严格的规定,但普遍的观点是模块中的语句数最好保持在10100之间。为了使模块的规模适中,在保证模块独立性的前提下,可对程序中规模过小的模块进行合并或对规模过大的模块进行分解。第4章 软件设计 (3)模块应具有高扇入和适当的扇出。在模块调用中,某个模块的上级模块数被称为该模块的扇入(如图4.5(a)所示,模块M的扇入数为n);而某个模块可以调用的下级模块数被称为该模块的扇出(如图4.5(b)所示,模块M的扇出数为k)。
展开阅读全文