已阅读5页,还剩45页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
从工程管理的角度来看,软件设计可以分两步完成:概要设计,将软件需求转化为软件的系统结构和数据结构。详细设计,即过程设计。通过对结构表示进行细化,得到软件的详细的数据结构和算法。在详细设计过程中,需要完成的工作是:确定软件各个组成部分内的算法以及各部分的内部数据组织选定某种过程的表达形式来描述各种算法。进行详细设计的评审,第5章总体设计,总体设计又称为概要设计或初步设计,它的基本目的就是回答“概括地说,系统应该如何实现?”这个问题。在总体设计阶段,应划分出组成系统的物理元素程序、文件、数据库、人工过程和文档等,并确定系统中每个程序由哪些模块组成以及这些模块相互间的关系。5.1总体设计的过程总体设计通常由系统设计和结构设计两个阶段组成。系统设计阶段确定系统的具体实现方案,结构设计阶段确定软件的结构。,1设想供选择的方案需求分析阶段得出的数据流图是总体设计的根本出发点,不同的处理分组代表不同的物理实现方案.2选取合理的方案通常,选取的这些方案中至少应包括低成本、中成本和高成本的三种方案类型。对每个合理方案要提供以下几方面资料:(1)系统流程图;(2)数据字典;(3)成本效益分析;(4)实现这个系统的进度计划。,实施总体设计的过程如下:,3推荐最佳方案分析员从合理方案中选择一个最佳方案向用户推荐,并为推荐的方案制定详细的实现计划。对于分析员推荐的最佳方案,用户和有关专家应该认真审查。如果确认该方案确实符合用户的需要,并且在现有条件下完全能够实现,则应该提请使用部门负责人进一步审批。在使用部门负责人也接受了分析员所推荐的方案之后,方可进入总体设计过程的下一步工作,即结构设计阶段。,实施总体设计的过程如下:,对于大型系统的设计,通常分为两个阶段:结构设计:确定系统由哪些模块组成,以及这些模块之间的相互关系。是总体设计阶段的任务。过程设计:确定每个模块的处理过程。是详细设计阶段的任务。,4功能分解:,为确定软件结构,分析员要结合算法描述仔细分析数据流图中的每个处理,将复杂功能分解成一系列比较简单的功能。同时应用IPO图或其他适当工具简述细化后每个处理的算法。,实施总体设计的过程如下:,5设计软件结构把模块组织成良好的层次系统,顶层模块调用它的下层模块以实现程序的完整功能,每个下层模块再调用更下层的模块完成程序的一个子功能,最下层模块完成最具体的功能。软件结构(由模块组成的层次系统)用层次图或结构图来描绘。如数据流图已经细化到适当的层次,则可以直接从数据流图映射出软件结构。,实施总体设计的过程如下:,6数据库设计数据库的应用越来越广泛,目前大多数的系统都要用到数据库技术。数据库设计是一项专门的技术,包括模式设计、子模式设计、完整性和安全性设计和优化处理等。7制定测试计划在软件开发的早期阶段提前考虑软件的测试计划,能促使软件设计人员在设计时注意提高软件的可测试性。,实施总体设计的过程如下:,8书写文档应编写以下文档记录总体设计的结果:(1)系统说明(包括用系统流程图描绘的系统实现方案、组成系统的物理元素清单、成本/效益分析;对最佳方案的概括描述、精化的数据流图、用层次图或结构图描绘的软件结构、用IPO图或其它工具(如PDL语言)描述的算法、模块间的接口关系,以及需求、功能和模块三者间的交叉参照关系);(2)用户手册(根据总体设计阶段的结果,修改更正需求分析阶段产生的初步的用户操作手册);(3)测试计划(包括测试策略、测试方案、预测的测试结果、测试进度计划等);(4)详细的实现计划;(5)数据库设计结果。,实施总体设计的过程如下:,可追溯性:确认该设计是否覆盖了所有已确定的软件需求,软件每一成份是否可追溯到某一项需求接口:确认该软件的内部接口与外部接口是否已经明确定义。模块是否满足高内聚和低耦合的要求,作用范围是否在其控制范围之内风险:确认该设计在现有技术条件下和预算范围内是否能按时实现实用性:确认该设计对于需求的解决方案是否实用技术清晰度:确认该设计是否以一种易于翻译成代码的形式表达可维护性:确认该设计是否考虑了方便未来的维护质量:确认该设计是否表现出良好的质量特征各种选择方案:是否考虑过其它方案,比较各种方案的标准是什么限制:评估对该软件的限制是否现实,是否与需求一致其它具体问题:对于文档、可测试性、设计过程.等进行评估,9审查和复审,-又称构件,是能够单独命名并独立地完成一定功能的程序语句的集合。例如高级语言中的过程、函数、子程序等都可作为模块。模块是构成程序的基本构件.,模块(module),模块,5.2设计原理,描述模块内部怎么做,描述该模块实现什么功能,该模块使用时的环境和条件,5.2.1模块化,模块化是软件的一个重要属性。模块化的特性提供了人们处理复杂的问题的一种方法,同时也使得软件能够被有效地管理。,目前模块化方法已为所有工程领域所接受。模块化设计带来了许多好处。一方面,模块化设计降低了系统的复杂性,使得系统容易修改;另一方面,也推动了系统各个部分的并行开发,从而提高了软件的生产效率。,模块化设计:就是按适当的原则把软件划分为一个个较小的,相关而又相对独立的模块。,这种“分而治之”的思想提供了模块化的根据:把复杂的问题分解成许多容易解决的小问题,原来的问题也就容易解决了。,根据前面的结论,我们可以得出下面的不等式:E(P1P2)E(P1)E(P2)这个不等式表明:单独解决问题P1和P2所需的工作量之和,比把P1和P2合起来作为一个问题来解决时所需的工作量要少。,有两个函数:C(x)表示问题x的复杂程度;E(x)表示解决问题x所需要的工作量(时间)。对于两个问题P1和P2,如果:C(P1)C(P2)则:E(P1)E(P2),根据人类解决一般问题的经验,另一个有趣的特性是:C(P1P2)C(P1)C(P2),C(P1+P2)C(P1)+C(P2)E(P1+P2)E(P1)+E(P2),软件工程基本定理,但是在一个软件系统的内部,各组成模块之间是相互关联的。模块划分的越多,各模块之间的联系也就越多。模块本身的复杂度和工作量虽然模块的变小而减小,模块的接口工作量却随着模块数的增加而增大,所以从左图中可以看到,每个软件都存在一个最小的成本区,把模块数控制在这一范围,可以使总的开发工作量保持最小。,我们在考虑问题时,集中考虑和当前问题有关的方面,而忽略和当前问题无关的方面,这就是抽象。或者说抽象就是抽出事物的本质特性而暂时不考虑它们的细节。,5.2.2抽象,软件工程过程的每一步,都是对软件解法的抽象层次的一次细化:在可行性研究阶段,软件被看作是一个完整的系统部分;在需求分析期间,我们使用在问题环境中熟悉的术语来描述软件的解法;当由总体设计阶段转入详细设计阶段时,抽象的程度进一步减少;最后,当源程序写出来时,也就达到了抽象的最低层。,逐步求精定义为:为了能集中精力于主要问题而尽量推迟对问题细节的考虑。,5.2.3逐步求精,奇妙的数字7+2,人类信息处理能力的限度,意思是说:人类信息处理的能力是有限的,分辨或记忆同类信息的数量一般不能超过5-9项(即7+-2),逐步求精作用:帮助软件工程师把精力集中在与当前开发阶段最相关的那些方面。,抽象与求精是一对互补的概念:抽象使得设计者能够说明过程和数据,同时却忽略低层细节,求精则帮助设计者在设计过程中逐步揭示出低层细节。,信息隐蔽是模块划分的一个原则,即每个模块的实现细节对于其它模块来说是隐蔽的。也就是说,模块中所包含的信息(包括数据和过程)不允许其它不需要这些信息的模块使用。局部化是指把一些关系密切的软件元素物理地放得彼此靠近,如在模块中使用局部数据元素。局部化有助于实现信息隐藏。,5.2.4信息隐藏和局部化,如何去分解一个软件才能得到最佳的模块组合?信息隐蔽原理认为:模块应当被这样规定和设计,使得包含在模块中的信息(过程或数据)对于其它不需要这些信息的模块来说,是不能访问的。只有那些为了完成软件的总体功能而必需在模块间交换的信息,才允许在模块间进行传递。,信息隐蔽对于软件的测试与维护都有很大的好处。因为对于软件的其它部分来说,绝大多数数据和过程都是隐蔽的,这样,在修改期间由于疏忽而引入的错误所造成的影响就可以局限在一个或几个模块内部,不至波及到软件的其他部分,从而提高模块的独立性。,例如,对于栈stack来说,可以定义它的操作有makenull(置空栈)、push(进栈)、pop(退栈)将这些操作所依赖的数据结构封装在实现栈的模块中,软件的其他部分可以直接使用这些操作,不必关心它的实现细节。一旦实现栈的模块里内部的部分数据结构发生改变,只要他相关操作的调用形式不变,则软件中其他所有使用这个栈的部分都可以不修改。像这样的模块结构具有很强的可移植性,在移植过程中,修改的工作量很小,发生错误的可能性也小。,例如,若一个模块只具有单一的功能且与其它模块没有太多的联系,则称此模块具有模块独立性模块独立性概括了把软件划分为模块时要遵守的准则,也是判断模块构造是否合理的标准。一般地,坚持模块的独立性是获得良好设计的关键:(1)模块化程度较高的软件容易开发;(2)模块化程度较高的软件也比较容易测试和维护。,5.2.5模块独立,模块的独立性是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其他模块的接口是简单的。,模块的独立性可以由两个定性标准度量:耦合用于衡量不同模块彼此间互相依赖(连接)的紧密程度;内聚用于衡量一个模块内部各个元素间彼此结合的紧密程度。模块独立性比较强的模块应是高内聚低耦合的模块。,模块的独立性,模块之间的相对独立性的度量。,模块功能强度的度量。,耦合是对一个软件结构内不同模块之间互联程度的度量。耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。在软件设计中应该追求模块间尽可能松散耦合的系统。在这样的系统中可以研究、测试或维护任何一个模块,而不需要对系统中的其他模块有很多的了解。此外,由于模块间联系简单,发生在一处的错误传播到整个系统的可能性就很小。,1、耦合,模块间的耦合,应该采取下述设计原则:尽量使用数据耦合,少用控制耦合,限制公共环境耦合的范围,完全不用内容耦合。,低,高,弱,强,耦合性,模块独立性,非直接耦合(NondirectCoupling)两个模块之间完全独立没有任何连接,它们之间的联系完全是通过主模块的控制和调用来实现的。非直接耦合的模块独立性最强。,数据耦合(DataCoupling)一个模块访问另一个模块时,彼此之间是通过简单数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的。若传递的参数中有控制信息,则这种耦合称为控制耦合.数据耦合是低耦合,系统中至少必须存在这种耦合,一般系统可以只包含数据耦合.控制耦合是中等程度的耦合,增加了系统的复杂度,在把模块适当分解之后通常可以用数据耦合代替它.,如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。这种耦合实质上是在单一接口上选择多功能模块中某项功能,因此对所控制模块的任何修改,都会影响控制模块。另外,控制耦合也意味着控制模块必须知道所控制模块内部的一些逻辑关系,像这些都降低模块的独立性。,控制耦合(ControlCoupling),特征耦合(StampCoupling),把整个数据结构作为参数传递而被调用的模块只需要使用其中一部分数据元素。,由于被调用的模块可以使用的数据多于它确实需要的数据,将导致对数据的访问失去控制,降低了数据的安全性。,外部耦合(ExternalCoupling)一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。公共耦合(CommonCoupling)若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。若两个模块共享的数据很多,都通过参数传递可能很不方便,这时可以利用公共环境耦合.,这是一个多个模块引用一个全程数据区的公共耦合模块,B、C和E都要存取全程数据区中的一个数据项,比如一个磁盘文件等。假设B读该项时,要调用模块C并对该项重新计算并进行写操作,如果C要是错误的写入时,则往下的处理模块中模块E读该项时,那么就发生错误。所以造成错误原因是模块C,而不是模块E。所以在多模块的公共耦合的结构中,设计时要特别小心,尽量少用或不用公共耦合。,公共耦合的复杂程度随耦合模块的个数增加而显著增加。若只是两模块间有公共环境,则公共耦合有两种情况:松散公共耦合和紧密公共耦合。,如果发生下列情形,两个模块之间就发生了内容耦合:(1)一个模块直接访问另一个模块的内部数据;(2)一个模块不通过正常入口转到另一模块内部;(3)两个模块有一部分程序代码重迭(只可能出现在汇编语言中);(4)一个模块有多个入口。,内容耦合(ContentCoupling),以上给出了7种耦合类型,这只是从耦合的机制上所做的分类,按耦合的强弱程度的排列只是相对的关系。但它给设计人员在设计程序结构时提供了一决策准则。实际上,开始时两个模块之间的耦合不只是一种类型,而是多种类型的混合。这就要求设计人员按照实际情况进行比较和分析,逐步加以改进,以提高模块的独立性。,内聚标志着一个模块内部各个元素间彼此结合的紧密程度。简单地说,理想内聚的模块只做一件事情。设计时应该力求做到高内聚,通常中等程度的内聚也是可以采用的,而且效果和高内聚相差不多。但是,坚决不要使用低内聚。,2、内聚,低,高,强功能单一,弱功能分散,内聚性,模块独立性,一个模块中各个部分都是完成某一具体功能必不可少的组成部分,或者说该模块中所有部分都是为了完成一项具体功能而协同工作,紧密联系,不可分割的。则称该模块为功能内聚模块。,功能内聚(FunctionalCohesion),功能性内聚是最高程度的内聚,优点是模块的功能明确,模块间耦合简单。,若一个模块内处理元素与同一个功能密切相关,且这些处理必须顺序执行(一个处理的输出数据作数据为下一个处理的输入),则称为顺序内聚。根据数据流图划分模块时,通常得到顺序内聚的模块,这些模块间的连接简单。,顺序内聚(InformationalCohesion),功能内聚和顺序内聚都是高内聚,如果一个模块内各功能部分都使用了相同的输入数据,或产生了相同的输出数据,则称之为通信内聚模块。通常,通信内聚模块是通过数据流图来定义的。,通信内聚(CommunicationCohesion),一个模块内的处理元素是相关的,且必须以特定次序执行。使用流程图做为工具设计程序时,把流程图中的某一部分划出组成模块,就得到过程内聚模块。例如,把流程图中的循环部分、判定部分、计算部分分成三个模块,这三个模块都是过程内聚模块。,过程内聚(ProceduralCohesion),时间内聚(ClassicalCohesion),时间内聚又称为经典内聚。这种模块的各个功能的执行与时间有关,通常要求所有功能必须在同一时间段内执行。例如模块完成各种初始化工作。,这种模块把几种相关的功能组合在一起,每次被调用时,由传送给模块的判定参数来确定该模块应执行哪一种功能。由于当调用时需要进行控制参数的传递,这就增加了模块间的耦合程度。,逻辑内聚(LogicalCohesion),若一个模块完成的任务在逻辑上相同或相似,如X,Y,Z,W分别调用A,B,C,D,而模块A,B,C,D完成的任务相似(如产生各种类型的全部输出),则我们把A,B,C,D合并成一个模块ABCD,那么我们称模块ABCD就是逻辑内聚模块,当模块内各部分之间没有联系,或者即使有联系,这种联系也很松散,则称这种模块为偶然内聚模块,它是内聚程度最低的模块。,偶然内聚(CoincidentalCohesion),例如,一些没有任何联系的语句可能在许多模块中重复使用,程序员为了节省存储,则把它们抽出来组成一个新的模块。这个模块就是偶然性内聚模块。,内聚和耦合是密切相关的,模块内的高内聚往往意味着模块间的低耦合。内聚和耦合都是进行模块化设计的有力工具。实践表明,内聚更重要,应该把更多注意力集中到提高模块的内聚程度上。,模块划分小结,设计时应力争做到高内聚,并且能够辨认出低内聚的模块,并采取措施进行修改,以提高模块的内聚程度、降低模块间的耦合程度,从而获得较高的模块独立性。,5.3启发规则,(1)改进软件结构提高模块独立性通过模块分解或合并,降低耦合提高内聚(2)模块规模应适中过大模块:分解后不应降低模块独立性过小模块:只有一个模块调用它时,可合并到上级模块(3)深度、宽度、扇出和扇入应适当深度表示软件结构中控制的层数。宽度是软件结构内同一个层次上的模块总数的最大值。扇出是一个模块直接控制的模块数目。扇入表明有多少个上级模块直接调用它。,程序的系统结构图,5.3启发规则,(4)模块的作用域应该在控制域之内作用域定义为受该模块内一个判定影响的所有模块的集合控制域是这个模块本身以及所有直接或间接从属于它的模块的集合。(5)力争降低模块接口的复
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 常州市人民医院甲状腺癌根治术主刀医师资质评审考核
- 漳州市中医院护理学科资源配置考核
- 厦门市人民医院重症监护技术考核
- 烟台市中医院脊髓电刺激植入术考核
- 宁波市人民医院用户权限管理与审计追踪试题
- 宜春市人民医院信息系统操作准入考核
- 2025年劳动合同赔偿协议
- 2025年知识产权侵权赔偿合同样本
- 2025年铁路货物运输合同(GF-91-0402)专项协议
- 厦门市人民医院护师职业发展规划考核
- 2025秋数学人教二年级(上) 校园小导游:第2课时 校园小导游
- 中医信息系统用户中医权限分级制度
- 2025年四川省广安市中考物理真题试卷及答案
- 2025年储能技术多元化在储能电站储能系统与储能设备互动中的应用报告
- 黄金回收协议书
- 粉尘回收安全协议书
- 航空服务艺术与管理专业介绍
- 新质生产力五要素
- 放假赔偿协议书范本
- 2024-2030年全球汽车级智能座舱SoC芯片行业现状、重点企业分析及项目可行性研究报告
- 冠状动脉微血管疾病诊断和治疗中国专家共识(2023版)解读
评论
0/150
提交评论