软件工程第四讲教案.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《软件工程第四讲教案.doc》由会员分享,可在线阅读,更多相关《软件工程第四讲教案.doc(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、教案首页周次 日期 课时序 课 题软件总体设计教学目的要 求理解软件总体设计目标;掌握软件总体设计的手段与方法,理解模块独立性概念;理解模块化概念重 点软件总体设计目标、模块化难 点软件总体设计的手段与方法;模块独立性教学过程设 计及时间分配第一章 软件总体设计(2*45)第一节 总体设计的任务与步骤(15)第二节 软件设计原则(15)第三节 面向数据流的设计方法(30)第四节 面向数据结构的分析设计方法(25)第五节 总体设计文档评审(5)教学场所或教学方法使用教具作 业课 后 记授课教师 第四章 软件总体设计问题定义、可行性研究和需求分析构成了软件计划阶段,在这个阶段确定了需要做什么,解决
2、了系统开发目标,系统需求规格。而软件开发阶段的任务是回答系统如何实现的问题。软件开发阶段包括总体设计、详细设计、编码和测试等。在总体设计中有两个主要任务: 将系统划分成物理元素,即程序、文件、数据库、文档等。 设计软件结构,即将需求规格转换为软件体系结构、划分出程序的模块组成、模块间的相互关系 、确定数据结构和算法等。 总体设计过程首先寻找实现目标系统的各种不同的方案,需求分析阶段得到的数据流图是设想的各种方案的基础与根据。然后从这些可供选择的方案中选取若干个合理的方案,为每个合理的方案都准备一份系统流程图、列出组成系统的所有物理元素、进行成本效益分析,并且制定实现这个方案的进度计划。应该综合
3、分析比较这些合理的方案,从中选出一个最佳方案向用户和使用部门负责人推荐。如果用户和使用部门的负责人接受了推荐的方案,应该进一步为这个最佳方案设计软件结构。通常,设计出初步的软件结构后还要进一步改进,从而得到更合理的结构,进行必要的数据库设计,确定测试要求并且制定测试计划。 4.1 总体设计的任务与步骤 4.1.1 总体设计任务 1.系统分析员审查软件计划、软件需求分析文档,提出最佳推荐方案,用系统流程图描述,组成系统物理元素清单,成本效益分析,系统的进度计划,供专家审定,审定后进入设计。 2.划分功能模块,将软件功能需求分配给所划分的最小单元模块。确定模块间的联系,确定数据结构、文件结构、数据
4、库模式,确定测试方法与策略。 3.编写总体设计说明书,用户手册,测试计划,选用相关的软件工具来描述软件结构,结构图是经常使用的软件描述工具。选择分解功能与划分模块的设计原则等。 4.1.2 总体设计的过程 S1:设计系统方案 为了实现要求的系统,系统分析员应该提出并分析各种可能的方案,并且从中选出最佳的方案。而在分析阶段提供的用数据流图描述逻辑模型是总体设计的出发点。数据流图中的某些处理可以逻辑地归并在一个边界内作为一组,另一些处理可以放在另一个边界内作为另一组。这些边界代表某种实现策略。在可供选择的多种方案中,进一步设想与选择较好的系统实现方案。这个方案仅是边界的取舍,抛弃技术上行不通的方法
5、,留下可能的实现策略,但并不评价这个方案。 S2:选取合理的方案 分析员在通过问题定义,可行性研究和需求分析后,产生了一系列可供选择的方案,从中选取低成本,中成本,高成本三种方案,必要时再进一步征求用户意见。并准备好系统流程图,系统的物理元素清单(即构成系统的程序、文件、数据库、人工过程,文档等),成本效益分析,实现系统的进度计划。 S3:推荐最佳实施方案 综合分析各种方案的优缺点,推荐最佳方案,并做详细的实现进度计划。用户与有关技术专家认真审查分析员推荐的方案,然后提交使用部门负责人审批,审批接受分析员推荐的最佳实施方案后,才能进入软件结构设计。 S4:功能分解 要把复杂的功能进一步分解成简
6、单的功能,遵循模块划分独立性原则(即做到模块功能单一,模块与外部联系很弱,仅有数据联系),使划分过的模块的功能对大多数程序员而言都是易懂的。功能的分解导致对数据流图的进一步细化,并选用相应图形工具来描述。 S5:软件结构设计 用层次图(HC)、结构图(系统结构)来描述模块组成的层次系统,即反映了软件结构。当数据流图细化到适当的层次,由结构化的设计方法(SD)可以直接映射出结构图(系统结构)。 S6:数据库设计、文件结构的设计 根据系统的数据要求,确定系统的数据结构、文件结构。对需要使用数据库的应用领域,分析员再进一步根据系统数据要求完成数据库的模式设计,确定数据库物理数据的结构约束。进行数据库
7、子模式设计,设计用户使用的数据视图。再做数据库完整性与安全性设计,改进与优化模式和子模式(用户使用的数据库视图)的数据存取。 S7:制定测试计划 为保证软件的可测试性,软件设计一开始就要考虑软件测试问题。这个阶段的测试计划仅从I/O功能做的黑盒法测试计划,详细设计时才能做详细的测试用例与计划。 S8:编写总体设计文档 用户手册。对需求分析阶段编写的用户手册进一步修订。 测试计划。对测试的计划、策略、方法和步骤提出明确的要求。 详细项目开发实现计划。给出系统目标、总体设计、数据设计、处理方式设计、运行设计和出错设计等。 数据库设计结果。使用的数据库简介数据模式设计和物理设计等。 S9:审查与复审
8、总体设计文档。 根据总体设计阶段的结果,修改更正在需求分析阶段产生的初步的用户手册。 总体设计过程如图 4-1所示。 图 4-1 总体设计过程 4.2 软件设计的原则 软件设计经过多年发展,已经总结出一些基本的软件设计概念与原则,这些概念与原则经过时间的考验成为软件设计人员完成复杂的软件设计问题的基础。主要内容包括有: (1)将软件划分成若干独立成分的依据。 (2)怎样表示不同的成分内的功能细节和数据结构。 (3)怎样统一衡量软件设计的技术质量。 4.2.1 模块化 模块是数据说明、可执行语句等程序对象的集合,可以对模块单独命名,而且可通过名字访问,例如,过程、函数、子程序、宏等等都可作为模块
9、。模块化就是把程序划分成若干个模块,每个模块具有一个确定的子功能,把这些模块集成一个整体,可以完成指定的功能。 在软件开发过程中,大型软件由于其控制路径多、涉及范围广且变量数目多使其总体结构更为复杂,这样与小型软件相比较其可理解性和可阅读性较差。模块化增强了对复杂的大型程序的可理解性与可管理性。下面定量地描述模块化的根据。 定义函数C(x)为问题x的复杂程度,函数E(x)为解决间题x需要的工作量(时间)。对于问题P 1 和问题P 2 ,如 C(P 1 )C(P 2 ), 则有E(P 1 )E(P 2 ) 因为由P 1 和P 2 两个问题组合而成一个问题的复杂程度大于分别考虑每个问题时的复杂程度
10、之和。C(P 1 +P 2 )C(P 1 )C(P 2 )综上所述,可得到下面的不等式: E(P 1 +P 2 )E(P 1 )E(P 2 ) 由此可知,把复杂的问题分解成许多容易解决的较小问题,原来的问题也就容易解决了,这就是模块化提出的根据。 参阅图4-2,如果无限地分割软件,最后为了开发软件而需要的工作量也就小得可以忽略了。事实上,当模块数目增加时,每个模块的规模将减小,虽然开发单个模块需要的工作量减少了,但是随着模块数目增加,设计模块间接口所需要的工作量将增加。折衷考虑这两个因素,可得出了图中所示的总成本曲线。每个程序都相应地有一个最适当的模块数目M,使得系统的开发工作量为最小。 图4
11、-2 模块数目与工作量关系 虽然目前还不能精确地决定M的数值,但是在考虑模块化的时候模块数目与工作量关系曲线是有用的指南。 采用模块化原理可以使软件结构清晰,不仅容易实现设计,也使设计出的软件的可阅读性和可理解性大大增强。这是由于程序错误通常发生在有关的模块及它们之间的接口中,所以采用了模块化技术会使软件容易测试和调试,进而有助于提高软件的可靠性。因为变动往往只涉及少数几个模块,所以模块化能够提高软件的可修改性。模块化也有助于软件开发工程的组织管理,一个复杂的大型程序可以由许多程序员分工编写不同的模块。 4.2.2 抽象与逐步求精 在现实世界中,事物、状态或过程之间存在共性。把这些共性集中和概
12、括起来,忽略它们之间的差异,这就是抽象。抽象就是抽出事物的本质特性而暂时不考虑它们的细节。 处理复杂系统的有效的方法是用层次的方式构造和分析它。一个复杂的动态系统首先可以用一些高级的抽象概念构造和理解,这些高级概念又可以用一些较低级的概念构造和理解,如此进行下去,直至最低层次的具体元素。这种层次的思维和解题方式必须反映在定义动态系统的程序结构之中,每级的一个概念将以某种方式对应于程序的一组成分。 当考虑对任何问题的模块化解法时,可以提出许多抽象的层次。在抽象的最高层次使用问题环境的语言,以概括的方式叙述问题的解法;在较低抽象层次采用更过程化的方法,把面向问题的术语和面向实现的术语结合起来叙述问
13、题的解法;最后,在最低的抽象层次用可以直接实现的方式叙述问题的解法。 软件工程过程的每一步都是对软件解法的抽象层次的一次精化。在可行性研究阶段,软件作为系统的一个完整部件;在需求分析期间,软件解法是使用在问题环境内熟悉的方式描述的;当我们由总体设计向详细设计过渡时,抽象的程度也就随之减少了;最后,当源程序写出来以后,也就达到了抽象的最低层。 逐步求精与抽象是紧密相关,随着软件开发工程的进展,在软件结构每一层中的模块,表示了对软件抽象层次的一次精化。层次结构的上一层是下一层的抽象,下一层是上一层的求精。事实上,软件结构顶层的模块,控制了系统的主要功能并且影响全局;在软件结构底层的模块,完成对数据
14、的一个具体处理,用自项向下由抽象到具体的方式分配控制,简化了软件的设计和实现,提高了软件的可理解性和可测试性,并且使软件更容易维护。 例: 开发一个 CAD软件,能够实现绘图系统的全部功能,供低级CAD使用。 抽象层次 1 用问题所处环境的术语描述这个软件 该软件系统具有与可视化通信的图形界面,能用鼠标代替绘图工具划出各种曲线和直线。能完成几何计算和截面视图及辅助视图的设计,图形设计结果存于图形文件中。 抽象层次 2 所用术语不再是问题所处环境的语言,但并没给出怎样做的信息,不能直接实现。 CAD 软件任务 用户界面任务; 创建二维图形任务; 显示图形任务;管理图形任务; end CAD 抽象
15、层次 3 仅以二维图形任务为例 PROCEDURE 创建二维图形 REPEAT UNTIL 创建图形任务终止 DO WHILE 出现与数字仪的交互时 数字仪接口任务; 判断作图请求; 线:画线任务; 圆:画圆任务; .END; DO WHILE 出现与键盘的交互时 键盘接口任务; 选择分析或计算; 辅助视图:辅助视图任务; 截面视图:截面视图任务; .END .END PROCEDURE. 在这一抽象层次上,给出了初步过程表示,模块结构已清楚明朗,求精过程还可进行下去,直到得到源代码。 4.2.3 信息隐蔽和局部化 应用模块化原理时,将产生的一个问题:为了得到一组模块,应该如何分解软件结构。信
16、息隐蔽原理指出:每一个模块的实现细节对于其他模块来说是隐蔽的,也就是说,模块中所包括的信息不允许其它不需要这些信息的模块调用。隐蔽表明有效的模块化可以通过定义一组独立的模块而实现,这些独立的模块间仅交换为完成系统功能而必须交换的信息。 模块间的通信仅使用对于实现软件功能的必要信息,通过抽象,可以确定组成软件的过程实体;而通过信息隐蔽,则可以定义和实施对模块的过程细节和局部数据结构的存取限制。局部化的概念和信息隐蔽概念密切相关。局部化是指把一些关系密切的软件元素物理地放得彼此靠近。在模块中使用局部数据元素就是局部化的一个例子。显然,局部化有助于实现信息隐蔽。 如果在测试期间和以后的软件维护期间需
17、要修改软件,那么使用信息隐蔽原理作为模块化系统设计的标准就会带来极大好处。因为绝大多数数据和过程对于软件的其他部分而言是隐蔽的,也就是看不见的,在修改期间由于疏忽而引入的错误传播到软件的其他部分的机会就很少。 4.2.4 模块独立性 模块独立性是指软件系统中的每个模块只具有软件要求的具体子功能,而与软件系统中其他的模块接口是简单的。例如,如果一个模块只具有单一的功能,并且与其他的模块没有太多的联系,那末称此模块具有模块独立性。 模块独立性的概念体现了模块化、抽象、信息隐蔽和局部化概念。开发具有独立功能而且和其他模块之间没有过多的相互作用的模块,就可以做到模块独立。换句话说,希望这样设计软件结构
18、,使得每个模块完成一个相对独立的特定子功能,并且与其他模块之间的关系很简单。 模块的独立程度可以由内聚和耦合两个标准来度量。耦合表示不同模块间互相连接的紧密程度;内聚表示一个模块内部各个元素彼此结合的紧密程度。 1.耦合 耦合是对一个软件结构内各个模块之间互连程度的度量。耦合强弱取决于模块间接口的复杂程度,调用模块的方式,以及通过接口的信息。 在软件设计中应该尽可能采用松散耦合。在松散耦合的系统中测试或维护任何一个模块,而不影响系统的其他模块。由于模块间联系简单,在一处发生错误就很小有可能性传播到整个系统。因此,模块间的耦合程度影响系统的可理解性、可测试性、可靠性和可维护性。 具体区分模块间耦
19、合程度的标准如下。 ( 1) 非直接耦合 如果两个模块中的每一个都能独立地工作而不需要另一个模块的存在,那么它们彼此完全独立,这表明两个模块间无任何连接,耦合程度最低。但是,在一个软件系统中不可能所有模块之间都没有任何连接,因为模块之间的联系是通过模块的控制和调用来实现的。 ( 2)数据耦合 如果两个模块彼此间通过参数交换信息,而且交换的信息仅仅是数据,那么这种耦合称为数据耦合。数据耦合是低耦合。系统中至少必须存在这种耦合,因为只有当某些模块的输出数据作为另一些模块的输入数据时,系统才能完成有价值的功能。一般说来,一个系统内可以只含有数据耦合。 ( 3)控制耦合 如果在模块间传递的信息中含有控
20、制信息(有时控制信息以数据的形式出现),则这种耦合称为控制耦合,如图 4-3所示。控制耦合是中等程度的耦合,它增加了系统的复杂程度。在把模块分解之后通常可以用数据耦合代替控制耦合。图 4-3控制耦合 ( 4)公共环境耦合 当两个或多个模块通过一个公共数据环境相互作用时,这种耦合称为公共环境耦合。这里的公共环境可以是全程变量、共享的通信区、内存的公共覆盖区、任何存储介质上的文件、物理设备等等。 公共环境耦合的复杂程度随耦合的模块个数而变化,当耦合的模块个数增加时复杂程度显著增加。如果只有两个模块有公共环境,那么这种耦合有下述两种可能,(参阅图 4-4)。 一个模块往公共环境送数据,另一个模块从公
21、共环境取数据。这是数据耦合的一种形式,是比较松散的耦合。 两个模块都既往公共环境送数据又从里面取数据,这种耦合比较紧密,介于数据耦合和控制耦合之间。如果两个模块共享的数据很多,通过参数传递可能很不方便,这时可以利用公共环境耦合。 图4-4公共环境耦合图4-5 内容耦合 ( 5)内容耦合 最高程度的耦合是内容耦合。如果出现下列情况之一(参阅图 4-5),两个模块间就发生了内容耦合: 一个模块访问另一个模块的内部数据; 一个模块不通过正常人口而转到另一个模块的内部; 两个模块有一部分程序代码重叠(只可能出现在汇编程序中); 一个模块有多个人口(这表明一个模块有几种功能)。 应该避免使用内容耦合。事
22、实上许多高级程序设计语言已经设计成不允许在程序中出现任何形式的内容耦合。 ( 6)标记耦合 如果一组模块通过参数表传递记录信息,也就是说,这组模块共享了这个记录,就是标记耦合。在设计中避免标记耦合。 ( 7)外部耦合 一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该变量的信息,则称之为外部耦合。 模块之间的耦合一般分为七种类型,如图 4-6所示。总之,耦合是影响软件复杂程度的一个重要因素。应该采取的原则是:尽量使用数据耦合,少用控制耦合,限制公共环境耦合的范围,完全不用内容耦合。 图 4-6七种耦合类型的关系图 4-7偶然内聚 2内聚 内聚表示一个模块内各个元素间
23、结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。简单地说,理想内聚的模块只做完成一个子功能。 设计时应该力求做到高内聚,通常中等程度的内聚也是可以采用的,而且效果和高内聚相差不多;但是,低内聚不要使用。 内聚和耦合是密切相关的,模块内的高内聚往往意味着模块间的松耦合。内聚和耦合都是进行模块化设计的有力工具,但是实践表明内聚更重要,应该把更多注意力集中到提高模块的内聚程度上。 (1)偶然内聚 如果一个模块完成一组任务,这些任务间的关系很松散,这就称为偶然内聚,参阅图 4-7。例如在写完某一个程序之后,发现一些语句在两处或多处出现,于是把这些语句作为一个模块,这样模块为偶然内聚的模块。 ( 2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件工程 第四 教案
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内