第八章设计工程一、设计概述1、什么是设计?什么是设计模型?●将问题转化成解决方案的创造性的活动●对解决方案的的描述2、两种设计(不同的观察视角)●ConceptualDesign概念设计●TechnicalDesign技术设计概念设计●告诉顾客系统将要做什么●回答:(概念设计要回答的问题)Wherewillthedatacomefrom数据来自何地?Whatwillhappentothedatainthesystem系统中的数据会发生什么情况?Whatwillthesystemlookliketousers系统对用户来说看起来象什么?Whatchoiceswillbeofferedtousers能向用户提供什么选择?Whatisthetimingofevents事件的时间安排如何?Whatwillthereportsandscreenslooklike报告和屏幕看起来像什么?●Characteristicsofgoodconceptualdesign好的概念设计的特征incustomerlanguagewithnotechnicaljargon用顾客语言而不是技术术语describessystemfunctions描述系统的功能independentofimplementation独立于实现linkedtorequirements与需求相关概念设计的任务与步骤概念设计确定:软件系统的结构各模块功能及模块间联系(接口)概念设计的过程:(1)设想可能的方案(2)选取合理的方案(3)推荐最佳方案(4)功能分解(5)设计软件结构(6)数据库设计(7)制定测试计划(8)编写文档(9)审查与复审技术设计Tellstheprogrammerswhatthesystemwilldo告诉程序员系统将做什么Includes包括:(包括对以下条目的描述)majorhardwarecomponentsandtheirfunction主要硬件组件和功能hierarchyandfunctionofsoftwarecomponents软件组件的层次和功能datastructures数据结构dataflow数据流技术设计主要任务编写技术设计说明书:确定每个模块的算法,用工具表达算法的过程,写出模块的详细过程性描述。确定每一模块的数据结构。确定模块接口细节。技术(详细)设计是编码的先导。概念和技术设计设计文档间的差异3、五种创建设计的方法Modulardecomposition模块分解将功能分配给组件Data-orienteddecomposition面向数据的分解基于外部数据结构Event-orienteddecomposition面向事件的分解基于系统必须处理的事件和事件改变系统的状态信息Outside-indesign由外而内的设计基于系统的用户输入(属黑盒方法)Object-orienteddesignOO设计确定对象的类和它们之间的相互关系模块化模块分解结果形成的组成部分称模块或组件模块化当系统的每一个功能正好由一个模块执行当每个模块的输入输出被明确定义4、三种设计层次Architecture体系结构:系统性能与系统组件关联起来Codedesign代码设计:为每个组件详细说明算法和数据结构Executabledesign执行设计:设计的最低级,包括内存分配、数据格式和位组合5、软件体系结构的风格三个方面:组件(模块)连接器(组件之间的联系)组件(模块)组合的限制条件设计风格管道和过虑器OO设计隐含调用分层解释器过程控制。。。。。。。。。。。管道和过虑器连接器组件性质关系表示明确复用、修改、模拟容易允许并发执行过滤器局限性更适合批处理(不适合交互式处理)数据流之间需要对应类似过滤器潜在的重复操作执行隐含调用(事件驱动)某个组件宣告事件,其他组件处理事件。利用注册程序处理事件优点易于复用其他系统组件对用户界面尤其有用缺点不能确定某个事件的响应.测试系统很难.Layering分层各层分等级,每层为它的外层提供服务优点表示不同的抽象层次对层的修改通常只影响相邻的两层缺点需求阶段定义多层抽象很困难性能问题?解释器解释器读入字符串并将它们转换成可以执行的实际代码.一般用来构建虚拟机6、重要的设计问题模块性与抽象层次协作设计设计用户界面并发设计模式与复用7、优秀设计的特征组件独立性Coupling耦合性Cohesion内聚性例外设计与处理防错和容错7.1组件独立性组件独立是模块化、抽象、信息隐蔽和局部化的直接结果。含义:一个模块具有独立功能而且和其它模块之间没有过多的相互作用意义:独立的模块容易开发(规模小,接口简单);独立的模块容易测试和维护;有效阻断错误传播(Rippleeffect“涟漪效应”)度量标准:内聚和耦合耦合性定义指块间联系,即程序结构中不同模块之间互连程度耦合强弱取决于模块间接口的复杂程度调用模块的方式内容耦合:一个模块可以直接操作另一个模块的数据(如goto语句的使用)公共耦合:全局结构类型的数据控制耦合:模块间传递的是诸如标记量的控制信息标记耦合:参数传递的是诸如结构类型的数据数据耦合:参数传递的是一般类型的数据非直接耦合:通过上级模块进行联系,无直接关联AFlagFlagBf1f2…fn控制耦合AB进入另一模块内部多入口模块AB模块代码重叠Entry1……Entryn……内容耦合ABCommon公共数据区ABCommon公共数据区松散的公共耦合紧密的公共耦合ABCDX传递数据传递数据结构AB为非直接耦合AC为数据耦合AD为标记耦合Cohesion内聚块内联系或模块强度,指模块内各个成分(元素)彼此结合的紧密程度,即模块内部的聚合能力。“理想的模块仅仅做一件事”。功能性内聚:一个功能一个模块,块内各成分属于一个整体顺序内聚:模块内各个组成部分都是与一个功能密切相关,并是顺序执行的。一般是一个成份的输出就是下一个成份的输出通讯内聚:模块内的各个成份都使用同一输入数据,或产生同一输出数据,即借公用数据而联系在一起过程内聚:块内成份必须按照特定次序执行时间内聚:因执行时间一样或顺序排列而把几个任务安排一个模块,如把“变量赋初值”、“打开文件”等完成各种初始化任务安排在一个模块逻辑内聚:块内任务间在逻辑上相似或相同,例如求某班的平均分和最高分,因其输入和输出相同而安排在一个模块内完成。偶然(巧合)内聚:一个模块所完成的几个任务之间关系松散,互不相关。主要是为了避免重复书写而把重复的代码集成到一个模块内。三个方框组成一个模块,则是过程化模块;前两个方框组成一个模块,则是顺序性模块;如一个方框就是一个模块,则是功能性模块。建立方程组系数矩阵高斯消去法回代示例A……STORErec()toNREADXFileADD1toz……B……STORErec()toNREADXFileADD1toz……MSTORErec()toNREADXFileADD1toz……AB偶然性内聚A判定参数参数Bf1f2…fn模块B属于逻辑内聚读文件打印检验结果计算A计算B合并新文件文件加工记录模块通信内聚启发式规则的应用提高模块独立性设计规模适中的模块深度、宽度、扇入、扇出适中模块的作用域应该在控制域之内降低接口复杂性设计单入口和单出口的模块设计功能可以预测的模块说明:启发式规则是一种经验规律,对改进设计和提高软件质量具有重要的参考价值,但不要过分拘泥于这些规则。提高模块独立性模块独立性是划分模块的最高准则。高内聚,尽量一个模块一个功能;低耦合,避免“病态连接”;降低接口的复杂程度;综合考虑模块可分解性、模块可组装性、模块可理解性、模块连续性和模块保护(因修改错误而引起的副作用被控制在模块的内部)等。设计规模适中的模块W.M.Weinberg的研究表明:如果一个模块长度超过30条语句,其可理解性将迅速下降;F.T.Baker:最好控制在50行左右,能够打印在一张纸上。由于模块独立性是最高原则,对于一个设计合理的功能性模块,即使长达千句或小到几行,也是允许的。分解模块不应该降低模块独立性。深度、宽度、扇入、扇出适中深度:软件结构中控制的层数。一般而言它与系统的复杂度和系统大小直接对应。宽度:软件结构中同一个层次上的模块总数的最大数。扇出:一个模块直接控制(调用)的模块数目。扇出过大说明模块过分复杂;过小也不好,不利于系统平衡分解,3到9为宜。扇入:一个模块的扇入是指直接控制该模块的模块数目。扇入越大说明共享该模块的上级模块越多。整个系统结构呈现“椭圆外型”。ABCDFGHKJIE如图的系统中:深度为4;宽度为5;模块A的扇出为5,扇入为0。模块K的扇出为0;扇入为2。模块的作用域应该在控制域之内控制域:控制范围,是包括模块本身以及所有下属模块(直接调用模块和间接调用模块)的集合。模块D的控制域为D,G,H,I,J,K。作用域:作用范围,它是一个与条件判定相联系的概念。是受该模块内一个判定影响的所有模块的集合。如果模块D中有一个条件判定仅仅影响到模块G和H,其作用域为G,H,I,J,K,作用域在控制域内。如D的判定影响到E,通常需要在D中为判定结果设置一个标记,并把这个标记通过上级模块A传递给E,导致控制耦合。两种改进方法:判定上移和在作用域但不在控制域的模块下移。降低模块间接口复杂性尽量少使用goto语句,避免病态连接和内容耦合。注意全局变量的使用,控制外部耦合和公共耦合的使用。将数据结构的传递改成数据传递,例如:求一元二次方程根的模块quad_root(table,x)中,利用系数数组table和根数组x进行参数传递。如果将其改为直接的系数和根传递,即quad_root(a,b,c,x),则特征耦合→数据耦合。7.2例外识别和处理典型的例外无法提供某种服务提供了错误的服务或数据破坏性的数据防御性设计不容易!7.3防错和容错对于软件失效后果特别严重的场合,如飞机的飞行控制系统、空中交通管制系统等必须采用容错设计。(1)N版本编程法(2)恢复块技术(3)防卫式程序设计软件容错方法有很多,要根据实际情况进行选择8、设计的评估和确认数学确认测量设计质量比较设计Eg:一个规格说明,多个设计设计评审设计评审初步设计评审同顾客与用户一起审查概念设计关键设计审查向开发人员展示技术设计程序设计审查程序员在实现之前获得对他们设计的反馈1.该设计是问题的解决方案吗?2.该设计是模块化的、结构良好的、易于理解的?3.是否能改进设计的结构和易懂性?4.该设计能够移植到其他平台?5.该设计可复用吗?6.该设计易于修改或扩展么?7.该设计支持测试么?8.适当的时候,该设计的性能是否最好?9.适当的时候,该设计是否能复用其他项目中的组件?10.算法是否合适,是否可以改进?11.如果这个系统是一个分阶段的开发过程,各阶段的连接是否足够充分,以保证阶从一个阶段到下一个段的变迁非常容易?12.设计文档是否齐全,是否包括设计选择和原理?13.设计是否交叉引用需求中的组件和数据?14.设计是否使用了适当的技术处理并防止发生故障?关于设计评审的问题1.设计原理2.菜单和其他显示屏格式3.用户界面:功能键,触摸屏描述,键盘布局,以及鼠标和游戏杆的使用4.报告格式5.输入:数据来自何方,如何将它们格式化,数据存储在什么介质中6.输出:数据送到何处,如何将它们格式化,数据存储在什么介质中7.一般功能特征8.性能约束9.存档过程10.错误处理方式9、设计归档二、面向对象的设计的主要工作主要工作:用例实现精化体系结构设计构件设计用户界面设计数据持久设计迭代精化1、用例实现方案精化可利用UML的交互图(顺序图、协作图)用于用例实现方案的表示。用例实现方案的设计方法有三个步骤:(1)提取边界类、实体类和控制类;(2)构造交互图