您好,欢迎访问三七文档
1软件设计2软件设计概述软件设计分为两个阶段概要设计(又称总体设计):确定软件系统的总体结构详细设计(又称过程设计):详细设计则是对概要设计结果进一步细化,给出目标系统的精确描述。软件设计的目标软件需求:解决“做什么”软件设计:解决“怎么做”3软件设计的任务问题结构(软件需求)软件结构从软件需求规格说明书出发,形成软的具体设计方案。映射4软件设计的任务数据流图数据字典加工策略数据设计体系结构设计接口设计过程设计5软件设计的任务分析模型设计模型目标系统逻辑模型目标系统物理模型6系统概要设计7概要设计概要设计的过程需求文档概要设计文档设计软件结构设计系统构架设计数据结构需求框架系统构架数据环境子系统功能需求数据需求软件结构数据结构图14.1概要设计过程8概要设计概要设计的内容制订规范系统构架设计软件结构设计公共数据结构设计安全性设计故障处理设计可维护性设计编写文档概要设计评审9概要设计软件的构架设计概要设计通过需求框架来映射系统构架。例如:利用需求分析中的高层数据流程图对系统基本工作流程的描述来映射系统的基本结构,使得需求分析中对系统的逻辑描述转换为概要设计中对系统的物理描述。系统构架设计的步骤定义子系统。定义子系统外部接口。定义系统物理构架。10软件设计概念与原则11主要内容模块与模块化抽象与逐步求精信息隐蔽与局部化模块独立性软件结构的设计原则12模块化(Modularity)模块:独立命名和独立编址调用的一组程序语句,即数据说明、可执行语句等程序对象的集合。模块化:把软件系统划分为若干个模块,每一个模块完成一个相对独立的子功能,把这些模块组合起来,满足问题的求解需求。把问题/子问题的分解与软件开发中的系统/子系统或系统/模块对应起来,就能够把一个大而复杂的软件系统划分成易于理解的比较单纯的模块结构。13模块化模块化是好的软件设计的一个基本准则复杂问题较小问题分解可减小解题所需的总的工作14为什么要模块化设函数C(x)定义问题x的复杂程度函数E(x)确定解决问题x需要的工作量1.一个问题越复杂,解决它所需要的工作量就越大。即:C(P1)C(P2),则E(P1)E(P2)15为什么要模块化2.如果把一个大而复杂的问题分解成一些容易处理的小问题后,所需工作量会减少。即:C(P1+P2)C(P1)+C(P2),且E(P1+P2)E(P1)+E(P2)。3.影响软件的总的工作量的因素有两个:模块复杂性成本,模块接口成本。16为什么要模块化模块化和软件成本成本或工作量模块数量软件总成本集成成本成本/模块M最小成本区域17抽象化软件系统进行模块设计时,可有不同的抽象层次。在最高的抽象层次上,可以使用问题所处环境的语言概括地描述问题的解法。因此,描述问题时,可以使用面向问题的术语。在较低的抽象层次上,则采用过程化的方法。实现时,采用能够直接实现的方式描述。18过程的抽象在软件计划阶段,将软件当作整个计算机系统中的一个元素来看待。在软件需求分析阶段,用“问题所处环境的为大家所熟悉的术语”来描述软件的解决方法。在从概要设计到详细设计的过程中,抽象化的层次逐次降低。当产生源程序时到达最低抽象层次。19信息隐蔽每个模块的实现细节对于其它模块来说是隐蔽的。也就是说,模块中所包含的信息(包括数据和过程)不允许其它不需要这些信息的模块使用。信息隐蔽的目的:提高模块的独立性,减少修改或维护时的影响面。20信息局部化把关系密切的软件元素物理地放得彼此靠近。优点:可维护性好可靠性好可理解性好21模块独立性模块独立性:软件系统中每个模块只涉及软件要求的具体的子功能(功能是单一的),而和软件系统中其它的模块的接口是简单的。模块完成独立的功能符合信息隐蔽和信息局部化原则模块间关连和依赖程度尽量小衡量模块独立性的准则耦合性:模块之间的互相联系的紧密程度的度量。内聚性:是模块功能强度(一个模块内部各个元素彼此结合的紧密程度)的度量。模块独立性比较强的模块应是高内聚低耦合的模块。22模块间的耦合低低耦合无直接耦合强耦合性数据耦合模块独立性标记耦合中等程度耦合控制耦合较强耦合外部耦合公共耦合高强耦合内容耦合弱23非直接耦合(NondirectCoupling)如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,这就是非直接耦合。这种耦合的模块独立性最强。24数据耦合(DataCoupling)如果一个模块访问另一个模块时,彼此之间是通过简单数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的,则称这种耦合为数据耦合。数据耦合属松散耦合。开发票计算水费单价数量金额25标记耦合(StampCoupling)如果一组模块通过参数表传递记录信息,就是标记耦合。这个记录是某一数据结构的子结构,而不是简单变量“住户情况”是一个数据结构,图中模块都与此数据结构有关。“计算水费”和“计算电费”本无关,由于引用了此数据结构产生依赖关系,它们之间也是标记偶合。计算水电费计算水费计算电费水费电费26将标记耦合修改为数据耦合举例计算水电费计算水费计算电费本月用水量本月用电量水费电费27控制耦合(ControlCoupling)如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。28控制耦合举例A计算平均分或最高分B平均/最高(控制信号)成绩读入分数输出结果计算平均分计算最高分平均/最高?B29控制耦合控制耦合增加了理解和编程的复杂性,调用模块必须知道被调模块的内部逻辑,增加了相互依赖去除模块间控制耦合的方法:(1)将被调用模块内的判定上移到调用模块中进行(2)被调用模块分解成若干单一功能模块30改控制耦合为数据耦合举例A计算平均分B1平均成绩最高成绩计算最高分B231外部耦合(ExternalCoupling)一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。一组模块均与同一外部环境关联(例如,I/O模块与特定的设备、格式和通信协议相关联),它们之间便存在外部耦合。外部偶合必不可少,但这种模块数目应尽量少。32公共耦合(CommonCoupling)若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。公共数据区指:全局数据结构共享通讯区内存公共覆盖区等33公共耦合的复杂程度随耦合模块的个数增加而显著增加。若只是两模块间有公共数据环境,则公共耦合有两种情况。松散公共耦合和紧密公共耦合。公共耦合(CommonCoupling)34公共耦合存在的问题软件可理解性降低诊断错误困难软件可维护性差软件可靠性差(公共数据区及全程变量无保护措施)慎用公共数据区和全程变量!!!35内容耦合(ContentCoupling)如果发生下列情形,两个模块之间就发生了内容耦合一个模块直接访问另一个模块的内部数据一个模块不通过正常入口转到另一模块内部两个模块有一部分程序代码重迭(只可能出现在汇编语言中)一个模块有多个入口36B内容耦合(ContentCoupling)一模块直接访问另一模块的内部信息(程序代码或数据)ABA模块代码重叠Entry1……Entry1……多入口模块最不好的耦合形式!!!37降低模块间耦合度使用程度低的耦合尽量使用数据耦合少用控制耦合限制公共耦合的范围坚决避免使用内容耦合降低接口的复杂性38模块内聚低偶然内聚弱内聚性逻辑内聚模块独立性时间内聚过程内聚通信内聚顺序内聚高功能内聚强39偶然内聚(巧合内聚)模块内各部分间无联系ABCMMOVEOTORREADFILEFMOVESTOT模块M中的三个语句没有任何联系缺点:可理解性差,可修改性差例:40逻辑内聚模块ABCEFGABCEFGA1B1C1EFG模块内部逻辑E、F、G逻辑功能相似,组成新模块EFG缺点:增强了耦合程度(控制耦合)不易修改,效率低公用代码段公用代码段41逻辑内聚(LogicalCohesion)这种模块把几种相关的功能组合在一起,每次被调用时,由传送给模块的判定参数来确定该模块应执行哪一种功能。42时间内聚(ClassicalCohesion)时间内聚又称为经典内聚。这种模块大多为多功能模块,但模块的各个功能的执行与时间有关,通常要求所有功能必须在同一时间段内执行。例如:初始化系统模块、系统结束模块、紧急故障处理模块等均是时间性聚合模块。43过程内聚(ProceduralCohesion)模块内各处理成分相关,且必须以特定次序执行读入成绩单审查成绩单统计成绩打印成绩读入并审查成绩单统计并打印成绩单44通信内聚(CommunicationCohesion)如果一个模块内各功能部分都使用了相同的输入数据,或产生了相同的输出数据,则称之为通信内聚模块。通常,通信内聚模块是通过数据流图来定义的。45通信内聚模块例产生工资报表计算平均工资职工工资记录职工工资报表平均工资产生职工工资报表并计算平均工资模块46通信内聚(CommunicationCohesion)47顺序内聚顺序内聚:如果一个模块各成分都与同一个功能密切相关,一个成分的输出作为另一个成分的输入,各成分必须按顺序执行,则称为顺序内聚建立方程组系数矩阵高斯消去法回代48功能内聚(FunctionalCohesion)一个模块中各个部分都是完成某一具体功能必不可少的组成部分,或者说该模块中所有部分都是为了完成一项具体功能而协同工作,紧密联系,不可分割的。则称该模块为功能内聚模块。49内聚与耦合密切相关,同其它模块强耦合的模块意味者弱内聚,强内聚模块意味着与其它模块间松散耦合。设计目标:高内聚、低耦合50耦合、内聚与模块独立性关系耦合与内聚都是模块独立性的定性标准,都反映模块独立性的良好程度。耦合是直接的主导因素,内聚则辅助耦合共同对模块独立性进行衡量。51软件结构的设计准则改进软件结构提高模块独立性(低耦合高内聚)提高模块独立性的方法——分解与合并ABABC1C1C2CCC2C分解AC1BC2C52软件结构的设计准则模块规模要适中深度、宽度、扇入及扇出要适当深度宽度(同一层最大模块数)扇出(一个模块直接调用的模块数)扇入(调用一个给定模块的模块个数)53软件结构的设计准则54软件结构的设计准则模块的作用域应该在控制域之内作用域---该模块内一个判断影响的模块的集合。控制域---该模块本身以及所有直接或间接从属于它的模块的集合。改进软件结构以符合作用域是控制域子集的方法将包含判定的模块合并到它的调用模块中将受判定影响的模块下移到控制范围之内将判定上移到足够高的位置模块A的控制域:{A、B、C、D}模块A的作用域:{A、C、D}ABCD55软件结构的设计准则将包含判定的模块合并到它的调用模块中,从而使判定处于足够高的位置。56软件结构的设计准则将受判定影响的模块下移到控制范围内。把判定上移到足够高的位置。57软件结构的设计准则力争降低模块接口的复杂程度模块的接口要简单、清晰、含义明确,便于理解,易于实现、测试与维护。设计单入口单出口的模块模块间不要出击内容耦合。模块功能应该可以预测只要输入的数据相同就产生同样的输出,这个模块的功能就是可以预测的。带有内部“存储器”的模块的功能可能是不可预测的,因为它的输出可能取决于内部存储器(例如某个标记)的状态。58结构化设计方法(StructureDesign,SD)59软件结构图(SCStructureChart)SD方法在概要设计中的主要表达工具用来描述软件的模块组成及其调用关系描绘软件结构的图形工具60软件结构图的组成方框表示模块,反映模块功能方框之间的箭头表示模块之间的调用关系调用线旁的注释箭头表示调用中来回传递的数据流辅助符号弧型符号表示
本文标题:第14章软件设计.
链接地址:https://www.777doc.com/doc-2153557 .html