您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 软件工程课件-第4章-
总体的基本目的就是回答:“概括地说,系统应该如何实现?”。在软件开发时期中,设计阶段是最富有活力、最需要发挥创造精神的阶段。在软件需求分析阶段,已搞清楚了软件“做什么”的问题,并把这些需求通过规格说明书描述了出来,这也是目标系统的逻辑模型。进入了设计阶段,要把软件“做什么”的逻辑模型变换为“怎么做”的物理模型,即着手实现软件的需求,并将设计的结果反映在“设计规格说明书”文档中,所以软件设计是一个把软件需求转换为软件表示的过程,最初这种表示只是描述了软件的总体的体系结构,称为软件总体设计或结构设计。然后对结构进一步细化,称为详细设计或结构设计。总体设计4.1总体设计的过程4.2软件设计的概念和原理4.3启发式规则4.4图形工具4.5面向数据流的设计方法4.6小结软件设计在开发阶段中的重要性•总体设计要着手实现软件的需求,即要着手解决“怎么做”的问题。•基本目的:就是回答“概括地说,系统应该如何实现?”这个问题。•重要任务:设计软件的结构,也就是要确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。•必要性:可以站在全局高度上,花较少成本,从较抽象的层次上分析对比多种可能的系统实现方案和软件结构,从中选出最佳方案和最合理的软件结构,从而用较低成本开发出较高质量的软件系统。4.1总体设计的过程想供选择的方案选取合理的方案推荐最佳方案功能分解设计软件结构数据库设计制定测试计划书写文档审查和复审软件设计的任务基本任务:1、设计软件系统结构(简称软件结构)为了实现目标系统,最终必须设计出组成这个系统的所有程序和数据库(文件),对于程序,则首先进行结构设计,具体为:结构设计•(1)采用某种设计方法,将一个复杂的系统按功能划分成模块。•(2)确定每个模块的功能。•(3)确定模块之间的调用关系。•(4)确定模块之间的接口,即模块之间传递的信息。•(5)评价模块结构的质量。从以上内容看,软件结构的设计是以模块为基础的,在需求分析阶段,已经把系统分解成层次结构。设计阶段,以需求分析的结果为依据,从实现的角度进一步划分为模块,并组成模块的层次结构。•软件结构的设计是总体设计关键的一步,直接影响到下一阶段详细设计与编码的工作。软件系统的质量及一些整体特性都在软件结构的设计中决定。因此应由经验丰富的软件人员担任,采用一定的设计方法,选取合理设计的方案。2、数据结构及数据库设计对于大型数据处理的软件系统,除了控制结构的模块设计外,数据结构与数据库设计也是重要的。•(1)数据结构的设计。逐步细化的方法也适用于数据结构的设计。(2)数据库设计。指数据存储文件的设计,主要进行以下几方面设计:①概念设计。在数据分析的基础上,采用自底向上的方法从用户角度进行视图设计,一般用ER模型来表示数据模型,这是一个概念模型。②逻辑设计。③物理设计。3.编写总体设计文档•主要有:(1)总体设计说明书。(2)数据库设计说明书,主要给出所使用的DBMS简介、数据库的概念模型、逻辑设计、结果。(3)用户手册,对需求分析阶段编写的用户手册进行补充。(4)修订测试计划,对测试策略、方法、步骤提出明确要求。4.评审•最后应该对总体设计的结果进行严格的技术审查和复审,这是在所有步骤中必不可少的,但也是最容易忽视的,请大家勿必注意到这一步。4.2软件设计的概念和原理4.2.1模块化4.2.2抽象4.2.3信息隐蔽和局部化4.2.4模块独立4.2.1模块(module)化•模块:在程序中是数据说明、可执行语句等程序对象的集合,或者是单独命名和编址的元素,如高级语言中的过程、函数、子程序等等。在软件的体系结构中,模块是可组合、分解和更换的单元。模块具有以下几种基本属性:•接口:指模块的输入与输出。•功能:指模块实现什么功能。•逻辑:描述内部如何实现要求的功能及所需的数据。•状态:该模块的运行环境,即模块的调用与被调用关系。•功能、状态与接口反映模块的外部特性,逻辑反映它的内部特性。•模块化:指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能。模块化是软件解决复杂问题所具备的手段,为了说明这一点,可将问题的复杂性和工作量的关系进行推理。设问题x,表示它的复杂性函数为C(x),解决它所需要的工作量函数为E(x)。对于问题P1和P2,如果C(P1)>C(P2)即P1比P2复杂那么E(P1)>E(P2)即问题越复杂,所需要的工作量越大。根据解决一般问题的经验,规律是:C(P1+P2)>C(P1)+C(P2)即一个问题由两个问题组合而成的复杂度大于分别考虑每个问题的复杂度之和。这样,可推出:E(P1+P2)>E(P1)+E(P2)由此可见,开发一个大而复杂的软件系统,将它进行适当的分解,不但可降低其复杂性,还可减少开发工作量,从而降低开发成本,提高软件生产率,这就是模块化的依据。模块化和软件成本•如果无限地分割软件,最后为了开发软件而需要的工作量也就小得可以忽略了?•当模块数目增加时每个模块将减小,开发单个模块需要的成本(工作量)确实减小了;但是随着模块数目增加,设计模块间接口所需要的工作量将增加。4.2.2抽象抽象:是认识复杂现象过程中使用的思维工具,即抽出事物本质的共同特性而暂不考虑它的细节,不考虑其它因素。4.2.3信息隐蔽和局部化•信息隐蔽:把系统分解为模块时应该遵守的指导思想,在设计和确定模块时,使得一个模块内包含的信息(过程或数据),对于不需要这些信息的其他模块来说,是不能访问的。信息隐藏的目的•是为了提高模块的独立性,当修改或维护模块时减少把一个模块错误扩散到其它模块中去的机会。4.2.4模块独立性(moduleindependence)模块独立性:概括了把软件划分为模块时要遵守的准则,也是判断模块构造是不是合理的标准。坚持模块的独立性,一般认为是获得良好设计的关键。每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。1、耦合性(coupling)也称块间的联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。(1)非直接耦合(NoDirectCoupling)。没有信息传递(2)数据耦合(DataCoupling)。参数:简单变量(3)特征耦合(StampCoupling)。参数:数据结构返回耦合性(coupling)(4)控制耦合(ControlCoupling)。传递:开关量、标志等•(5)外部耦合(ExternalCoupling).访问一个全局量。•(6)公共耦合(CommonCoupling)。访问的是全局变量或数据结构等•(7)内容耦合(ContentCoupling)。直接调用另一模块的数据或直接转移到另一模块中去。123456弱耦合中耦合较强耦合强耦合弱强模块间的耦合2、内聚性(cohesion)又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语句之间、程序段之间)联系的越紧密,则它的内聚性就越高,内聚性有以下几种类型:•(1)偶然性内聚(CoincidentalCohesion):块内各组成成份在功能上是互不相关的。•(2)逻辑内聚(LogicalCohesion):通常由若干个逻辑功能相似的成份组成。•(3)时间内聚(TemporalCohesion):这类模块所含的成分,是由相同的执行时间将它们联结到一起的。巧合内聚(CoincidentalCohesion)巧合内聚又称为偶然内聚。当模块内各部分之间没有联系,或者即使有联系,这种联系也很松散,则称这种模块为巧合内聚模块,它是内聚程度最低的模块。逻辑内聚(LogicalCohesion)这种模块把几种相关的功能组合在一起,每次被调用时,由传送给模块的判定参数来确定该模块应执行哪一种功能。时间内聚(ClassicalCohesion)时间内聚又称为经典内聚。这种模块大多为多功能模块,但模块的各个功能的执行与时间有关,通常要求所有功能必须在同一时间段内执行。例如初始化模块和终止模块。•(4)过程性内聚(proceduralcohesion):当一个模块中包含的一组任务必需按照某一特定的次序执行时,就称为过程性模块。•(5)通信内聚(CommunicationalCohesion):这类模块的标志是,模块内部的各个成份都使用同一个输入数据,或者产生同一个输出数据。它们借公用数据而联系在一起,故称为通讯性内聚。过程内聚(ProceduralCohesion)使用流程图做为工具设计程序时,把流程图中的某一部分划出组成模块,就得到过程内聚模块。例如,把流程图中的循环部分、判定部分、计算部分分成三个模块,这三个模块都是过程内聚模块。通信内聚(CommunicationCohesion)如果一个模块内各功能部分都使用了相同的输入数据,或产生了相同的输出数据,则称之为通信内聚模块。通常,通信内聚模块是通过数据流图来定义的。信息内聚(InformationalCohesion)这种模块完成多个功能,各个功能都在同一数据结构上操作,每一项功能有一个唯一的入口点。这个模块将根据不同的要求,确定该执行哪一个功能。由于这个模块的所有功能都是基于同一个数据结构(符号表),因此,它是一个信息内聚的模块。•信息内聚模块可以看成是多个功能内聚模块的组合,并且达到信息的隐蔽。即把某个数据结构、资源或设备隐蔽在一个模块内,不为别的模块所知晓。•(6)顺序内聚(SequentialCohesion):这类模块中的各组成部分是顺序执行的。在通常情况下,一个处理框的输出就是下一个处理框的输入。•(7)功能内聚(FunctionalCohesion):在这类模块中,所有的成份结合在一起,用于完成一个单一的功能。功能内聚(FunctionalCohesion)一个模块中各个部分都是完成某一具体功能必不可少的组成部分,或者说该模块中所有部分都是为了完成一项具体功能而协同工作,紧密联系,不可分割的。则称该模块为功能内聚模块。•“一个模块,一个功能”,已成为模块化设计的一条准则,也是设计人员争取的目标。1234567低内聚中内聚高内聚弱强模块内聚返回•4.3启发式规则•改进软件结构提高模块独立性•模块规模应该适中•深度、宽度、扇入和扇出都应适当•模块的作用域应该在控制域之内•力争降低模块接口的复杂程度•设计单入口单出口的模块•模块功能应该可以预测4.3.1改进软件结构提高模块独立性划分模块时尽量做到高内聚,低耦合,保持模块相对独立性,并以此原则优化初始的软件结构。•(1)如果若干模块之间耦合强度过高,每个模块内功能不复杂,可将它们合并,以减少信息的传递和公共区的引用。•(2)若有多个相关模块,应对它们的功能进行分析,消去重复功能。4.3.2模块规模应该适中•在考虑模块的独立性同时,为了增加可理解性,模块的大小最好在50-150条语句左右,可以用1-2页打印纸打印,便于人们阅读与研究。•模块的大小要适中模块的大小,可以用模块中所含语句的数量的多少来衡量。把模块的大小限制在一定的范围之内。通常规定其语句行数在50~100左右,保持在一页纸之内,最多不超过500行。4.3.3深度、宽度、扇入和扇出都应适当•深度是软件结构设计完成后观察到的情况,能粗略地反映系统的规模和复杂程度,宽度也能反映系统的复杂情况。宽度与模块扇出有关,一个模块的扇出太多,说明本模块过分复杂,缺少中间层。单一功能模块的扇入数大比较好,说明本模块为上层几个模块共享的共用模块,重用率高。但是不能把彼此无关的功能凑在一起形成一个通用的超级模块,虽然它扇入高,但低内聚。因此非单一功能的模块扇入高时应重新分解,以消除控制耦合的情况。软件结构从形态上,总的考虑是顶层扇出数较高一些,中间层扇出数较低一些,底层扇入数较高一些。程序的系统结构图4.3.4模块的作用域应该在控制域之内•一个模块的作用范围应在其控制范围之内,且判定所在的模块应与受其影响的模块在层次上尽量靠近
本文标题:软件工程课件-第4章-
链接地址:https://www.777doc.com/doc-1786564 .html