个人成果,妥善保存,请勿传播软件工程岐兵Email:qib@epsoft.com.cn个人成果,妥善保存,请勿传播可行性研究需求分析概要设计详细设计实现集成测试确认测试使用与维护退役软件定义软件开发软件使用与维护软件生命周期个人成果,妥善保存,请勿传播软件开发的三个关联步骤–每个步骤都按某种方式进行信息变换,最后得到有效的计算机软件个人成果,妥善保存,请勿传播分析模型和设计模型的转换将分析模型转换为软件设计个人成果,妥善保存,请勿传播软件设计是后续开发步骤及软件维护工作基础如果没有设计,只能建立一个不稳定的系统结构个人成果,妥善保存,请勿传播软件设计的任务从工程管理的角度来看,软件设计分两步完成个人成果,妥善保存,请勿传播软件设计的任务从工程管理的角度来看,软件设计分两步完成–总体设计(概要设计),将软件需求转化为数据结构和软件的系统结构。–详细设计,即过程设计。通过对结构表示进行细化,得到软件详细的数据结构和算法。个人成果,妥善保存,请勿传播课程内容提纲第3章:“总体设计”–总体设计过程–软件设计原理–软件设计中的启发规则–描绘软件结构的图形工具–面向数据流的设计方法个人成果,妥善保存,请勿传播总体设计过程总体设计(概要设计或初步设计)–划分出组成系统的物理元素程序、文件、数据库、人工过程和文档等并不涉及物理元素内部设计–总体设计阶段的一项任务是设计软件结构确定系统中每个程序是由哪些模块组成的以及这些模块相互间的关系个人成果,妥善保存,请勿传播总体设计过程总体设计过程总体设计过程一般分为两个阶段–系统设计阶段:确定系统的具体实现方案–结构设计阶段:确定软件的结构个人成果,妥善保存,请勿传播总体设计过程总体设计的步骤1提出各种可能的实现方案以需求分析阶段的数据流图为出发点,画自动化边界,形成不同的实现系统方案设想把数据流图中的处理分组的各种可能方法,抛弃在技术上行不通的分组方法余下的分组方法代表可能的实现策略,并且可以启示供选择的物理系统个人成果,妥善保存,请勿传播总体设计过程总体设计的步骤2选取合理方案从前一步得到的一系列供选择的方案中选取若干个合理的方案–通常至少选取低成本、中等成本和高成本的三种方案–系统流程图––成本/–实现这个系统的进度计划个人成果,妥善保存,请勿传播总体设计过程总体设计的步骤3综合分析对比各种合理方案的利弊,从中选出一种自己认为是最理想的方案推荐用户和技术专家应认真审查所推荐的最佳系统如果该系统确实符合用户的需要,并且是在现有条件下完全能够实现的,则应该提请使用部门负责人进一步审批在使用部门的负责人也接受了分析员所推荐的方案之后,将进入总体设计过程的下一个重要阶段结构设计个人成果,妥善保存,请勿传播总体设计过程总体设计的步骤4功能分解目标系统的实现一般要分两步进行:首先是进行结构设计,确定系统是由哪些模块组成的,以及这些模块之间的关系–确定软件体系结构、数据结构其次是过程设计,确定每个模块的处理过程–确定详细的数据结构、算法结构设计是总体设计阶段的任务,而过程设计是详细设计阶段的任务。个人成果,妥善保存,请勿传播总体设计过程总体设计的步骤5设计软件结构模块确定以后,每个模块的功能也就随之确定把这些模块自顶向下组成一种良好的层次调用关如果数据流图已经细化到适当的层次,那么我们便可以从数据流图映射成软件结构图总体设计过程总体设计的步骤6设计数据库–模式设计:确定数据库的逻辑结构,常见的数据库形式有关系、层次或网状等–子模式设计:为系统中各用户设计出各自的数据视图–存储模式设计:确定数据库的空间需求、存储格式、索引组成等个人成果,妥善保存,请勿传播个人成果,妥善保存,请勿传播总体设计过程总体设计的步骤7在软件开发的早期阶段考虑测试问题使软件设计人员在设计时注意软件的可测试性总体设计过程总体设计的步骤8系统说明–系统流程图:描绘系统构成方案、组成系统的物理元素–成本/效益分析–对最佳方案的概括描述、精化的数据流图–用层次图或结构图描绘的软件结构–用IPO图或其它工具简要描述各个模块的算法–模块间接口关系、建立需求、功能和模块三者之间的交叉参照关系个人成果,妥善保存,请勿传播总体设计过程总体设计的步骤8用户手册测试计划–测试策略、测试方案、预期的测试结果、测试进度计划等数据库设计结果–数据库系统的选择、模式、子模式、存储模式的设计结果等个人成果,妥善保存,请勿传播个人成果,妥善保存,请勿传播总体设计过程总体设计的步骤9复审对总体设计的结果进行严格的技术审查在技术审查通过之后再由使用部门的负责人从管理角度进行复审个人成果,妥善保存,请勿传播课程内容提纲第3章:“总体设计”–总体设计过程–软件设计原理–软件设计中的启发规则–描绘软件结构的图形工具–面向数据流的设计方法个人成果,妥善保存,请勿传播软件设计原理1.抽象–抽象:人们在实践中认识到,在现实世界中一定事物、状态或过程之间总存在着某些相似的方面(共性)。把这些相似的方面集中和概括起来,暂时忽略它们之间的差异,这就是抽象。–抽象就是:抽出本质,忽略细节,分层理解个人成果,妥善保存,请勿传播软件设计原理–举例说明:软件工程各阶段的抽象在可行性研究阶段,软件作为系统的一个完整部件;在需求分析阶段,软件解法是使用在问题环境内熟悉的方式描述;进入总体设计向详细设计过渡阶段,抽象的程度将随之减少;最后当源程序被写出后,抽象则达到最低层个人成果,妥善保存,请勿传播软件设计原理2.模块化–模块:是由边界元素限定的相邻程序元素(例如,数据说明,可执行的语句)的序列,而且有一个总体标识符代表它。PASCAL或Ada这样的块结构语言中的Begin…End对C、C++和Java语言中的{...}对过程、函数、子程序和宏等面向对象方法学中的对象(见第9章)是模块,对象内的方法(或称为服务)也是模块个人成果,妥善保存,请勿传播软件设计原理–模块化:就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。–模块化的数学依据C(x)定义问题x的复杂程度,E(x)确定解决问题x需要的工作量(时间),对于两个问题P1和P2有如果C(P1)C(P2)显然E(P1)E(P2)当C(P1+P2)C(P1)+C(P2)则E(P1+P2)E(P1)+E(P2)个人成果,妥善保存,请勿传播软件设计原理E(P1+P2+…+Pn)E(P1)+E(P2)+…+E(Pn)--以上揭示了把一个复杂问题分成许多容易解决的小问题,原来问题将容易解决每个程序都相应地有一个最适当的模块数目M,使得系统的开发成本最小。M成本/模块接口成本软件总成本成本模块数最小成本区个人成果,妥善保存,请勿传播软件设计原理3.逐步求精–逐步求精:为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。其作用就在于它能帮助软件工程师把精力集中在与当前开发阶段最相关的那些方面上忽略那些对整体解决方案来说虽然是必要的,然而目前还不需要考虑的细节,这些细节将留到以后再考虑。个人成果,妥善保存,请勿传播软件设计原理3.逐步求精–Miller法则:一个人在任何时候都只能把注意力集中在(7±2)个知识块上Miller法则是人类智力的基本局限,我们不可能战胜自己的自然本性,只能接受这个事实,承认自身的局限性,并在这个前提下尽我们的最大努力工作个人成果,妥善保存,请勿传播软件设计原理3.逐步求精–抽象与求精是一对互补的概念抽象使得设计者能够说明过程和数据,同时却忽略低层细节;可以把抽象看作是一种通过忽略多余的细节同时强调有关的细节,而实现逐步求精的方法求精则帮助设计者在设计过程中逐步揭示出低层细节这两个概念都有助于设计者在设计演化过程中创造出完整的设计模型个人成果,妥善保存,请勿传播软件设计原理4.信息隐蔽和局部化–信息隐蔽原理应该这样设计和确定模块,使得一个模块内包含的信息(过程或数据)对于不需要这些信息的模块来说,是不能访问的–局部化是把一些关系密切的软件元素物理地放得彼此靠近。显然,局部化有助于实现信息隐藏个人成果,妥善保存,请勿传播软件设计原理5.模块独立性–模块独立性的概念是模块化、抽象化、信息隐蔽概念的一个直接产物–强调模块的独立性,有两个重要原因:模块化程度较高的软件容易编制独立的模块比较容易维护和测试–模块独立是好设计的关键,而设计又是决定软件质量的关键环节个人成果,妥善保存,请勿传播软件设计原理5.模块独立性–模块的独立程度可以由两个定性标准度量,这两个标准分别称为内聚和耦合耦合(Coupling)&内聚(Cohesion)个人成果,妥善保存,请勿传播软件设计原理5.1耦合–耦合:是对一个软件结构内不同模块之间互连程度的度量–耦合强弱取决于模块间接口复杂程度,进入或访问一个模块的点,以及通过接口的数据–模块间的耦合程度强烈影响系统的可理解性、可测试性、可靠性和可维护性个人成果,妥善保存,请勿传播软件设计原理GreatdealofdependenceIndependent高耦合中等耦合无耦合耦合表示一个软件结构内各个模块之间的互连程度,应尽量选用松散耦合的系统个人成果,妥善保存,请勿传播软件设计原理例1:A访问C的内部数据或不通过正常入口而转入C的内部……ABCDA:……………………gotoC1……………………C:……………………C1:…………独立性由弱到强(耦合程度由强到弱)排列为:内容耦合:一个模块直接影响另一个模块,调用或操纵其他模块的数据个人成果,妥善保存,请勿传播软件设计原理例2:部分代码重叠(常现在汇编程序中)BA例3:一个模块有多个入口(功能)A:………………………………entry1:………………………………entry2:………………………………软件设计原理–如果发生下列情形,模块间就发生了内容耦合(1)一个模块直接访问另一个模块的内部数据(2)一个模块不通过正常入口转到另一模块内部(3)两个模块有一部分程序代码重迭(只可能出现在汇编语言中)(4)一个模块有多个入口个人成果,妥善保存,请勿传播个人成果,妥善保存,请勿传播软件设计原理公共耦合:几个模块共享一个数据区域Global:V1V2A:……………………A1=V1+V2……………………B:……………………V1=B1……………………Global:V1V2A:……………………V1++……………………B:……………………V2=B1+V1……………………缺陷:公共部分的改动将影响所有调用它的模块;公共部分的数据存取无法控制;复杂程度随耦合模块的个数增加而增加。个人成果,妥善保存,请勿传播软件设计原理特征耦合:把整个数据结构作为参数传递而被调用模块只使用其中一部分数据元素时就出现了特征耦合。控制耦合:一个模块通过传递控制信息来控制另一个模块ABFlagF2F1Fn…………Flag接口单一,但影响被控模块的内部逻辑个人成果,妥善保存,请勿传播软件设计原理数据耦合:只有数据在模块之间进行交换,只通过参数传递基本类型的数据标记耦合与数据耦合形式相同,区别在于调用时传递的参数是否为基本数据类型标记耦合:模块间通过参数表传递记录信息,这个记录是某一数据结构的子结构,而不是简单变量非直接耦合:两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的非直接耦合的模块独立性最强个人成果,妥善保存,请勿传播软件设计原理关于“耦合”的使用原则–尽量使用数据耦合–少用控制耦合和特征耦合–限制公共环境耦合的范围–完全不用内容耦合个人成果,妥善保存,请勿传播软件设计原理5.2内聚–内聚:标志着一个模块内各个元素彼此结合的紧密程度–内聚和耦合都是进行模块化设计的有力工具–实践表明内聚更重要,应该把更多注意力集中到提高模块的内聚程度上个人成果,妥善保存,请勿传播软件设计原理5.2内聚–内聚有七种,由弱到强分别为偶然内聚-逻辑内聚-