软件工程课本讲解第3章软件设计理论(第3章+第8章.ppt_第1页
软件工程课本讲解第3章软件设计理论(第3章+第8章.ppt_第2页
软件工程课本讲解第3章软件设计理论(第3章+第8章.ppt_第3页
软件工程课本讲解第3章软件设计理论(第3章+第8章.ppt_第4页
软件工程课本讲解第3章软件设计理论(第3章+第8章.ppt_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,结构图(SC),结构图是精确表达程序结构的图形表示方法 结构图反映程序中模块之间的层次调用关系和联系:它以特定的符号表示模块、模块间的调用关系和模块间信息的传递,2, 模块:模块用矩形框表示,并用模块的名字标记它。,结构图的主要内容,3, 模块的调用关系和接口:模块之间用单向箭头联结,箭头从调用模块指向被调用模块。,4, 模块间的信息传递:当一个模块调用另一个模块时,调用模块把数据或控制信息传送给被调用模块,以使被调用模块能够运行。而被调用模块在执行过程中又把它产生的数据或控制信息回送给调用模块,5, 两个辅助符号:在模块A的箭头尾部标以一个菱形符号,表示模块A有条件地调用另一个模块B。当一个在调用箭头尾部标以一个弧形符号,表示模块A反复调用模块C和模块D。,6,程序的系统结构图(主从关系),7,同一名字的模块在结构图中仅出现 调用关系只能从上到下 不严格表示模块的调用次序,习惯从左到右,有时为减少交叉,适当调整同一层模块左右位置,画结构图应注意:,8,模块化,软件系统的模块化是指整个软件被划分成若干单独命名和可编址的部分,称之为模块。这些模块可以被组装起来以满足整个问题的需求。 把问题子问题的分解与软件开发中的系统子系统或系统模块对应起来,就能够把一个大而复杂的软件系统划分成易于理解的比较单纯的模块结构。,9,模块的独立性,模块(Module) “模块”,又称“组件”。一般指用一个名字可调用的一段程序。它一般具有如下三个基本属性: 功能:描述该模块实现什么功能 逻辑:描述模块内部怎么做 状态:该模块使用时的环境和条件,即模块的调用与被调用关系,10,在描述一个模块时,还必须按模块的外部特性与内部特性分别描述 模块的外部特性 模块的模块名、参数表、其中的输入参数和输出参数,以及给程序以至整个系统造成的影响 模块的内部特性 完成其功能的程序代码和仅供该模块内部使用的数据,外部特性是概要设计的任务,内部特性是详细设计的任务,11,模块独立性 模块独立性, 是指软件系统中每个模块只涉及软件要求的具体的子功能, 而和软件系统中其它的模块的接口是简单的 例如, 若一个模块只具有单一的功能且与其它模块没有太多的联系, 则称此模块具有模块独立性 一般采用两个准则度量模块独立性。即模块间耦合性和模块的内聚性,12,耦合是模块之间的互相连接的紧密程度的度量。 内聚是模块功能强度(一个模块内部各个元素彼此结合的紧密程度)的度量。 模块独立性比较强的模块应是高内聚低耦合的模块。,13,模块间的耦合,模块间的耦合程度强烈影响系统的可理解性、可测试性、可靠性和可维护性。,14,模块间耦合的类型,低 无直接耦合 耦 数据耦合 合 标记耦合 性 控制耦合 公共耦合 高 内容耦合,模 块 独 立 性,弱,(低耦合),强,(中耦合),(较强耦合),(强耦合),15,无耦合没有依赖关系,松散耦合有 少量依赖关系,紧密耦合有 很多依赖关系,16,非直接耦合(Nondirect Coupling) 两个模块之间没有直接关系,它们之 间的联系完全是通过主模块的控制和 调用来实现的。 非直接耦合的 模块独立性最 强。,17,数据耦合 (Data Coupling) 一个模块访问另一个模块时,彼此之间是通过简单数据参数 (不是控制参数、公共数据结构或外部变量) 来交换输入、输出信息的。,18,标记耦合 (Stamp Coupling) 一组模块通过参数表传递记录信息,就是标记耦合。这个记录是某一数据结构的子结构,而不是简单变量。,即 传递的这个数据结构的地址:如两个模块通过传递数据结构 (不是简单数据,而是记录、数组等)加以联系,或都与一个数据结构有关系, 则称这两个模块间存在标记偶合。,记录名,数组名,WRITE (记录地址),READ(记录地址),标记耦合举例,计算水电费,计算水费,计算电费,住户情况,水费,电费,住户情况,“住户情况”是一个数据结构,图中模块都 与此数据结构有关. “计算水费”和“计算电费”本无关,由于 引用了此数据结构产生依赖关系,它们之间 也是标记偶合.,将标记耦合修改为数据耦合举例,计算水电费,计算水费,计算电费,本月 用水量,本月 用电量,水费,电费,21,控制耦合 (Control Coupling) 如果一个模 块通过传送开 关、标志、名 字等控制信息, 明显地控制选 择另一模块的 功能,就是控 制耦合。,控制耦合举例,A,计算平均分 或最高分,B,平均/最高 (控制信号),成绩,读入信息,输出结果,计算平均分,计算最高分,平均/最高?,B,控制耦合增加了理解和编程的复 杂性,调用模块必须知道被调模 块的内部逻辑,增加了相互依赖 去除模块间控制耦合的方法: (1)将被调用模块内的判定上移到调 用模块中进行 (2)被调用模块分解成若干单一功 能模块,改控制耦合为数据耦合举例,A,计算平均分,B1,平均成绩,最高成绩,计算最高分,B2,25,(本书将其合并到公共耦合)外部耦合 一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。,即直接访问全局简单变量,26,公共耦合(Common Coupling) 若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。,A,B,A,B,全局数据结构,27,公共耦合的复杂程度随耦合模块的个数增加而显著增加。若只是两模块间有公共数据环境,则公共耦合有两种情况。松散公共耦合和紧密公共耦合。,(1)软件可理解性降低 (2)诊断错误困难 (3)软件可维护性差, (4)软件可靠性差 (公共数据区无保护措施) 慎用公共数据区和全程变量!,公共耦合存在的问题:,29,内容耦合 (Content Coupling) 如果发生下列情形,两个模块之间就发生了内容耦合 (1) 一个模块直接访问另一个模块的内部数据; (2) 一个模块不通过正常入口转到另一模块内部; (3) 两个模块有一部分程序代码重迭(只可能出现在汇编语言中); (4) 一个模块有多个入口。,最不好的耦合形式 !,模块化设计的原则和目标,耦合是影响软件复杂程度和设计 质量的重要因素 目标:建立模块间耦合度尽可能 松散的系统,如何降低模块间耦合度:,(1) 尽量使用数据耦合 少用控制耦合 限制公共耦合的范围 坚决避免使用内容耦合 (2) 降低接口的复杂性,32,c,模块内聚,一个模块内部元素在功能上相互关联的强度 设计目标:高内聚 (模块在软件过程中 完成单一的任务),内聚性有以下几种类型: 偶然内聚 逻辑内聚 时间内聚 通信内聚 顺序内聚 功能内聚 低,高,内聚性,内聚性也称块内联系,指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语句之间、程序段之间)联系的越紧密,则它的内聚性就越高。,33,功能内聚 (Functional Cohesion) 一个模块中各个部分都是完成某一具体功能必不可少的组成部分,或者说该模块中所有部分都是为了完成一项具体功能而协同工作,紧密联系,不可分割的。则称该模块为功能内聚模块。,内聚性最强,例如:一个模块只完成矩阵加法运算或只打印输出一种特定的表格功能。,34,顺序内聚 如果一个模块内的处理元素是密切相关于同一功能且必须顺序执行,前一功能的输出就是下一功能元素的输入,则称为顺序内聚。 使用流程图做为工具设计程序时,把流程图中的某一部分划出组成模块,就得到顺序内聚模块。例如,把流程图中的循环部分、判定部分、计算部分组成一个模块,这一个模块内各元素就是顺序内聚模块。,顺序内聚模块,读入 成绩单,审查 成绩单,统计 成绩,打印 成绩,读入并审查成绩单,统计并打印成绩单,36,通信内聚(信息内聚) (Informational Cohesion) 这种模块完成多个功能,各个功能都在同一数据结构上操作,每一项功能有一个唯一的入口点。这个模块将根据不同的要求,确定该执行哪一个功能。由于这个模块的所有功能都是基于同一个数据结构(符号表),因此,它是一个信息内聚的模块。,37,几个加工同时引用一个共同的数据,38,通信内聚的另一种 (Communication Cohesion) 如果一个模块内各功能部分都使用了相同的输入数据,或产生了相同的输出数据,则称之为通信内聚模块。,39,40,时间内聚(瞬时性) (Classical Cohesion) 时间内聚又称为经典内聚。这种模块大多为多功能模块,但模块的各个功能的执行与时间有关,通常要求所有功能必须在同一时间段内执行。例如初始化模块和终止模块。,41,例:初始化模块:为某变量置初值、打开某文件等,例如,模块完成各种初始化工作或当一个模块处理意外故障时,这个模块必须在中断处理的同时完成关闭文件、报警和保留现场等任务,这就构成了时间内聚。 把需要同时执行的动作组合在一起形成的模块为时间内聚模块。如初始化一组变量,同时打开若干文件,同时关闭文件等,都与特定时间有关。时间内聚比逻辑内聚程度高一些,因为时间内聚模块中的各部分都要在同一时间内完成。但是由于这样的模块往往与其他模块联系的比较紧密,如初始化模块对许多模块的运行有影响,因此和其他模块耦合的程度较高。,42,逻辑内聚(Logical Cohesion) 这种模块把几种 相关的功能组合 在一起,每次被 调用时,由传送 给模块的判定参 数来确定该模块 应执行哪一种功 能。,逻辑内聚模块,A,B,C,E,F,G,A,B,C,EFG,A1,B1,C1,EFG模块内部逻辑,E、F、G逻辑 功能相似,组 成新模块EFG,缺点:增强了耦合程度(控制耦合) 不易修改,效率低,公用代码段,公用代码段,44,偶然内聚(Coincidental Cohesion) 偶然内聚 (巧合内聚)。当模块内各部分之间没有联系,或者即使有联系,这种联系也很松散, 则称这种模 块为偶然内 聚模块,它 是内聚程度 最低的模块。,45,对于一个模块而言,模块自身的内聚越强,模块间的耦合就越小,模块所具有的独立性就越好。可以说高内聚低耦合是我们进行软件设计的一贯原则。,设计目标: 力争强内聚、弱耦合,耦合与内聚都是模块独立性的定性标准,都反映模块独立性 的良好程度。耦合与内聚是相互关联的。软件概要设计的目标是力求增加模块的内聚,尽量减少模块间的耦合,但增加内聚比减少耦合更重要,应当把更多的注意力集中到提高模块的内聚程度上来。,46,信息隐蔽,信息隐蔽是指,每个模块的实现细节对于其它模块来说是隐蔽的。也就是说,模块中所包含的信息(包括数据和过程)不允许其它不需要这些信息的模块使用。,局部化:是把一些关系密切的软件元素物理地放得彼此靠近。显然, 局部化有助于实现信息隐藏。 “隐藏”意味着有效的模块化可以通过定义一组独立的模块而实现,这些独立的模块彼此间仅仅交换那些为了完成系统功能而必须交换的信息。,模块优化原则,如何分解一个软件才能得到最佳的模块组合呢?,47,将初始SC根据模块独立性原 则进行精化,对模块进行合并、分 解修改、调整,得到高内聚、低 耦合模块,得到易于实现、易于 测试和易于维护的软件结构,产 生设计文档的最终SC。,3.4.4 软件模块结构的改进,48,改进软件结构设计的指导原则 (软件结构设计的启发式规则),(1)模块功能的完善化 (2)消除重复功能 (3)将模块的影响限制在模块的控制范围内 (4)深度、宽度、扇出和扇入适中 (5)模块大小适中 (6)降低模块接口的复杂性 (7)模块功能可预测 (8)避免模块的病态连接 (9)根据设计约束和可移植性要对软件打包,49,模块功能的完善化 一个完整的模块应当有以下几部分: 执行规定的功能的部分; 出错处理的部分。当模块不能完成规定的功能时,必须回送出错标志,出现例外情况的原因。 如果需要返回数据给它的调用者,在完成数据加工或结束时, 应当给它的调用者返回一个状态码。,50,消除重复功能,改善软件结构 完全相似:在结构上完全相似,可能只是在数据类型上不一致。此时可以采取完全合并的方法。 局部相似:找出其相同部分,分离出去,重新定义成一个独立的下一层模块。还可以与它的上级模块合并。,51,52,模块的作用范围应在控制范围之内 模块的控制范围包括它本身及其所有的从属模块。 模块的作用范围是指模块内一个判定的作用范围,凡是受这个判定影响的所有模块都属于这个判定的作用范围。 如果一个判定的作用范围包含在这个判定所在模块的控制范围之内,则这种结构是简单的,否则,它的结构是不简单的。,53,C,H,D,E,G,X,F,将模块的影响限制 在模块的控制范围内,A,I,L,J,K,B,模块C的控制范围: C、D、E、F、G、H,如果模块 C 作出的决策影响了模块L,L超出了C 的控制范围,54,例如在左下图中,模块A的控制域是: A、B、C、D、E、F;,设模块A作用域是:B、D、G;,设计时将块G移到模块A的控制域内(如右下图)。,55,将模块的影响限制 在模块的控制范围内,TOP,X,B1,B2,B,A,Y,TOP,X,B1,B2,B,A,Y,TOP,X,B1,B2,B,A,Y,TOP,X,B1,B2,B,A,Y,黑色模块表示判定所在位置;白色模块表示黑色模块的作用范围。,判定位置违反原则,判定位置符合原则,但判定点高,判定位置符合原则且位置适中,理想的判定位置,56,57,尽可能减少高扇出结构,随着深度增大扇入。 如果一个模块的扇出数过大,就意味着该模块过分复杂,需要协调和控制过多的下属模块。应当适当增加中间层次的控制模块。,58,高扇出的模块结构举例:,编外 人员 工资,取得 工资 数据,计时 制工 资额,薪金 制工 资额,编外 人员 税款,编外 人员 扣款,常规 扣款,税收 扣款,计算实发工资,避免平铺结构,59,增加中间层降低扇出,编外 人员 工资,取得工资数据,计时 制工 资额,薪金 制工 资额,编外 人员 税款,编外 人员 扣款,常规 扣款,税收 扣款,计算实发工资,计时工人实发工资,计薪工人实发工资,编外人员实发工资,60,避免或减少使用病态联接 应限制使用如下三种病态联接: 直接病态联接 即模块A直接从模块B内部取出某些数据,或者把某些数据直接送到模块B内部。,61, 公共数据域病态联接 模块A和模块B通过公共数据域,直接传送或接受数据,而不是通过它们的上级模块。这种方式将使得模块间的耦合程度剧增。它不仅影响模块和模块,而且影响与公共数据域有关联的所有模块。,62, 通信模块联接 即模块A和模块B通过通信模块TABLEIT传送数据。从表面看,这不是病态联接,因为模块和模块B都未涉及通信模块TABLEIT 的内部。然而,它们之间的通信(即数据传送)没有通过它们的上级模块。从这个意义上讲,这种联接是病态的。,63,模块的大小要适中 模块的大小,可以用模块中所含语句的数量的多少来衡量。把模块的大小限制在一定的范围之内。通常规定其语句行数在50100左右,保持在一页纸之内,最多不超过500行。,64,设计功能可预测的模块,但要避免过分受限制的模块 一个功能可预测的模块,不论内部处理细节如何,但对相同的输入数据,总能产生同样的结果。但是,如果模块内部蕴藏有一些特殊的鲜为人知的功能时,这个模块就可能是不可预测的。对于这种模块,如果调用者不小心使用,其结果将不可预测。,65,66,如果一个模块的局部数据结构的大小、控制流的选择或者与外界(人、硬软件) 的接口模式被限制死了,则很难适应用户新的要求或环境的变更。 为了能够适应将来的变更,软件模块中局部数据结构的大小应当是可控制的,控制流的选择对于调用者来说,应当是可预测的。而与外界的接口应当是灵活的。,67,软件包应满足设计约束和可移植性 为了使得软件包可以在某些特定的环境下能够安装和运行,对软件包提出了一些设计约束和可移植的要求。例如,设计约束有时要求一个程序段在存储器中覆盖自身。当这种情况出现时,设计出来的软件程序结构不得不根据重复程度、访问频率、调用间隔等等特性,重新加以组织。,68,设计的后处理,为每一个模块写一份处理说明 为每一个模块提供一份接口说明 确定全局数据结构和局部数据结构 指出所有的设计约束和限制 进行概要设计的评审 进行设计的优化(如果需要和可能的话),69,例1 “教材购销系统” 数据流图,二层DFD销售子系统,70,例 “教材销售子系统” 软件结构图(1),1.3,1.5,1.1,1.4,1.2,进书通知单,补售书单,购书单,有效购书单,无效购书单,暂缺书单,发票,售书登记,缺书登记,领书单,2.初始结构图顶层和一层,销售子系统,1.简化数据流图,71,分析:,根据简化数据流图,可看作为变换型,1.2作变换中心,其前为输入部分,其后为输出部分。 可看作为事务型,1.2作事务中心,其前为接收路径,其后为输出路径。 在此先作为变换型数据流图分析。 输入部分有两个模块: “获得有效购书单”与“获得补售书单”; 输出部分有两个模块: “输出购书发票”与“输出暂缺书单”。 模块“获得有效购书单”与“读入补售书单”前部分的数据流图又是一个变换型。 模块“输出购书发票”与“输出暂缺书单”后部分的数据流图也是一个变换型,72,作为变换型数据流图分析,1 购书单,5 补售书单,2 有效购书单,4 进书通知单,6 购书发票,7 暂缺书单,8 领书单,3 无效购书单,9 缺书登记记录,3.对一层模块分解得到初始结构图,73,4.对初始结构图按照设计准则进行精化与改进 (1)第二层的输出模块“缺书登记”和“售书登记”都属于写文件,在模块“开购书发票和暂缺书单”的作用域中,把它们作为子图放到该模块的控制域中,同时将该模块简化为“开购书发票”,直接调用模块“售书登记”与“缺书登记”。 (2)模块“生成缺书登记记录”与“输出暂缺书单”省略。 (3)模块“输出购书发票”目的是生成“领书单”,可直接简化为模块“开出领书单”。 (4)因“售书登记”与“缺书登记”不能同时发生,故在“开购书发票”用的是选择调用模块。 (见下页图)。,74,获得有效 购书单,开领 书单,教材销售 子系统,售书 登记,缺书 登记,6 购书发票,7 暂缺书单,2,5,6,7,1 购书单,2 有效购书单,3,5 补售书单,2,5,6,读进书 通知单,开补售 书单,5,4,获得 补售书单,4,6,3 无效购书单,4 进书通知单,75,例 “教材销售子系统” 软件结构图 -作为事务型数据流图分析,1.3,1.5,1.1,1.4,1.2,2.初始结构图,销售子系统,3.初始结构图精化与改进(与变换型分析类似),1.简化数据流图,76,可看作为事务型,1.2作事务中心,其前为接收路径,其后为动作路径。 在此。两条接受路径,两条动作路径。,77,两种设计分析的比较,变换 中心,事务 中心,事务控制,顶层,一层,主控模块,顶层,与传入模块 类似分解,与传出模块 类似分解,一层,综合应用2:用户命令交互子系统,密码命令,密码,显示信息,系统参数数据,用户 命令,读系统 数据,配置信息,显示信息 和状态,命令 分析处理,命令类型,开/关 命令,建立配 置文件,原配置 数据,格式化 配置数据,配置命令,重试信息,四位数字,检验信息,检验信息,A/D信息,格式化配置 数据,格式化 配置数据,用户命令交互子系统,密码,显示信息,系统参数数据,用户 命令,读系统 数据,配置信息,显示信息 和状态,命令 分析处理,命令类型,建立配 置文件,原配置 数据,格式化 配置数据,重试信息,四位数字,检验信息,检验信息,A/D信息,格式化配置 数据,格式化 配置数据,密码命令,开/关 命令,配置命令,80,用户命令交互子系统的SC,用户执行模块,读用户命令,命令处理,用户命令交互子系统,密码,显示信息,系统参数数据,用户 命令,读系统 数据,配置信息,显示信息 和状态,命令 分析处理,读 密码,命令类型,建立配 置文件,原配置 数据,与文件中 密码比较,格式化 配置数据,检验信 息过程,重试信息,四位数字,检验信息,检验信息,A/D信息,配置 数据,格式化配置 数据,密码命令,开/关 命令,配置命令,82,用户命令交互子系统的SC,用户执行模块,读用户命令,命令处理,83,变换分析是软件系统结构设计的主要方法。一般,一个大型的软件系统是变换型结构和事务型结构的混合结构。所以,我们通常利用以变换分析为主,事务分析为辅的方式进行软件结构设计。,84,房产管理系统,某单位拟开发一个计算机房产管理系统,要求系统具有分房、 调房、退房和查询统计等功能。房产科将用户申请表输入系统 后,系统首先检查申请表的合法性,对不合法的申请表,系统 拒绝接收;对合法的申请表根据类型分别进行处理。,1.如果是分房申请,则根据申请者的情况(年龄、工龄、职称、 职务、家庭人口等)计算其分数,当分数高于阀值分数时,按 分数高低将申请单插到分房队列的适当位置。在进行分房时, 从空房文件中读出空房信息,如房号、面积、等级、单位面 积房租等,把好房优先分给排在分房队列前面的符合该等级 房条件的申请者;从空房文件中删掉这个房号的信息,从分 房队列中删掉该申请单,并把此房号的信息和住户信息一起 写到住房文件中,输出住房分配单位给住户,同时计算房租, 并将算出的房租写到房租文件中。,综合应用1,85,2.如果是退房申请,则从住房文件和房租文件中删掉有关 信息,再把此房号的信息写到空房文件中。 3.如果是调房申请,则根据申请者的情况确定其住房等级, 然后在空房文件中查找属于该等级的空房,退掉原住房, 再进行与分房类似的处理。 4.住户可以向系统查询目前分房的阀值分数,居住某类房 屋的条件,某房号的单位面积及房租等信息。房产科可 以要求系统打印住房情况的统计表,或更改某类房屋的 居住条件、单位面积和房租等。 用数据流程图描绘该系统的功能需求;给出数据字典; 用面向数据流的方法设计软件结构。,86,房产管理系

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论