结构化设计(上).ppt
《结构化设计(上).ppt》由会员分享,可在线阅读,更多相关《结构化设计(上).ppt(117页珍藏版)》请在三一办公上搜索。
1、第四部分、结构化设计,授课:王冲,经过需求分析阶段的工作,系统必须“做什么”已经清楚了,现在是决定“怎样做”的时候了。为此,必须首先进行设计,软件设计的目标是设计出符合用户需求的软件的模型。软件设计划包涵概要设计和详细设计这样两个阶段。,1 软件设计的任务,1.1 概要设计的任务 概要设计也称为总体设计或初步设计,这个设计阶段主要有两项任务。1、设计实现软件的最佳方案 2、设计软件体系结构,1.设计实现软件的最佳方案 概要设计过程首先设想实现目标系统的各种可能的方案,需求分析阶段得到的数据流图是设想各种可能方案的基础。一种常用的方法是,设想把数据流图中的处理分组(即画自动化边界)的各种可能方法
2、。然后,分析员从设想出的这些供选择的方案中选取若干个合理的方案。最后,分析员应该综合分析对比所选取的各种合理方案的利弊,从中选出一个最佳方案,并且为推荐的这个最佳方案制定详细的实现计划。一旦用户和使用部门的负责人接受了分析员推荐的方案,就应该开始概要设计的第二项工作。,方案选择分析员应该考虑各种可能的实现方案,分析比较不同的物理实现方案,并力求从中选出最佳方案通 常 至 少 选 取 低 成 本、中 等 成 本 及 高 成 本 的 三 种 方 案分析员应该综合分析对比各种合理方案的利弊,推荐一个最佳的方案,并且为推荐的方案制定详细的实现计划,2.设计软件体系结构 概要设计的第二项重要任务是设计软
3、件的体系结构,也就是确定软件系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。通常,程序中的一个模块完成一个适当的子功能。应该把模块组织成良好的层次系统,顶层模块通过调用它的下层模块来实现程序的完整功能,顶层模块下面的每个模块再调用更下层的模块从而完成程序的一个子功能,最下层的模块完成最具体的功能。,详细设计阶段的根本目标,是确定怎样具体地实现所要求的软件系统,应该得出对目标系统的精确描述,从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。具体说来,详细设计主要有以下三项任务:过程设计,即设计软件体系结构中所包含的每个模块的实现算法;数据设计,即设计软件中需要的数据
4、结构;接口设计,即设计软件内部各模块之间、软件与协作系统之间以及软件与使用它的人之间的通信方式。,1.2 详细设计的任务,详细设计阶段的任务还不是具体地编写程序,而是要设计出程序的“蓝图”,以后程序员将根据这个蓝图写出实际的程序代码。程序的“读者”有两个,那就是计算机和人。衡量程序的质量不仅要看它的逻辑是否正确,性能是否满足要求,更主要的是要看它是否容易阅读和理解。详细设计的目标不仅仅是逻辑上正确地实现每个模块的功能,更重要的是设计出的处理过程应该尽可能简明易懂。,2 从分析过渡到设计,系统分析的基本任务是定义用户需要的软件系统;系统设计的基本任务是设计实现目标系统的具体方案。虽然系统分析与系
5、统设计的任务性质不同,但是两者却有十分密切的关系。软件设计必须依据用户对软件的需求来进行,因此,结构化分析的结果是结构化设计的最基本、最重要的输入信息。概要设计阶段的体系结构设计的任务是,确定程序由哪些模块组成以及这些模块相互间的关系。在需求分析阶段画出的数据流图,是进行体系结构设计的主要依据,为体系结构设计提供了最基本的输入信息。,软件设计之所以如此重要,是因为设计是软件开发过程中决定软件产品质量的关键阶段。设计为我们提供了可以进行质量评估的软件表示(即软件模型),设计是我们把用户需求准确地转变为最终的软件产品的惟一方法。软件设计是后续的一切软件开发和维护步骤的基础,如果不进行设计,我们就会
6、冒构造出不稳定的软件系统的风险:稍做改动这样的系统就可能崩溃;这样的系统很难维护,测试;,起点需求分析阶段得出的DFD图是概要设计的极好的出发点DFD图中的某些处理可以逻辑地归并在一个自动化边界内,作为一组;另一些处理可以放在另一个自动化边界内,作为另一组这些自动化边界通常意味着某种实现策略,结构设计是概要设计阶段的主要工作软件的结构决定了系统中每个程序是由哪些模块组成的以及这些模块相互间的关系软件结构包括程序的模块结构和数据的结构两部分,设计出初步的软件结构之后,分析员还应该从多方面改进软件结构,以便得到更合理的软件结构。从上面的叙述中不难看出,在详细设计之前先进行概要设计的必要性:分析员可
7、以站在全局高度上,花较少的成本,在比较抽象的层次上分析对比多种可能的系统实现方案和多种可能的软件体系结构,从中选出最佳方案和最合理的软件结构,从而用较低的成本开发出较高质量的软件系统。,3 软件设计准则,为了保证设计的质量,在软件设计过程中应该遵循一些基本的准则(或称为原理)。下面讲述在软件设计过程中应该遵循的基本准则以及相关的概念。,模块是数据说明、可执行语句等程序对象的集合。它是单独命名且可通过名字来访问的,如过程、函数、子程序、宏等。模块一般具有如下基本属性:功能:描述该模块实现的功能;逻辑:描述模块内部怎么做;状态:该模块使用时的环境和条件。模块的外部特性是指模块名和参数表,其中的输入
8、参数和输出参数,以及对程序及整个系统造成的影响模块的内部特性是指完成其功能的程序代码和仅供该模块内部使用的数据。,3.3.1 模块化与模块独立 模块化和模块独立,是关系非常密切的两条设计准则。1.模块化 模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。,模块化是软件结构设计的一个基本准则高层模块隐蔽了细节,能够从整体上把握问题而当我们需要时,也可以深入到较低的层次以了解进一步的细节模块化提供给我们所需要的灵活性,如理解系统做什么、跟踪流经系统的数据流、定位系统的复杂部分。尽管不像人们通常所想像的那样,对
9、问题进行划分会奇迹般地把一个复杂的问题转换成简单问题的集合,然而,模块化允许我们孤立问题中最难以把握的部分,防止被不相关的功能和数据所困扰或误入歧途。,假设C(X)表示问题难度,E(X)表示问题解决工作量如果 C(A)C(B)则 E(A)E(B)故 C(A+B)C(A)+C(B)E(A+B)E(A)+E(B),当模块数目增加时每个模块的规模将减小,开发单个模块需要的成本确实减少了;但是,随着模块数目增加,设计模块间接口所需要的工作量也将增加。根据这两个因素,得出了图中的总成本曲线。每个程序都相应地有一个最适当的模块数目M,使得系统的开发成本最小。,模块化和软件成本的关系,虽然目前我们还不能精确
10、地算出M的数值,但是在考虑程序模块化的时候,总成本曲线确实是有用的指南。采用模块化原理可以使软件结构清晰,不仅容易设计也容易阅读和理解。因为程序错误通常局限在有关的模块及它们之间的接口中,所以模块化使软件容易测试和调试,因而有助于提高软件的可靠性。因为变动往往只涉及少数几个模块,所以模块化能够提高软件的可修改性。模块化也有助于软件开发工程的组织管理,一个复杂的大型程序可以由许多程序员分工编写不同的模块,并且可以进一步分配技术熟练的程序员编写困难的模块。,2.模块独立 是不是只要把程序划分成若干个模块,就可以获得上述的模块化所带来的好处呢?事实并非如此。模块划分和组织得合理,能大大地提高软件的质
11、量,反之,软件质量不仅不会提高反而可能会下降。怎样划分和组织模块才合理呢?一条指导模块划分和组织的重要准则,就是“模块独立”。开发具有独立功能而且和其他模块之间没有过多的相互作用的模块,就可以做到模块独立。换句话说,希望这样设计软件结构,使得每个模块完成一个相对独立的特定子功能,并且和其他模块之间的关系很简单。,为什么模块的独立性很重要呢?主要有两条理由:第一,有效的模块化(即具有独立的模块)的软件比较容易开发出来。这是由于能够分割功能而且接口可以简化,当许多人分工合作开发同一个软件时,这个优点尤其重要。第二,独立的模块比较容易测试和维护。这是因为相对说来,修改设计和程序需要的工作量比较小,错
12、误传播范围小,需要扩充功能时能够“插入”模块。总之,模块独立是好设计的关键,而设计又是决定软件质量的关键环节。,3.3.2 抽象 人类在认识复杂现象的过程中使用的最强有力的思维工具是抽象。人们在实践中认识到,在现实世界中一定事物、状态或过程之间总存在着某些相似的方面(共性)。把这些相似的方面集中和概括起来,暂时忽略它们之间的差异,这就是抽象。或者说抽象就是抽出事物的本质特性而暂时不考虑它们的细节。,3.3.3 逐步求精 逐步求精是人类解决复杂问题时采用的基本技术,也是许多软件工程技术(例如,规格说明技术,设计和实现技术、测试和集成技术)的基础。可以把逐步求精定义为:“为了能集中精力解决主要问题
13、而尽量推迟对问题细节的考虑。”事实上,可以把逐步求精看作是一项把一个时期内必须解决的种种问题按优先级排序的技术。逐步求精确保每个问题都将被解决,而且每个问题都在适当的时候解决,但是,在任何时候一个人都不需要同时处理7个以上知识块。,求精实际上是细化过程。我们从在高抽象级别定义的功能陈述(或信息描述)开始。也就是说,该陈述仅仅概念性地描述了功能或信息,但是并没有提供功能的内部工作情况或信息的内部结构。求精要求设计者细化原始陈述,随着每个后续求精(细化)步骤的完成而提供越来越多的细节。抽象与求精是一对互补的概念。抽象使得设计者能够说明过程和数据,同时却忽略低层细节。事实上,可以把抽象看作是一种通过
14、忽略多余的细节同时强调有关的细节,而实现逐步求精的方法。求精则帮助设计者在设计过程中揭示出低层细节。这两个概念都有助于设计者在设计演化过程中创造出完整的设计模型。,3.3.4 信息隐藏 应用模块化原理时,自然会产生的一个问题是:“为了得到最好的一组模块,应该怎样分解软件”。信息隐藏原理指出:应该这样设计和确定模块,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。实际上,应该隐藏的不是有关模块的一切信息,而是模块的实现细节。,4.模块独立性标准,软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其它的模块的接口是简单的一个模块和其它模块的独立程度也是
15、评价一个设计好坏的重要度量尺度。当一个模块的功能不是同其它模块紧密地联系在一起时,比较容易理解;其次,对个独立性较强的模块修改时不会或者较小的影响其他模块。,耦合与内聚,内聚是模块功能强度的度量(即一个模块内部各个元素彼此结合的紧密程度),一个模块内聚程度越高,该模块内部各成分之间的关联也就越强。耦合是模块之间的互相连接的紧密程度的度量,耦合越松散,模块之间的联系就越小,模块的独立性就越强。,1.内容耦合如果发生下列情形,两个模块之间就发生了内容耦合(1)一个模块直接访问另一个模块的内部数据;(2)一个模块不通过正常入口转到另一模块内部;(3)两个模块有一部分程序代码重迭(只可能出现在汇编语言
16、中);(4)一个模块有多个入口。,模块AEntry1:Mov Entry2:Mov Entry3:Mov,模块BJMP Entry2,(a)编语言模块多个入口(b)B模块直接进入A模块,耦合,2.公共耦合,若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是:全局数据结构 共享的通信区 内存的公共覆盖区 公共耦合的复杂程度随耦合模块的个数增加而显著增加。,公共耦合举例,所有的公共 耦合关系,A,E,B,C,D,6个模块共享一个公共数据区,F,程序设计人员理解多个模块交叉共用公共环境的软件结构比较困难某个模块究竟用了哪几个数据某个数据究竟被哪几个模块使用 使用
17、公共数据区的任模块如果出现错误,该错误可能会影响所有使用该数据区的模块如果一个模块发生改变,要寻找哪些数据跟着发生变化相当困难,公共耦合带来的复杂性,3.外部耦合,一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合 外部耦合与公共耦合存在类似问题,都属于较强耦合问题:外部耦合与公共耦合的异同?,如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合存在的问题:控制模块必须了解被控模块内部的逻辑关系 对被控模块的任何修改,都会影响控制模块。这种耦合实质上是在被控模块内部依据信号要求选择某一功能,4.控
18、制耦合,控制耦合举例,A,计算平均分或最高分,B,平均/最高,成绩,控制耦合举例,读入分数,输出结果,计算平均分,计算最高分,平均/最高?,调用逻辑性模块 B时,须先传递控制信号(平均分/最高分),以选择所需的操作。控制模块必须知道被控模块的内部逻辑,增强了相互依赖.,B,5.标记耦合(特征耦合),如果一组模块通过参数表传递信息,并只使用数据结构的部分数据 这个参数是:数据结构字符串记录 不是简单变量,特征耦合举例,计算水电费,计算水费,计算电费,住户情况,水费,电费,住户情况,“住户情况”是一个数据结构,如果一个模块访问另一个模块时,彼此之间是通过简单数据参数,来交换输入、输出信息的不是:控
19、制参数公共数据结构外部变量,6.数据耦合,思考:刚才的特征耦合例子如何变为数据耦合?,将特征耦合修改为数据耦合举例,计算水电费,计算水费,计算电费,本月用水量,本月用电量,水费,电费,7.非直接耦合,如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,这就是非直接耦合 这种耦合的模块独立性最强,两个模块没有直接关系(模快1和模快2),模块独立性最强。,模块1,模块2,模块3,模块4,模块间的耦合类型汇总,1,2,3,4,5,6,7,弱耦合,弱耦合,弱耦合,中耦合,较强耦合,较强耦合,强耦合,原则:尽量使用数据耦合少用控制耦合限制公共耦合的范围坚决避免使用内容耦合,
20、高耦合的弊端,理解多软件结构比较困难。某个模块究竟用了哪几个数据?某个数据究竟被哪几个模块使用?使用公共数据区的任模块如果出现错误,该错误可能会影响所有使用该数据区的模块。如果一个模块发生改变,要寻找哪些数据跟着发生变化相当困难。这种软件结构难以修改。,1.偶然内聚偶然内聚又称为巧合内聚。当模块内各部分之间没有联系,或者即使有联系,这种联系也很松散,则称这种模块为巧合内聚模块,它是内聚程度最低的模块。,内聚:一个模块内部各成分之间相互关联的强度。,4.2 内聚,模块内各部分间无联系,A,B,C,M,MOVE O TO RREAD FILE FMOVE S TO T,模块M中的三个语句没有任何联
21、系缺点:可理解性差,可修改性差,例:,这种模块把几种相关的功能组合在一起,每次被调用时,由传送给模块的判定参数来确定该模块应执行哪一种功能 逻辑内聚缺点:不易修改增强了耦合程度(控制耦合)效率低,2.逻辑内聚,时间内聚又称为经典内聚。这种模块大多为多功能模块,但模块的各个功能的执行与时间有关,通常要求所有功能必须在同一时间段内执行。例如:初始化模块和终止模块。,3.时间内聚,一个模块内部的处理成分是相关的,而且这些处理必须以特定的次序执行 例如,把流程结构中的循环部分、判定部分、计算部分分成一个模块,这三个任务组成的模块是过程内聚模块。,4.过程内聚,过程内聚举例,建立方程组系数矩阵,全部任务
22、纳入一个模块,得到一过程性模块,高斯消去法,回 代,高斯消去法解题流程,如果一个模块内各功能部分都使用了相同的输入数据,或产生了相同的输出数据,则称之为通信内聚模块。通常,通信内聚模块是通过数据流图来定义的。,5.通信内聚,通信内聚模块例一,产生工资报表,计算平均工资,职工工资记录,职工工资报表,平均工资,产生职工工资报表并计算平均工资模块,通信内聚模块例二,开领书单,登记售书,发票,领书单,售 书登记表,文件,删除,修改,6.顺序内聚,如果一个模块内的处理元素和同一功能密切相关,而且这些处理必须顺序执行(通常一个处理元素的输出数据作为下一个处理元素的输入数据)思考:顺序内聚与过程内聚的异同?
23、,一个模块中各个部分都是完成某一具体功能必不可少的组成部分或者说该模块中所有部分都是为了完成一项具体功能而协同工作,紧密联系,不可分割的 软件结构中应多使用功能内聚类型的模块,7.功能内聚,模块的内聚性类型:,低 偶然内聚 内 逻辑内聚 聚 时间内聚 性 过程内聚 通信内聚 顺序内聚 高 功能内聚,模块独立性,弱(功能分散),强(功能单一),耦合、内聚与模块独立性的关系,耦合和内聚是评价软件系统设计质量好坏的标准,它们衡量系统设计中模块的划分是否合理、模块是否独立性强模块的内聚度高,模块间耦合度低,模块的独立性就好,系统设计的质量也就好 模块独立性比较强的模块应是高内聚低耦合的模块。,耦合与内
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 设计
链接地址:https://www.31ppt.com/p-5299276.html