资源预览内容
第1页 / 共101页
第2页 / 共101页
第3页 / 共101页
第4页 / 共101页
第5页 / 共101页
第6页 / 共101页
第7页 / 共101页
第8页 / 共101页
第9页 / 共101页
第10页 / 共101页
亲,该文档总共101页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第三章第三章 软件设计软件设计3.1 软件设计的基本任务软件设计的基本任务3. 总体设计(总体设计(SD)3.3 详细设计详细设计 (SD)3.4 面向对象的设计面向对象的设计3.5 用户界面设计用户界面设计3.6 设计质量的度量设计质量的度量 3.7 软件设计软件设计CASE工具工具3.1 软件设计的基本任务总体设计软件设计的基本任务总体设计总体设计的基本任务总体设计的基本任务概要地回答系统应该如何实现概要地回答系统应该如何实现总体设计的两项任务:总体设计的两项任务:划分出组成系统的物理元素划分出组成系统的物理元素-程序、文件、数据库、人工过程和文档程序、文件、数据库、人工过程和文档设计软件的结构设计软件的结构-确定每个程序的模块组成及模块之间的相互关系。确定每个程序的模块组成及模块之间的相互关系。总体设计的过程:总体设计的过程:系统设计:确定系统的具体实现方案。系统设计:确定系统的具体实现方案。结构设计:确定软件结构。结构设计:确定软件结构。3.1 软件设计的基本任务总体设计(续)软件设计的基本任务总体设计(续)设想供选择的方案数据流图选取合理的方案系统流程图组成系统的物理元素清单成本/效益分析实现系统的进度计划功能分解设计软件结构制订测试计划数据库设计书写文档系统说明用户手册测试计划详细的实现计划数据库设计结果审查和复审推荐最佳方案3.1 软件设计的基本任务(续)软件设计的基本任务(续)详细设计的基本任务详细设计的基本任务详细设计是总体设计的进一步具体化,主要确定每个模块的具体执行过程详细设计是总体设计的进一步具体化,主要确定每个模块的具体执行过程具体任务如下:具体任务如下:1)为每个模块进行详细的算法设计)为每个模块进行详细的算法设计2)为模块内的数据结构进行设计)为模块内的数据结构进行设计3)对数据库进行物理设计)对数据库进行物理设计4)界面设计)界面设计5)其他设计)其他设计6)编写文档)编写文档7)评审)评审3. 总体设计(总体设计(SD)在软件设计中,要遵循一些基本的软件设计原理。在软件设计中,要遵循一些基本的软件设计原理。1 模块化模块化把程序划分成若干个模块,每个模块完成一个子功能,把这些模块集总把程序划分成若干个模块,每个模块完成一个子功能,把这些模块集总起来组成一个整体,可以完成指定的功能,满足问题的求解。起来组成一个整体,可以完成指定的功能,满足问题的求解。 模块是由边界元素限定的相邻程序元素(例如数据说明,可执行的语句)模块是由边界元素限定的相邻程序元素(例如数据说明,可执行的语句)的序列,而且有个总体标识符代表它。的序列,而且有个总体标识符代表它。C(P1+P2) C(P1)+C(P2)E(P1+P2) E(P1)+E(P2)成本模块数目成本/模块接口成本最小成本区模块化和软件成本3. 总体设计(总体设计(SD)2 模块独立性模块独立性每个模块完成一个相对独立的子每个模块完成一个相对独立的子 功能,并且和其他模块之间的关功能,并且和其他模块之间的关 系很简单系很简单耦合和内聚两个定性标准度量耦合和内聚两个定性标准度量 耦合:一个软件结构内不同模块之间互连程度的度量。耦合:一个软件结构内不同模块之间互连程度的度量。数据耦合:模块之间通过参数交换数据信息。数据耦合:模块之间通过参数交换数据信息。控制耦合:模块之间传递的参数含有控制信息。控制耦合:模块之间传递的参数含有控制信息。公共环境耦合:两个或多个模块通过一个公共数据环境相互作用。公共环境耦合:两个或多个模块通过一个公共数据环境相互作用。内容耦合:。内容耦合:。设计原则:尽量使用数据耦设计原则:尽量使用数据耦合,少用控制耦合,限制公合,少用控制耦合,限制公共环境耦合,完全不用内容共环境耦合,完全不用内容耦合。耦合。数据耦合 控制耦合 公共环境耦合 内容耦合低高耦合耦合1.非直接耦合2.数据耦合3.特征耦合4.控制耦合5.5。公共环境耦合6.6。内容耦合弱耦合中耦合较强耦合强耦合模块1模块2模块3模块4数据耦合通过简单变量交换数据特征耦合通过数据结构交换数据非直接耦合模块之间没有信息传递模块A模块B模块C模块D模块L模块NFlag=1?S1S2模块1控制耦合模块之间传递的是控制信息TF模块A模块B内容耦合访问其它模块的内部数据直接跳到其他模块内部执行公共环境耦合通过公共数据环境相互作用内聚内聚:一个模块内各个元素彼此结合的紧密程度。一个模块内各个元素彼此结合的紧密程度。偶然内聚:一个模块完成一组任务,任务之间的关系很松散。公共语句。偶然内聚:一个模块完成一组任务,任务之间的关系很松散。公共语句。 逻辑内聚:若干个逻辑功能类似的任务组成一个模块。逻辑内聚:若干个逻辑功能类似的任务组成一个模块。 时间内聚:若干个任务必须在同一段时间内执行。如初始化工作。时间内聚:若干个任务必须在同一段时间内执行。如初始化工作。低内聚低内聚中内聚中内聚高内聚高内聚过程内聚:模块内的处理元素是相关的,且必须以特定次序执行。过程内聚:模块内的处理元素是相关的,且必须以特定次序执行。通信内聚:模块中所有元素都使用同一个输入数据,和通信内聚:模块中所有元素都使用同一个输入数据,和/或产生同一个或产生同一个 输出数据。输出数据。顺序内聚:模块中所有处理元素和同一个功能密切相关,且这些处理必顺序内聚:模块中所有处理元素和同一个功能密切相关,且这些处理必 须顺序执行,通常上一个任务的输出是下一个任务的输入。须顺序执行,通常上一个任务的输出是下一个任务的输入。功能内聚:所有处理元素属于一个整体,完成一个单一的功能。功能内聚:所有处理元素属于一个整体,完成一个单一的功能。ABCS1;S2;ABC模块D模块ABC3. 总体设计(总体设计(SD)3 抽象与细化抽象与细化在抽象的最高层次使用问题环境语言,以概括的方式叙述问题的解法在抽象的最高层次使用问题环境语言,以概括的方式叙述问题的解法在较低抽象层次采用更过程化的方法,把面向问题的术语和面向实现的在较低抽象层次采用更过程化的方法,把面向问题的术语和面向实现的 术术语结合起来叙述问题的解法语结合起来叙述问题的解法在最低的抽象层次用可以直接实现的方式叙述问题的解法在最低的抽象层次用可以直接实现的方式叙述问题的解法细化与抽象是紧密相关的,在软件过程的每一步都是对软件解法的抽象层细化与抽象是紧密相关的,在软件过程的每一步都是对软件解法的抽象层次的一次细化次的一次细化3. 总体设计(总体设计(SD)3 信息隐蔽信息隐蔽在设计和确定模块时,使一个模块包含的信息(过程和数据)对于不需要在设计和确定模块时,使一个模块包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。这些信息的模块来说,是不能访问的。在面向对象方法中,对象的封装性很自然地支持了信息隐蔽地思想。在面向对象方法中,对象的封装性很自然地支持了信息隐蔽地思想。在结构化方法中,要求模块内地信息要局部化在结构化方法中,要求模块内地信息要局部化4可重用性可重用性同一事物不做修改或稍加修改就能够多次重复使用同一事物不做修改或稍加修改就能够多次重复使用重用(再生重用(再生 复用)复用)软件复用:数据复用、模块复用、结构复用、设计复用和规格说明书复用软件复用:数据复用、模块复用、结构复用、设计复用和规格说明书复用3. 总体设计(总体设计(SD)启发式规则启发式规则人们在开发计算机软件的长期实践中积累了丰富的经验,总结这些经验得人们在开发计算机软件的长期实践中积累了丰富的经验,总结这些经验得出了一些启发式规则。这些启发式规则虽然不像上一节讲述的基本原理和出了一些启发式规则。这些启发式规则虽然不像上一节讲述的基本原理和概念那样普遍适用,但是在许多场合仍然能给软件工程师以有益的启示,概念那样普遍适用,但是在许多场合仍然能给软件工程师以有益的启示,往往能帮助他们找到改进软件设计提高软件质量的途径。往往能帮助他们找到改进软件设计提高软件质量的途径。下面介绍几条启发式规则下面介绍几条启发式规则l 改进软件结构提高模块独立性改进软件结构提高模块独立性l 模块规模应该适中模块规模应该适中l 深度、宽度、扇入、扇出都应适当深度、宽度、扇入、扇出都应适当l 模块的作用域应该在控制域之内模块的作用域应该在控制域之内l 力争降低模块接口的复杂程度力争降低模块接口的复杂程度l 设计单入口单出口的模块设计单入口单出口的模块l 模块的功能应该可以预测模块的功能应该可以预测3. 总体设计(总体设计(SD)1. 改进软件结构提高模块独立性改进软件结构提高模块独立性设计出软件的初步结构以后,应该审查分析这个结构,通过模块分解或合设计出软件的初步结构以后,应该审查分析这个结构,通过模块分解或合并,力求降低耦合提高内聚。例如,多个模块公有的一个子功能可以独立并,力求降低耦合提高内聚。例如,多个模块公有的一个子功能可以独立成一个模块,由这些模块调用;有时可以通过分解或合并模块以减少控制成一个模块,由这些模块调用;有时可以通过分解或合并模块以减少控制信息的传递及对全程数据的引用,并且降低接口的复杂程度。信息的传递及对全程数据的引用,并且降低接口的复杂程度。2. 模块规模应该适中模块规模应该适中经验表明,一个模块的规模不应过大,最好能写在一页纸内经验表明,一个模块的规模不应过大,最好能写在一页纸内(通常不超过通常不超过60行语句行语句)。有人从心理学角度研究得知,当一个模块包含的语句数超过。有人从心理学角度研究得知,当一个模块包含的语句数超过30以以后,模块的可理解程度迅速下降。后,模块的可理解程度迅速下降。过大的模块往往是由于分解不充分,但是进一步分解必须符合问题结构,过大的模块往往是由于分解不充分,但是进一步分解必须符合问题结构,一般说来,分解后不应该降低模块独立性。一般说来,分解后不应该降低模块独立性。过小的模块开销大于有效操作,而且模块数目过多将使系统接口复杂。因过小的模块开销大于有效操作,而且模块数目过多将使系统接口复杂。因此过小的模块有时不值得单独存在,特别是只有一个模块调用它时,通常此过小的模块有时不值得单独存在,特别是只有一个模块调用它时,通常可以把它合并到上级模块中去而不必单独存在。可以把它合并到上级模块中去而不必单独存在。3. 总体设计(总体设计(SD)3. 深度、宽度、扇出和扇入都应适当深度、宽度、扇出和扇入都应适当深度:深度:表示软件结构中控制的层数。表示软件结构中控制的层数。它往往能粗略地标志一个系统的大小和复杂程度。深度和程序长度之间应它往往能粗略地标志一个系统的大小和复杂程度。深度和程序长度之间应该有粗略的对应关系,当然这个对应关系是在一定范围内变化的。如果层该有粗略的对应关系,当然这个对应关系是在一定范围内变化的。如果层数过多则应该考虑是否有许多管理模块过分简单了,能否适当合并。数过多则应该考虑是否有许多管理模块过分简单了,能否适当合并。宽度:宽度:软件结构内同一个层次上的模块总数的最大值。软件结构内同一个层次上的模块总数的最大值。一般说来,宽度越大系统越复杂。对宽度影响最大的因素是模块的扇出。一般说来,宽度越大系统越复杂。对宽度影响最大的因素是模块的扇出。3. 总体设计(总体设计(SD)扇出:扇出:一个模块直接控制一个模块直接控制(调用调用)的模块数目,的模块数目,扇出过大意味着模块过分复杂,需要控制和协调过多的下级模块;扇出过扇出过大意味着模块过分复杂,需要控制和协调过多的下级模块;扇出过小小(例如总是例如总是1)也不好。经验表明,一个设计得好的典型系统的平均扇出通也不好。经验表明,一个设计得好的典型系统的平均扇出通常是常是3或或4(扇出的上限通常是扇出的上限通常是59)。扇出太大一般是因为缺乏中间层次,应该适当增加中间层次的控制模块。扇出太大一般是因为缺乏中间层次,应该适当增加中间层次的控制模块。扇出太小时可以把下级模块进一步分解成若干个子功能模块,或者合并到扇出太小时可以把下级模块进一步分解成若干个子功能模块,或者合并到它的上级模块中去。当然分解模块或合并模块必须符合问题结构,不能违它的上级模块中去。当然分解模块或合并模块必须符合问题结构,不能违背模块独立原理。背模块独立原理。扇入:扇入:表示被多少个上级模块调用它表示被多少个上级模块调用它扇入越大则共享该模块地上级模块数目越多,这是有好处的,但不能违背扇入越大则共享该模块地上级模块数目越多,这是有好处的,但不能违背模块独立性原理。模块独立性原理。3. 总体设计(总体设计(SD)4. 模块的作用域应该在控制域之内模块的作用域应该在控制域之内模块的作用域定义为受该模块内一个判定影响的所有模块的集合。模块的模块的作用域定义为受该模块内一个判定影响的所有模块的集合。模块的控制域是这个模块本身以及所有直接或间接从属于它的模块的集合。例控制域是这个模块本身以及所有直接或间接从属于它的模块的集合。例如,在图中模块如,在图中模块A的控制域是的控制域是A、B、C、D、E、F等模块的集合。等模块的集合。在一个设计得很好的系统中,所有受判定影响的模块应该都从属于做出判在一个设计得很好的系统中,所有受判定影响的模块应该都从属于做出判定的那个模块,最好局限于做出判定的那个模块本身及它的直属下级模块定的那个模块,最好局限于做出判定的那个模块本身及它的直属下级模块3. 总体设计(总体设计(SD)5. 力争降低模块接口的复杂程度力争降低模块接口的复杂程度模块接口复杂是软件发生错误的一个主要原因。应该仔细设计模块接口,模块接口复杂是软件发生错误的一个主要原因。应该仔细设计模块接口,使得信息传递简单并且和模块的功能一致。使得信息传递简单并且和模块的功能一致。接口复杂或不一致接口复杂或不一致(即看起来传递的数据之间没有联系即看起来传递的数据之间没有联系),是紧耦合或低内,是紧耦合或低内聚的征兆,应该重新分析这个模块的独立性。聚的征兆,应该重新分析这个模块的独立性。6. 设计单入口单出口的模块设计单入口单出口的模块这条启发式规则警告软件工程师不要使模块间出现内容耦合。当从顶部进这条启发式规则警告软件工程师不要使模块间出现内容耦合。当从顶部进入模块并且从底部退出来时,软件是比较容易理解的,因此也是比较容易入模块并且从底部退出来时,软件是比较容易理解的,因此也是比较容易维护的。维护的。3. 总体设计(总体设计(SD)7. 模块功能应该可以预测模块功能应该可以预测模块的功能应该能够预测,但也要防止模块功能过分局限。模块的功能应该能够预测,但也要防止模块功能过分局限。如果一个模块可以当做一个黑盒子,也就是说,只要输入的数据相同就产如果一个模块可以当做一个黑盒子,也就是说,只要输入的数据相同就产生同样的输出,这个模块的功能就是可以预测的。带有内部生同样的输出,这个模块的功能就是可以预测的。带有内部“存储器存储器”的的模模块的功能可能是不可预测的,因为它的输出可能取决于内部存储器块的功能可能是不可预测的,因为它的输出可能取决于内部存储器(例如某例如某个标记个标记)的状态。由于内部存储器对于上级模块而言是不可见的,所以这样的状态。由于内部存储器对于上级模块而言是不可见的,所以这样的模块既不易理解又难于测试和维护。的模块既不易理解又难于测试和维护。3. 总体设计(总体设计(SD)描绘软件结构的图形工具描绘软件结构的图形工具层次图和层次图和HIPO图图层次图用来描绘软件的层次结构。层次图中的一个矩形框代表一个模块,层次图用来描绘软件的层次结构。层次图中的一个矩形框代表一个模块,方框间的连线表示调用关系。层次图很适于在自顶向下设计软件的过程中方框间的连线表示调用关系。层次图很适于在自顶向下设计软件的过程中使用。使用。3. 总体设计(总体设计(SD)HIPO图是美国图是美国IBM公司发明的公司发明的“层次图加输入层次图加输入/处理处理/输出图输出图”的英文缩写。的英文缩写。为了能使为了能使HIPO图具有可追踪性,在图具有可追踪性,在H图图(层次图层次图)里除了最顶层的方框之里除了最顶层的方框之外,每个方框都加了编号。和外,每个方框都加了编号。和H图中每个方框相对应,应该有一张图中每个方框相对应,应该有一张IPO图描图描绘这个方框代表的模块的处理过程。绘这个方框代表的模块的处理过程。HIPO图中的每张图中的每张IPO图内都应该明显图内都应该明显地标出它所描绘的模块在地标出它所描绘的模块在H图中的编号,以便追踪了解这个模块在软件结图中的编号,以便追踪了解这个模块在软件结构中的位置。构中的位置。3. 总体设计(总体设计(SD)结构图结构图Yourdon提出的结构图是进行软件结构设计的另一个有力工具。结构图和提出的结构图是进行软件结构设计的另一个有力工具。结构图和层次图类似,也是描绘软件结构的图形工具,图中一个方框代表一个模层次图类似,也是描绘软件结构的图形工具,图中一个方框代表一个模块,框内注明模块的名字或主要功能;方框之间的箭头块,框内注明模块的名字或主要功能;方框之间的箭头(或直线或直线)表示模块表示模块的的调用关系。因为按照惯例总是图中位于上方的方框代表的模块调用下方的调用关系。因为按照惯例总是图中位于上方的方框代表的模块调用下方的模块,即使不用箭头也不会产生二义性,为了简单起见,可以只用直线而模块,即使不用箭头也不会产生二义性,为了简单起见,可以只用直线而不用箭头表示模块间的调用关系。不用箭头表示模块间的调用关系。在结构图中通常还用带注释的箭头表示模块调用过程中来回传递的信息。在结构图中通常还用带注释的箭头表示模块调用过程中来回传递的信息。如果希望进一步标明传递的信息是数据还是控制信息,则可以利用注释箭如果希望进一步标明传递的信息是数据还是控制信息,则可以利用注释箭头尾部的形状来区分:尾部是空心圆表示传递的是数据,实心圆表示传递头尾部的形状来区分:尾部是空心圆表示传递的是数据,实心圆表示传递的是控制信息。的是控制信息。3. 总体设计(总体设计(SD)以上介绍的是结构图的基本符号,也就是最经常使用的符号。此外还有一以上介绍的是结构图的基本符号,也就是最经常使用的符号。此外还有一些附加的符号,可以表示模块的选择调用或循环调用。图些附加的符号,可以表示模块的选择调用或循环调用。图5.6表示当模块表示当模块M中某个判定为真时调用模块中某个判定为真时调用模块A,为假时调用模块,为假时调用模块B。3. 总体设计(总体设计(SD)判定为真时调用判定为真时调用A,为假时调用,为假时调用B模块模块M循环调用模块循环调用模块A、B、C3. 总体设计(总体设计(SD)注意,层次图和结构图并不严格表示模块的调用次序。虽然多数人习惯于注意,层次图和结构图并不严格表示模块的调用次序。虽然多数人习惯于按调用次序从左到右画模块,但并没有这种规定,出于其他方面的考虑按调用次序从左到右画模块,但并没有这种规定,出于其他方面的考虑(例例如为了减少交叉线如为了减少交叉线),也完全可以不按这种次序画。此外,层次图和结构图,也完全可以不按这种次序画。此外,层次图和结构图并不指明什么时候调用下层模块。通常上层模块中除了调用下层模块的语并不指明什么时候调用下层模块。通常上层模块中除了调用下层模块的语句之外还有其他语句,究竟是先执行调用下层模块的语句还是先执行其他句之外还有其他语句,究竟是先执行调用下层模块的语句还是先执行其他语句,在图中丝毫没有指明。事实上,层次图和结构图只表明一个模块调语句,在图中丝毫没有指明。事实上,层次图和结构图只表明一个模块调用那些模块,至于模块内还有没有其他成分则完全没有表示。用那些模块,至于模块内还有没有其他成分则完全没有表示。3. 总体设计(总体设计(SD) 通常用层次图作为描绘软件结构的文档。结构图作为文档并不很合适,通常用层次图作为描绘软件结构的文档。结构图作为文档并不很合适,因为图上包含的信息太多有时反而降低了清晰程度。但是,利用因为图上包含的信息太多有时反而降低了清晰程度。但是,利用IPO图或图或数据字典中的信息得到模块调用时传递的信息,从而由层次图导出结构图数据字典中的信息得到模块调用时传递的信息,从而由层次图导出结构图的过程,却可以作为检查设计正确性和评价模块独立性的好方法。传送的的过程,却可以作为检查设计正确性和评价模块独立性的好方法。传送的每个数据元素都是完成模块功能所必须的吗每个数据元素都是完成模块功能所必须的吗?反之,完成模块功能必须的每反之,完成模块功能必须的每个数据元素都传送来了吗个数据元素都传送来了吗?所有数据元素都只和单一的功能有关吗所有数据元素都只和单一的功能有关吗?如果发如果发现结构图上模块间的联系不容易解释,则应该考虑是否设计上有问题。现结构图上模块间的联系不容易解释,则应该考虑是否设计上有问题。面向数据流的设计方法面向数据流的设计方法面向数据流的设计方法的目标是给出设计软件结构的一个系统化的途径面向数据流的设计方法的目标是给出设计软件结构的一个系统化的途径在软件工程的需求分析阶段,信息流是一个关键考虑,通常用数据流图在软件工程的需求分析阶段,信息流是一个关键考虑,通常用数据流图描绘信息在系统中加工和流动的情况。面向数据流的设计方法定义了一描绘信息在系统中加工和流动的情况。面向数据流的设计方法定义了一些不同的些不同的“映射映射”,利用这些映射可以把数据流图变换成软件结构。因,利用这些映射可以把数据流图变换成软件结构。因为为任何软件系统都可以用数据流图表示,所以面向数据流的设计方法理论任何软件系统都可以用数据流图表示,所以面向数据流的设计方法理论上可以设计任何软件的结构。通常所说的结构化设计方法上可以设计任何软件的结构。通常所说的结构化设计方法(简称简称SD方方法法),也就是基于数据流的设计方法。,也就是基于数据流的设计方法。3. 总体设计(总体设计(SD)相关概念相关概念面向数据流的设计方法把信息流映射成软件结构,信息流的类型决定了面向数据流的设计方法把信息流映射成软件结构,信息流的类型决定了映射的方法。信息流有下述两种类型。映射的方法。信息流有下述两种类型。1. 变换流变换流参看图,信息沿输入通路进入系统,同时由外部形式变换成内部形式,参看图,信息沿输入通路进入系统,同时由外部形式变换成内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。当数据流图具有这些特征时,这种信息流就外部形式离开软件系统。当数据流图具有这些特征时,这种信息流就叫作变换流。叫作变换流。3. 总体设计(总体设计(SD)2. 事务流事务流基本系统模型意味着变换流,因此,原则上所有信息流都可以归结为这基本系统模型意味着变换流,因此,原则上所有信息流都可以归结为这一类。但是,当数据流图具有和下图类似的形状时,这种数据流是一类。但是,当数据流图具有和下图类似的形状时,这种数据流是“以以事务为中心的事务为中心的”,也就是说,数据沿输入通路到达一个处理,也就是说,数据沿输入通路到达一个处理T,这个处理,这个处理根据输入数据的类型在若干个动作序列中选出一个来执行。这类数据流根据输入数据的类型在若干个动作序列中选出一个来执行。这类数据流应该划为一类特殊的数据流,称为事务流。图应该划为一类特殊的数据流,称为事务流。图5.9中的处理中的处理T称为事务中称为事务中心,它完成下述任务:心,它完成下述任务:(1) 接收输入数据接收输入数据(输入数据又称为事务输入数据又称为事务);(2) 分析每个事务以确定它的类型;分析每个事务以确定它的类型;(3) 根据事务类型选取一条活动通路。根据事务类型选取一条活动通路。3. 总体设计(总体设计(SD)面向数据流的设计方法面向数据流的设计方法时间输入流输出流变换流事务外部表示内部表示信息T事务中心活动通路事务中心事务中心 T 完成下述任务:完成下述任务:接受输入数据(事务)接受输入数据(事务)分析每个事务以确定它的类型分析每个事务以确定它的类型根据事务类型选取一条活动通路根据事务类型选取一条活动通路精化数据流图区分事务中心和数据接收通路映射成事务结构区分输入和输出分支映射成变换结构用启发式设计规则精化软件结构导出接口描述和全程数据结构复查详细设计事务分析变换分析流类型?变换分析:变换分析: 汽车数字仪表板功能:汽车数字仪表板功能: 1) 通过通过A/D 转换实现传感器和微处理器接口,转换实现传感器和微处理器接口, 2) 在发光二极管面板上显示数据,在发光二极管面板上显示数据, 3) 指示每小时英里数(指示每小时英里数(mph),行驶的里程,每加伦油行驶的英里数行驶的里程,每加伦油行驶的英里数(mpg)等等。等等。 4) 指示加速或减速;指示加速或减速; 5) 超速警告:如果车速超过超速警告:如果车速超过55英里英里/小时,则发出超速警告铃声。小时,则发出超速警告铃声。A/D转数计数器流量传感器微处理机里程表车速表油效表油管系统加速/减速指示超速报警读旋转信号收集和求平均转换成转/分(rpm)计算里程确定加速/减速产生加速/减速显示产生里程显示计算mph和超速值计算燃料消耗发出铃声产生mph显示产生mpg显示读和校核计算gph旋转信号信号/秒SPSSPSSPSrpmrpm箭头指示上箭头水平线下箭头英里超速值显示铃声mphmphmpggph燃料流燃料流传感器信号Mpg显示设计步骤:设计步骤:1复查基本系统模型复查基本系统模型2复查并精化数据流图复查并精化数据流图3确定数据流图具有确定数据流图具有变换特性还是事务特变换特性还是事务特性性读旋转信号收集和求平均转换成转/分(rpm)计算里程确定加速/减速产生加速/减速显示产生里程显示计算mph和超速值计算燃料消耗发出铃声产生mph显示产生mpg显示读和校核计算gph旋转信号信号/秒SPSSPSSPSrpmrpm箭头指示上箭头水平线下箭头英里超速值显示铃声mphmphmpggph燃料流燃料流传感器信号Mpg显示4 确定输入流确定输入流 和输出流和输出流 的的 边界,边界, 划分划分 变换或变换或 事务事务 中心中心CmCaCtCe5完成完成 “第一级分解第一级分解”数字仪表板控制接受传感器信号数据转换控制驱动仪表板输入控制变换控制输入控制ADBCCmCaCBDA接受传感器信号转换成rpm收集SPS读旋转信号计算gph读燃料流数字仪表板控制确定加/减速计算mph计算gpg计算里程驱动仪表板加速/减速显示显示mpg显示mph显示里程发出铃声发光二极管显示6进行进行“第二级第二级”分解分解数字仪表板控制接受传感器信号转换成rpm读旋转信号计算gph读燃料流数字仪表板控制确定加/减速计算mph计算gpg计算里程驱动仪表板加速/减速显示显示mpg显示mph显示里程发出铃声发光二极管显示数字仪表板软件系统经过调整后的结构图注意:红色模块的位置有所调整7对软件结构进一步精化对软件结构进一步精化事务分析432总控接收通路C通路B通路A通路调度A_CTL142+1321B_CTLC_CTL设计优化先使系统工作起来,然后使它快起来。数据流图软件结构3.3 详细设计(详细设计(SD)目标:目标: 确定应该怎样具体地实现所要求的系统。确定应该怎样具体地实现所要求的系统。作用:作用: 在总体设计阶段采用自顶向下逐步求精的方法,可以把一个复杂问题在总体设计阶段采用自顶向下逐步求精的方法,可以把一个复杂问题的解法分解和细化成一个由多个模块组成的层次结构的软件系统。而在的解法分解和细化成一个由多个模块组成的层次结构的软件系统。而在详细设计或编码阶段可采用自顶向下逐步求精的方法,可以把一个模块详细设计或编码阶段可采用自顶向下逐步求精的方法,可以把一个模块的功能逐步分解、细化为一系列的具体处理描述,从而在编码阶段可以的功能逐步分解、细化为一系列的具体处理描述,从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序把这个描述直接翻译成用某种程序设计语言书写的程序3.3 详细设计(详细设计(SD)1.结构程序设计结构程序设计2. E. W. Dijstra与与Goto语句,语句,1966,Bohm 和和 Jacobini 证明了只要顺序、证明了只要顺序、选择、循环这三种基本结构就能实现任何单入口单出口的程序。选择、循环这三种基本结构就能实现任何单入口单出口的程序。结构程序设计:结构程序设计: 一种程序设计技术,它采用自顶向下逐步求精的设计方法和单入一种程序设计技术,它采用自顶向下逐步求精的设计方法和单入口单出口的控制结构。并且尽可能少用口单出口的控制结构。并且尽可能少用GO TOGO TO语句的程序设计方法。语句的程序设计方法。使用结构化程序设计技术的好处:使用结构化程序设计技术的好处:1可以显著提高软件开发工程的成功率和生产率可以显著提高软件开发工程的成功率和生产率2层次结构清晰,容易阅读和理解层次结构清晰,容易阅读和理解3容易保证程序的正确性和纠正错误(单入口、单出口)容易保证程序的正确性和纠正错误(单入口、单出口)4源程序代码精晰流畅,易读易懂易测试源程序代码精晰流畅,易读易懂易测试5可重用代码量大(在修改或重新设计时)可重用代码量大(在修改或重新设计时)6程序的逻辑结构清晰,有利于程序正确性证明程序的逻辑结构清晰,有利于程序正确性证明7不足之处:存储容量和运行时间有所增加(增不足之处:存储容量和运行时间有所增加(增10%20%) 1、程序流程图(程序框图)开始或停止准备选择多分支选择注释预先定义的处理,子程序循环下界循环上界处理控制流3.3 详细设计(详细设计(SD)3.3 详细设计(详细设计(SD)1、程序流程图 (程序框图)循环的标准符号循环的标准符号循环的标准符号循环的标准符号 注解的使用注解的使用注解的使用注解的使用2 盒图(盒图(N_S图)图)S1S2S3条件FTElse部分Then部分Case条件值1值2。值nCase1部分Case2部分Casen部分循环条件Do-While部分循环条件Do-Until部分A特点:1)功能域(既一个特定控制结构的作用域)明确2)不可能任意转移控制3)很容易确定局部和全程数据的作用域4)很容易表现嵌套关系,也可以表示模块的层次结构3 PAD 图图P1P2P1P2条件CPnP2P1WHILECPUNTILCPdef顺序选择Case型多分支选择当型循环直到型循环语句标号定义3 PAD 图图P1P2P3P4CP5P2defP6P3P8CUntilC3UNTILC2P9P10PAD图的主要优点图的主要优点:使用PAD符号设计的程序必然是结构化的程序.PAD图所描绘的程序结构十分清晰.用PAD图表现程序逻辑,易读,易记,易懂.容易将PAD图转换成高级语言源程序.可用软件工具实现自动转换.即可以表示程序逻辑,也可以描绘数据结构.支持自顶向下,逐步求精方法的使用.x4TFDo-Until x5ighfkx1TFbDo-Until x6ajx21cDo-While x323dek :例:例:N-S图与图与PAD的转换的转换开始开始 结束结束 aj Until x5i Until x6bx1kfx4ghdefkx2de123 While x3c4、 判定表判定表程序流程图、N-S图、PAD图或过程设计语言(PDL)都不易清楚的描述含有多重嵌套的条件选择。判定表可以清晰的表示复杂的条件组合与其对应的处理之间的关系。例子假设某航空公司规定,乘客可以免费托运重量不超过30公斤的行李。当行李重量超过30公斤时,对头等舱的国内乘客超重部分每公斤收费4元,对其它舱的国内乘客超重部分每公斤收费6元,对外国乘客超重部分每公斤收费比国内乘客多一倍,对残疾乘客超重部分每公斤收费比正常乘客少一半。用判定表来表示与上述每种条件组合相对应的动作。所有条件条件组合矩阵与每种条件组合所对应的动作表所有可能的动作列表国内乘客头等舱残疾乘客行李30kg免费(W-30)*2(W-30)*3(W-30)*4(W-30)*6(W-30)*8(W-30)*2TTTFTTTTTTTTTTFFFFFFFFFFFFFFFFFFF5、 判定树判定树行李费算法行李重量W30国内乘客外国乘客头等舱其它舱残疾乘客-(W-30)*2正常乘客-(W-30)*4残疾乘客-(W-30)*3正常乘客-(W-30)*6头等舱其它舱残疾乘客-(W-30)*4正常乘客-(W-30)*8残疾乘客-(W-30)*6正常乘客-(W-30)*12行李重量W30免费12345教授TFFF副教授FTFF讲师FFTF助教FFFT讲座TFFFF5030252015例例:某某校校制制定定了了教教师师的的讲讲课课课课时时津津贴贴标标准准。对对于于各各种种性性质质的的讲讲座座,无无论论教教师师是是什什么么职职称称,每每课课时时津津贴贴费费一一律律是是5050元元;而而对对于于一一般般的的授授课课,则则根根据据教教师师的的职职称称来来决决定定每每课课时时津津贴贴费费:教教授授3030元元,副副教教授授2525元元,讲讲师师2020元,助教元,助教1515元。元。教师课时津贴判定树教师课时津贴判定树课时津贴一般授课讲座教授副教授讲师助教30252015506过程设计语言PDL 过程设计语言PDL也称为伪码PC(Pseudo Code),它是用正文形式表示数据数据和自理过程的设计工具。 PDL具用严格的关键字外部语法,用于定义控制结构和数据结构;另一方面,PDL表示实际操作和条件的内部语法通常又是灵活自由的,以便适应各种工程项目的需要。因此,一般来说,PDL是一种“混杂”的语言,它使用一种语言(如自然语言)的词汇,同时却使用另一种语言(结构化程序设计语言)的语法例:求最大数的算法用PDL或伪码描述如下:ater a vectorSet Maximum to the value of The first element in the vector Do for each element From the second one to the last If value of the elemant is greaterThan the Maximum value Set Maximom to value of the elemeat ENDIFENDDOPrint the Maximum value也可简写为: Input array ADO for I=2 to N If MAXA(I) Set MAX=A(I) ENDIFENDDOPrint MAX 一、一、Jackson 程序设计方法程序设计方法 前面介绍了面向数据流的设计方法,即概括数据流确定是软件结的方法。下面前面介绍了面向数据流的设计方法,即概括数据流确定是软件结的方法。下面要介绍一种面向数据结构的设计方法,即用数据结构作为程序设计的基础。要介绍一种面向数据结构的设计方法,即用数据结构作为程序设计的基础。 面向数据结构的设计方法的最终目标是得出对程序处理过程的描述。这种设面向数据结构的设计方法的最终目标是得出对程序处理过程的描述。这种设计方法最适合在详细设计阶段使用,也就是说,在完成了软件结构的总体设计之计方法最适合在详细设计阶段使用,也就是说,在完成了软件结构的总体设计之后,可以使用面向数据结构的方法来设计每个模块的处理过程。后,可以使用面向数据结构的方法来设计每个模块的处理过程。 Jackon程序设计方法是由英国人程序设计方法是由英国人M.Jackon提出的结构程序设计方法。这个方提出的结构程序设计方法。这个方法在设计较简单的数据处理系统时特别方便。法在设计较简单的数据处理系统时特别方便。3.3 详细设计(详细设计(SD)一一Jackon图数据数据结构种构种类繁多,但是它繁多,但是它们的数据元素之的数据元素之间的的逻辑关系只有关系只有顺序、序、选择和和重复三重复三类。因此,。因此,逻辑数据数据结构也只有构也只有这三三类。1顺序序结构构 顺序序结构的数据由一个或多个数据元素构的数据由一个或多个数据元素组成,每个元素按确定次序出成,每个元素按确定次序出现一次一次ABCD例图:A由B、C、D三个元素顺序组成 2选择结构选择结构 选择结构的数据包含两个或多个数据元素,每次使用该数据时按一定选择结构的数据包含两个或多个数据元素,每次使用该数据时按一定条件从这些数据元素中选择一个。条件从这些数据元素中选择一个。3重复结构重复结构 重复结构的数据,根据使用时的条件,由一个数据元素出现零次或多重复结构的数据,根据使用时的条件,由一个数据元素出现零次或多次构成次构成 AB0 C0 D0 根据条件,A是B或C或D中的某一个。 AB*A由B出现N次(N0)组成(注意:B的右上角有*) 二改进的二改进的Jackon图图 上面的后两个图中,选择条件和循环结束条件无法标出,影响了图的表达能力,不易译成程序。建议使用改进的Jackon图。(a)顺序结构(b)选择结构s(i)为(c)可选结构为(b)的(d)重复结构i是循环结BCD中任一都条件,i是分支条件特殊情形束条件的编号不能是选择和重复的数据元素ABCDABoCoDoABoA B*_oS(i)S(i)顺序结构A seq B C D A end 选择结构 A select cond1 B A or cond2 C A or cond3 D A end 重复结构 A iter until cond B A end 三Jackson方法Jackson结构程序设计方法由下列五步组成:1分析、确定输入数据和输出数据的逻辑结构,并用jackson图描绘这些数据结构。2找出输入数据和输出数据结构中有对应关系的数据单元:3由描绘数据结构的Jackson图导出描绘程序结构的Jackson图:(1)为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框;(2)根据输入数据结构中乘余的每个数据单元所处的层次,在程序结构图的相应层次分列为它们画对应的处理框。(3)根据输出数据结构中乘余的每个数据单元所处的层次,在程序结构图的相应层次为它们画出对应的处理框。4列出所有的操作和条件,将它们分配到程序结构图的适当位置。5用伪码表示程序。(有下划 的为关键字)用伪码表示程序处理过程确定输入输出数据结构确定数据结构中有对应关系的数据单元从数据结构图导出程序结构图列出所有操作和条件并分配到程序结构图中适当的位置设计步骤正文文件字符串*字符*非空格0空格0IIS输出表格表格体空格总数串信息*字符串空格数I应用举例:应用举例: 一个正文文件由若干个一个正文文件由若干个记录组成,每个记录是记录组成,每个记录是一个字符串。要求统计一个字符串。要求统计每个记录中空格字符的每个记录中空格字符的个数以及文件中空格字个数以及文件中空格字符的总个数。要求的输符的总个数。要求的输出数据格式是,每复制出数据格式是,每复制一行输入字符串之后,一行输入字符串之后,另起一行印出这个字符另起一行印出这个字符串中的空格数,最后印串中的空格数,最后印出文件中空格总个数。出文件中空格总个数。统计表格程序体印总数处理字符串*印字符串分析字符串I印空格数分析字串*I处理空格*处理非空格*S统计表格程序体印总数处理字符串*印字符串分析字符串I(1)印空格数分析字串*I(2 )处理空格*处理非空格*S(3)2911316471313停止关闭文件印出空格总数打开文件读入字符串Totalsum:=0文件结束印出字符串字符串结束字符是空格Sum:=sum+1Pointer:=pointer+1101289Sum:=0Pointer:=1Totalsum:=totalsum+sum读入字符串统计空格统计空格seq 打开文件打开文件 读入字符串读入字符串 totalsum=0 程序体程序体iter until文件结束文件结束 处理字符串处理字符串 seq 印字符串印字符串seq 印出字符串印出字符串 印出字符串印出字符串end sum t=0 pointer t=1 例:高考后将考生的基本情况文件(简称考生基本情况文件)和考生高考成绩文件(简称考分文件)合并成一个新文件(简称考生新文件)。考生基本情况文件和考分文件都是由考生记录组成的。为简便起见,考生基本情况文件中的考生记录的内容包括:准考证号、姓名、通讯地址。考分文件中的考生记录的内容包括:准考证号和各门考分。合并后的考生新文件自然也是由考生记录组成,内容包括:准考证号、姓名、通讯地址和各门考分。Jackson程序设计方法由五个步骤组成:第一步第一步 数据结构表示数据结构表示对要求解的问题进行分析,确定输入数据和输出数据的逻辑结构,并用Jackson图描述这些数据结构。考生新文件考生记录*准考证号姓名通讯地址考分考生情况文件考生记录*准考证号姓名通讯地址考分文件考生记录*准考证号考分II(a)输入数据结构(b)输出数据结构I第二步第二步 找出输入数据结构和输出数据结构的对应关系找出输入数据结构和输出数据结构的对应关系找出输入数据结构和输出数据结构中有对应关系的数据单元,即有直接因果关系、在程序中可以同时处理的数据单元。需要注意的是,对于重复的数据单元,必须是重复的次序、次数都相同才有可能有对应关系。第三步第三步 确定程序结构图确定程序结构图根据下述三规则,由Jackson图导出相应的程序结构图:(1)为每对有对应关系的数据单元,按照它们在数据结构图中所处的层次,在程序结构图中的相应层次画一个处理框。如果这对数据单元在输入数据结构图和输出数据结构图中所处的层次不同,那么应以它们在输入数据结构图和输出数据结构图中层次较低的那个层次作为它们在程序结构图中的处理框所处的层次;(2)对于输入数据结构中剩余的数据单元,根据它们所处的层次,在程序结构图的相应层次为每个数据单元画上相应的处理框;(3)对于输出数据结构中剩余的数据单元,根据它们所处的层次,在程序结构图的相应层次为每个数据单元画上相应的处理框。实际上,这一步是一个综合的过程:每对有对应关系的数据单元合画一个处理框,没有对应关系的数据单元则各画一个处理框。第四步第四步 列出并分配所有操作和条件列出并分配所有操作和条件 列出所有操作和条件(包括分支条件和循环结束条件),并把它们分配到程序结构图的适当位置。操作:(操作:(1)停止;)停止;(2)打开两个输入文件;)打开两个输入文件;(3)建立输出文件。)建立输出文件。(4)从输入文件中各读一条记录。)从输入文件中各读一条记录。(5)生成一条新记录。)生成一条新记录。(6)将新记录写入输出文件。)将新记录写入输出文件。(7)关闭全部文件。)关闭全部文件。条件:条件:I(1)文件结束。)文件结束。 把操作和条件分配到程序结构图的适当位置第五步第五步 用伪码表示程序用伪码表示程序 Jackson方法中使用的伪码与Jackson图是完全对应的。针对三种基本程序结构,有相对应的Jackson伪码。(1)顺序结构A seqBCDA end(2)选择结构(3)重复结构A select condition1BA or condition2CA or condition3DA endA iter until(或或while) conditionBA end用Jackson伪码描述的程序:产生新文件产生新文件 seq打开两个输入文件打开两个输入文件从输入文件中各读一条记录从输入文件中各读一条记录分析考生记录分析考生记录iter until文件结束文件结束处理考生记录处理考生记录 seq产生准考证号产生准考证号产生姓名产生姓名产生通讯地址产生通讯地址产生考分产生考分生成一条新记录生成一条新记录将新记录写入输出文件将新记录写入输出文件从输入文件中各读一条记录从输入文件中各读一条记录处理考生记录处理考生记录 end关闭全部文件关闭全部文件停止停止产生新文件产生新文件 end 3.4 面向对象的设计面向对象的设计 3.4.1 面向对象的设计概述面向对象的设计概述 面向对象的设计面向对象的设计( (简称简称OOD)OOD)与与结构化设计有很结构化设计有很大的不同,大的不同,面向对象的设计是在面向对象的分析面向对象的设计是在面向对象的分析(简简称称OOA)的基础上,对的基础上,对OOA模型逐渐扩充的过程。模型逐渐扩充的过程。OODOOD和和OOAOOA采用相同的符号表示,采用相同的符号表示, OOD OOD和和OOAOOA没有明显没有明显的分界线,它们往往反复迭代地进行。的分界线,它们往往反复迭代地进行。 在在OODOOD时,主要解决系统如何做,因此需要在时,主要解决系统如何做,因此需要在OOAOOA的模型中为系统的实现补充一些新的类,或在原的模型中为系统的实现补充一些新的类,或在原有类中补充一些属性和操作。有类中补充一些属性和操作。OODOOD时应能从类中导出时应能从类中导出对象,以及这些对象如何互相关联,还要描述对象对象,以及这些对象如何互相关联,还要描述对象间的关系、行为以及对象间的通信如何实现。间的关系、行为以及对象间的通信如何实现。 3.4.1 面向对象的设计概述面向对象的设计概述 可把面向对象的设计分为总体设计和详细设计两个阶段。可把面向对象的设计分为总体设计和详细设计两个阶段。在总体设计阶段主要重点放在解决系统高层次问题上,如将在总体设计阶段主要重点放在解决系统高层次问题上,如将OOA模型如何划分成子系统、选择构造系统的策略等等,通模型如何划分成子系统、选择构造系统的策略等等,通常在面向对象的设计中把它称为系统设计阶段。在详细设计常在面向对象的设计中把它称为系统设计阶段。在详细设计阶段主要解决系统的一些细节问题,如类、关联、接口形式阶段主要解决系统的一些细节问题,如类、关联、接口形式及实现服务的算法等,通常在面向对象的设计中把它称为对及实现服务的算法等,通常在面向对象的设计中把它称为对象设计阶段。象设计阶段。 目前有许多种面向对象的设计方法,其中典型的有:目前有许多种面向对象的设计方法,其中典型的有:Coad & Yourdon方法方法(即著名的即著名的OOA/OOD方法方法)、OMT(Object Modeling Technique)方法、方法、Booch方法、方法、OOSE(ObjectOriented Software Engineering)方法及方法及RUP(Rational Unified Process)方法等。方法等。 3.4.2 系统设计系统设计 1. 1. 系统设计概况系统设计概况 系统设计是把分析模型转变成系统设计模型。系统设计是把分析模型转变成系统设计模型。分析模型由功能模型、对象模型和动态模型组成。分析模型由功能模型、对象模型和动态模型组成。在在UML中,功能模型用用例图表示,对象模型用类中,功能模型用用例图表示,对象模型用类图表示,动态模型用状态图和顺序图表示。系统设图表示,动态模型用状态图和顺序图表示。系统设计时将这些模型作为输入,将这些输入转变成包含计时将这些模型作为输入,将这些输入转变成包含系统内部结构信息的系统设计模型,系统内部结构信息的系统设计模型,或者更一般地或者更一般地说,说,转变成系统的硬件配置是如何实现的模型。转变成系统的硬件配置是如何实现的模型。 系统设计的结果是得到一个模型,包括各个策系统设计的结果是得到一个模型,包括各个策略的清晰描述、子系统分解的略的清晰描述、子系统分解的UML包图以及表示系包图以及表示系统硬件软件映射的统硬件软件映射的UML配置图。配置图。 1. 1. 系统设计概况系统设计概况 对于一个复杂的系统为了减少复杂性,开发人员对于一个复杂的系统为了减少复杂性,开发人员把系统分解成若干较小的部分,这些较小部分通常称把系统分解成若干较小的部分,这些较小部分通常称为子系统,这些子系统可以独立实现。为子系统,这些子系统可以独立实现。系系统设计是一是一个个围绕定定义子系子系统的多次反复的活的多次反复的活动。如何将一个复如何将一个复杂的系统分解,这需要面对整个系统范围的问题进行杂的系统分解,这需要面对整个系统范围的问题进行考虑。特别需要解决以下问题:考虑。特别需要解决以下问题:v软硬件映射。v数据管理。 v访问控制。 v控制流。 v边界条件。 2 UML包图和包图和UML配置图配置图 1.UML包图包图2.2. 对于一个复杂的系统,通常都是把它分解对于一个复杂的系统,通常都是把它分解成若干较小的系统成若干较小的系统( (或称子系统或称子系统) ),如果需要的话,如果需要的话,每个较小的系统还可分解成更小的系统,这是一种每个较小的系统还可分解成更小的系统,这是一种解决问题复杂性的有效方法解决问题复杂性的有效方法3.3. 在在UMLUML中使用了包的机制,一个包相当于一中使用了包的机制,一个包相当于一个子系统。包是一种分组机制,包用于定义一个名个子系统。包是一种分组机制,包用于定义一个名字空间或容器字空间或容器( (Container)Container),它本身是它本身是UMLUML的一种模的一种模型元素。它把一些模型元素组织成语义上相关的组,型元素。它把一些模型元素组织成语义上相关的组,包中拥有的或涉及的所有模型元素叫做包的内容。包中拥有的或涉及的所有模型元素叫做包的内容。 (1) UML(1) UML包图包图 作为模型组织的分组机制,包的实例是没有意义的因作为模型组织的分组机制,包的实例是没有意义的因此包仅在建模时有用,而不需要转换成可执行的系统。此包仅在建模时有用,而不需要转换成可执行的系统。 包的图标是一个大矩形包的图标是一个大矩形( (内容框内容框) )的左上角带一个小矩形的左上角带一个小矩形( (名字框名字框) ) 。包的名字可以用一个简单名。包的名字可以用一个简单名( (文字串文字串) )表示,或用表示,或用路径名表示。在包名之上可附加诸如路径名表示。在包名之上可附加诸如SystemSystem、SubsystemSubsystem等符号,表示该包是系统模型和子系统。在包等符号,表示该包是系统模型和子系统。在包名之后或之下,可以用括在花括号中的文字说明包的性质。名之后或之下,可以用括在花括号中的文字说明包的性质。 包可以嵌套,包的嵌套可以清晰地表现系统模型元素间包可以嵌套,包的嵌套可以清晰地表现系统模型元素间的相互关系,但包的嵌套不宜过深,包的嵌套层数一般以的相互关系,但包的嵌套不宜过深,包的嵌套层数一般以2 23 3层为宜。包之间可以有关系,主要有两种:依赖和泛化。包层为宜。包之间可以有关系,主要有两种:依赖和泛化。包的依赖是用一条虚箭线表示,虚箭线从依赖包的依赖是用一条虚箭线表示,虚箭线从依赖包( (源源) )指向目标指向目标包。包的依赖没有传递性。包的泛化用一条带空心三角箭头包。包的依赖没有传递性。包的泛化用一条带空心三角箭头的实线表示,箭尾连接特殊包,箭头指向一般包,意指特殊的实线表示,箭尾连接特殊包,箭头指向一般包,意指特殊包必须遵循一般包的接口。包必须遵循一般包的接口。 (1) UML包图包图 包图由包和包之间的联系构成。包图的图形节点是包,节包图由包和包之间的联系构成。包图的图形节点是包,节点之间用弧点之间用弧( (依赖或泛化依赖或泛化) )连接。连接。 数据库子系统财务子系统数据库操作数据库接口Oracle接口Sybase接口包图图例(2) UML配置图配置图 UMLUML配置图用来描述运行时组件和硬件节点间的关配置图用来描述运行时组件和硬件节点间的关系。组件是为其他组件或执行者提供服务的独立实系。组件是为其他组件或执行者提供服务的独立实体。体。 UMLUML配置图的基本元素有结点、连接、组件、配置图的基本元素有结点、连接、组件、对象、依赖等。对象、依赖等。 结点是某种点是某种计算算资源的物理源的物理对象,包括象,包括计算机、算机、设备( (如打印机、如打印机、读卡机、通信卡机、通信设备) )等。等。结点既可看点既可看作作类型,也可看作型,也可看作实例。例。结点用三点用三维立方体表示,立方体表示,中中间写上写上结点名,当点名,当结点表示点表示实例例时,名字,名字应加下加下划划线。结点上点上还可附加可附加诸如如printerprinter、RouterRouter等符号,表示特定的等符号,表示特定的设备类型。型。 (2) UML配置图配置图 结点通过通信关联相互连接,连接用一条直线表结点通过通信关联相互连接,连接用一条直线表示,它指出结点之间存在着某种通信路径,并指出通示,它指出结点之间存在着某种通信路径,并指出通过哪条通信路径可使这些结点间交换对象或发送消息。过哪条通信路径可使这些结点间交换对象或发送消息。在连接上可附加诸如在连接上可附加诸如TCPTCPIPIP、DecNetDecNet等符号,等符号,以指明通信协议或所使用的网络。以指明通信协议或所使用的网络。 可执行组件实例可以包含在结点实例符号中,表可执行组件实例可以包含在结点实例符号中,表示它们在该结点实例上驻留并执行。组件是用一个大示它们在该结点实例上驻留并执行。组件是用一个大矩形上带两个小矩形表示。组件间的依赖关系可以用矩形上带两个小矩形表示。组件间的依赖关系可以用一条虚箭线表示,虚箭线从依赖组件一条虚箭线表示,虚箭线从依赖组件( (源源) )指向被依赖指向被依赖组件。两个构件实例之间的依赖关系表示一个组件使组件。两个构件实例之间的依赖关系表示一个组件使用了另一个组件的服务。一个对象可以画在一个构件用了另一个组件的服务。一个对象可以画在一个构件实例中,也可以画在结点实例中,表示它驻留在该结实例中,也可以画在结点实例中,表示它驻留在该结点上,还可以用嵌套的方式把对象画在另一个对象中。点上,还可以用嵌套的方式把对象画在另一个对象中。3 系统分解系统分解 系统设计的首要任务通常要把系统划分成小的子系系统设计的首要任务通常要把系统划分成小的子系统。每个子系统共享某些公共特性,并完成系统某个统。每个子系统共享某些公共特性,并完成系统某个方面的功能,在相同的物理位置或同样的硬件上运行。方面的功能,在相同的物理位置或同样的硬件上运行。一个子系统不是一个对象,也不是一个功能。它是类、一个子系统不是一个对象,也不是一个功能。它是类、关联、操作、事件和约束的一个相关集合。通常一个关联、操作、事件和约束的一个相关集合。通常一个子系统由它提供的服务来识别,所谓一个服务就是一子系统由它提供的服务来识别,所谓一个服务就是一组具有共同目标的相关功能。组具有共同目标的相关功能。 将系统按照某种要求进行划分是系统设计中决定将系统按照某种要求进行划分是系统设计中决定整个系统结构的关键一步。在这一步中就是根据系统整个系统结构的关键一步。在这一步中就是根据系统分析的三种模型,将系统分析中得到的类组成子系统,分析的三种模型,将系统分析中得到的类组成子系统,用用UMLUML表示就是将系统分析中得到的类放入不同的包表示就是将系统分析中得到的类放入不同的包中,每一个包就是一个子系统。如何组织子系统或包,中,每一个包就是一个子系统。如何组织子系统或包,一般按照下列原则组织:一般按照下列原则组织: 3 系统分解系统分解 将提供通用服务将提供通用服务( (或者一组相关服务集或者一组相关服务集) )的类组织成的类组织成一个子系统或包,这些类之间具有高耦合度和密切的协一个子系统或包,这些类之间具有高耦合度和密切的协作关系。作关系。 系统分解为子系统后可以组织成一系列的水平分层系统分解为子系统后可以组织成一系列的水平分层和垂直分块。和垂直分块。 (1) (1) 分层分层 这种组织方式把软件系统组织成一个层次系统,每这种组织方式把软件系统组织成一个层次系统,每层是一个子系统。上层在下层的基础上建立,下层为实层是一个子系统。上层在下层的基础上建立,下层为实现上层功能而提供必要的服务。每一层内所包含的对象,现上层功能而提供必要的服务。每一层内所包含的对象,彼此间相互独立,而处于不同层次上的对象,彼此间往彼此间相互独立,而处于不同层次上的对象,彼此间往往有关联。消息的流动是单向的,一个子系统只知道它往有关联。消息的流动是单向的,一个子系统只知道它下层的存在。层次结构又可进一步划分成两种模式:封下层的存在。层次结构又可进一步划分成两种模式:封闭式和开放式。闭式和开放式。 3 系统分解系统分解(2) (2) 分块分块 这种组织方案把软件系统垂直地分解成若这种组织方案把软件系统垂直地分解成若干个相对独立的、弱耦合的子系统,一个子干个相对独立的、弱耦合的子系统,一个子系统相当于一块,每块提供一种类型的服务。系统相当于一块,每块提供一种类型的服务。 利用分层和分块的各种组合,可以将多利用分层和分块的各种组合,可以将多个子系统组织成一个完整的软件系统。当混个子系统组织成一个完整的软件系统。当混合使用层次结构和块状结构时,同一层次可合使用层次结构和块状结构时,同一层次可以由若干块组成,而同一块也可以分为若干以由若干块组成,而同一块也可以分为若干层。层。 3.4.3 对象设计对象设计 对象设计是对分析和系统设计成果的进一步细化,对象设计是对分析和系统设计成果的进一步细化,在需求分析中,我们获得了系统的对象模型、动态模在需求分析中,我们获得了系统的对象模型、动态模型和功能模型。对象模型系统中的对象和类,包括它型和功能模型。对象模型系统中的对象和类,包括它们的属性和操作。对象模型中的信息必须以某种形式们的属性和操作。对象模型中的信息必须以某种形式在设计中呈现出来,通常最简单和最好的方法就是把在设计中呈现出来,通常最简单和最好的方法就是把分析得到的类直接带到设计中。而对象设计仅仅是一分析得到的类直接带到设计中。而对象设计仅仅是一个添加细节并做出实现决策的过程。功能模型描述系个添加细节并做出实现决策的过程。功能模型描述系统中必须实现的操作。在对象设计过程中,我们必须统中必须实现的操作。在对象设计过程中,我们必须确定如何实现每一个操作,选择操作的算法,并把复确定如何实现每一个操作,选择操作的算法,并把复杂的操作分解成简单的操作。这种分解是一个必须在杂的操作分解成简单的操作。这种分解是一个必须在相关低级抽象层次上反复迭代的过程。动态模型描述相关低级抽象层次上反复迭代的过程。动态模型描述了系统如何响应外部事件,程序的控制结构是从动态了系统如何响应外部事件,程序的控制结构是从动态模型中导出来的。模型中导出来的。3.4.3 对象设计对象设计具体步骤大致如下:具体步骤大致如下: 组合三种模型组合三种模型(对象模型、动态模型、功能模型对象模型、动态模型、功能模型)以获得以获得类中的操作。类中的操作。 实现操作的设计算法。实现操作的设计算法。 优化数据的访问。优化数据的访问。 实现外部交互式地控制。实现外部交互式地控制。 调整类结构以提高继承性。调整类结构以提高继承性。 设计关联。设计关联。 确定对象属性的精确表示。确定对象属性的精确表示。 把类和关联封装成模块。把类和关联封装成模块。 上述上述8个步骤用个步骤用UML表达时,就是对用例图、状态图、顺序表达时,就是对用例图、状态图、顺序图、类图及对象图等的反复细化。从各个侧面来不断求精系统,图、类图及对象图等的反复细化。从各个侧面来不断求精系统,直至得到一个能够实现的、精确的系统描述。直至得到一个能够实现的、精确的系统描述。 3.4.4 设计模式设计模式 有经验的面向对象的开发人员有经验的面向对象的开发人员( (和其他一些软件开和其他一些软件开发人员发人员) )建立了一套一般原则和常用解决方案的建立了一套一般原则和常用解决方案的“指令指令集集”,用来指导软件设计。这些原则和惯用法如果用格,用来指导软件设计。这些原则和惯用法如果用格式编纂成文,文中描述了所要解决的问题和对应的解决式编纂成文,文中描述了所要解决的问题和对应的解决方案,并且被赋予名字,那么这些原则和惯用就被称为方案,并且被赋予名字,那么这些原则和惯用就被称为模式模式(pattern)(pattern)。一个一个设计模式通常可用四个信息来描模式通常可用四个信息来描述:述: 1) 1) 模式名。模式名。 2) 2) 所解决的问题。所解决的问题。 3) 3) 解决方案。解决方案。 4) 4) 应用设计模式的效果。应用设计模式的效果。 面向对象设计中面向对象设计中2323种常用的设计模式种常用的设计模式 1.1.1)Abstract Factory1)Abstract Factory。 2) 2) AdapterAdapter。2.2.3) 3) BridgeBridge。 4) 4) BuilderBuilder。 3.3.5) Visitor5) Visitor。 6) Command6) Command。4.4.7) Composite7) Composite。 8) Decorator8) Decorator。 5.5.9) Factory Method9) Factory Method。 10) Facade10) Facade。 6.6.11) Flyweight11) Flyweight。 12) Interpreter12) Interpreter。 7.7.13) 13) IteratorIterator。 14) Mediator14) Mediator。 8.8.15) Memento15) Memento。 16) Observer16) Observer。 9.9.17) Prototype17) Prototype。 18) Proxy18) Proxy。 10.10.19) Singleton19) Singleton。 20) State20) State。 11.11.21) Template Method21) Template Method。 22) Strategy22) Strategy。 12.12.23) Chain of Responsibility23) Chain of Responsibility。3.5 人机界面的设计人机界面的设计研究的必要性研究的必要性 人机界面设计是接口设计的一个重要组成部分,人机界面的设计质量,直接影响人机界面设计是接口设计的一个重要组成部分,人机界面的设计质量,直接影响了用户对了用户对软件产品的评价,从而影响软件产品的竞争力和寿命。软件产品的评价,从而影响软件产品的竞争力和寿命。一、设计问题一、设计问题 系统响应时间:从用户完成某个控制动作到软件给出预期响应之间的时间。系统响应时间:从用户完成某个控制动作到软件给出预期响应之间的时间。 重要属性:长度、易变性重要属性:长度、易变性 用户帮助设施:用户帮助设施: 集成的用户帮助设施集成的用户帮助设施 附件的用户帮助设施附件的用户帮助设施注意的问题:帮助内容,请求、显示、返回方式等等注意的问题:帮助内容,请求、显示、返回方式等等 出错处理:出错信息、警告信息应具有以下属性:可理解、建设性、警告性、出错处理:出错信息、警告信息应具有以下属性:可理解、建设性、警告性、显著等等显著等等 命令交互:命令交互: 二、设计过程二、设计过程创建设计模型创建设计模型原型法实现原型法实现用户试用和评估用户试用和评估用户界面用户界面方案方案用户评估及评估标准:(1) 系统及其界面的规格说明书的长度和复杂程度,预示了用户学习使用该系统所需要的工作量。(2) 命令或动作的数量、命令的平均参数个数或动作中单个操作的个数,预示了系统的交互时间和总体效率。(3) 设计模型中包含的动作、命令和系统状态的数量,预示了用户学习使用该系统时需要记忆的内容的多少。(4) 界面风格、帮助设施和出错处理协议,预示了界面的复杂程度及用户接受该界面的程度。三、人机界面设计指南1一般交互指南2 信息显示指南3 数据输入指南利用软件设计的基本原理和概念可以定性的衡量软件模块的质量。但定量的度量程序复杂程度的方法很有价值:估算程序中软件故障的数量;估算软件开发的工作量;比较两个不同的设计或两个不同算法的友劣;作为模块规模的精确上限。程序定量度量方法是一个有待进一步研究的重要领域。一、McCabe方法程序图把程序流程图中每个处理符号都退化成一个点,原来连接不同处理符号的箭头变成连接不同点的有向弧,这样得到的有向图就称为程序图。程序图仅仅描述程序内部的控制流程,完全不表现对数据的具体操作以及分支或循环的具体条件。入口点:程序图中开始点后面的那个节点。出口点:程序图中停止点前面的那个节点。用McCabe方法度量得出的结果称为程序的环形复杂度。3.6 设计质量的度量设计质量的度量环形复杂度的计算方法(1)流图中的区域数等于环形复杂度(2)流图G的环形复杂度V(G)=EN+2其中:E是有向图G中的弧数N-是G中的节点数。(3)流图G的环形复杂度V(G) P+1, 其中P是流图中判定结点的数目环形复杂度的用途:程序的环形复杂度与程序控制流的复杂程度,也就是与程序结构的复杂程度有关。程序内分支数或循环个数增加时,环形复杂度就增加,因此它是对测试难度的一种度量,也能对软件最终的可靠性给出某种预测。McCabe发现:环形复杂度高的程序往往是最困难、最容易出问题的程序。实践表明:模块规模以V(G)10为宜。也就是说,V(G)=10是模块规模的一个更科学更精确的上限。开始K=0L=0TOTAL=0输入ADowhileTOTAL1000andA0A0TOTAL=TOTAL+AK=K+1输入AL=L+1输出K,L,TOTAL停止abcdefghijkabcdefghjikV(G)=12-11+2=312条弧11个节点二HalsCead 方法HalsCead 方法是根据程序中运算符和操作数的总数来度量程序的复杂程度的一种方法。令N1为程序中运算符总现的总次数 N2为操作数出现的总次数。则程序长度N定义为N=N1+N2 当详细设计完成之后,就可以获得程序中使用不同运算符(包括关键字)的个数n,以及不同操作数(变量和常量)的个数n,Halsteed给出预测程序长度的公式为: H=n1 log2 n1+n2 log2 n2Halsteed还给出出预测程序中包含错误的个数据公式为: E=N log2 (n1+n2)/3000Halsteed方法的优点是直接与工作量挂钩,比源程序代码行度量法要精确得多。但在未编码之前无法衡量。给出算法后并不能计算,这一点不如MeCabe的方法。3.7 软件设计软件设计CASE工具工具 目前市场上有许多支持设计的目前市场上有许多支持设计的CASECASE工具,工具,在在这些这些CASECASE设计工具中设计工具中比较流行的产品比较流行的产品有:有:Microsoft VisioMicrosoft Visio、PowerDesignerPowerDesigner、IBM IBM Rational RoseRational Rose、ERwinERwin和和ERERStudioStudio等。等。上上述述这些些产品都是国外的品都是国外的CASECASE工具,国内有一工具,国内有一款款轻量级轻量级CASE工具工具PlayCASE,它全面支持,它全面支持软件生命各个周期,兼容结构化方法和面向软件生命各个周期,兼容结构化方法和面向对象方法,支持对象方法,支持UML语言,能自动生成业务语言,能自动生成业务调查表、需求分析说明书、软件设计说明书调查表、需求分析说明书、软件设计说明书和程序框架等,是一款相当不错的免费的和程序框架等,是一款相当不错的免费的CASE工具。工具。 本章小结本章小结 软件设计是软件开发过程中用以保证质量的关键步骤。软件设软件设计是软件开发过程中用以保证质量的关键步骤。软件设计的主要任务是根据用户需求也即需求规格说明导出系统的计的主要任务是根据用户需求也即需求规格说明导出系统的实现方案。在进行软件设计时应该遵循一些基本原则,其中实现方案。在进行软件设计时应该遵循一些基本原则,其中最主要的原则是模块独立性和可重用性原则。软件设计又分最主要的原则是模块独立性和可重用性原则。软件设计又分为总体设计和详细设计两个阶段。为总体设计和详细设计两个阶段。 总体设计将软件需求转化为数据结构和软件系统的总体结构并总体设计将软件需求转化为数据结构和软件系统的总体结构并建立接口。在传统的结构化总体设计中,利用变换分析和事建立接口。在传统的结构化总体设计中,利用变换分析和事务分析技术把数据流图变换成系统结构图,这是一种面向数务分析技术把数据流图变换成系统结构图,这是一种面向数据流的设计方法。在面向对象的设计中总体设计通常称为系据流的设计方法。在面向对象的设计中总体设计通常称为系统设计。面向对象的设计是对分析模型的进一步精化,分析统设计。面向对象的设计是对分析模型的进一步精化,分析与设计本质上是一个多次反复迭代的过程,因此面向对象分与设计本质上是一个多次反复迭代的过程,因此面向对象分析与面向对象设计的界限尤为模糊。在系统设计中析与面向对象设计的界限尤为模糊。在系统设计中定义子系定义子系统处于系统设计的中心地位。子系统的设计可以用统处于系统设计的中心地位。子系统的设计可以用UMLUML包图来包图来描述。描述。软硬件的映射可以用软硬件的映射可以用UML配置图来描述。配置图来描述。 本章小结本章小结详细设计阶段的任务是在总体设计的基础上,确定怎样具体地实详细设计阶段的任务是在总体设计的基础上,确定怎样具体地实现所要求的目标系统,也就是要为每一个模块或对象设计相应现所要求的目标系统,也就是要为每一个模块或对象设计相应的算法和数据结构。传统的结构化程序设计技术目前已经比较的算法和数据结构。传统的结构化程序设计技术目前已经比较成熟和得到了广泛的运用。它使用的详细设计的描述工具有程成熟和得到了广泛的运用。它使用的详细设计的描述工具有程序流程图、盒图序流程图、盒图(N-S图图)、PAD图、图、PDL语言、判定表和判定语言、判定表和判定树等。树等。JSP方法是一种面向数据结构设计方法,它的最终目标方法是一种面向数据结构设计方法,它的最终目标是得出程序的过程性描述,它并不明确地提出软件应该划分为是得出程序的过程性描述,它并不明确地提出软件应该划分为模块的概念,模块只是设计过程中的副产品。模块的概念,模块只是设计过程中的副产品。 用户界面设计是接口设计的一个重要的组成部分。对于交互式系用户界面设计是接口设计的一个重要的组成部分。对于交互式系统来说,用户界面设计和数据设计、体系结构设计及过程设计统来说,用户界面设计和数据设计、体系结构设计及过程设计一样重要。在设计人机界面的过程中,必须遵循用户界面设计一样重要。在设计人机界面的过程中,必须遵循用户界面设计的一般原则,以及前人在设计人机界面过程中积累的经验,这的一般原则,以及前人在设计人机界面过程中积累的经验,这有助于设计出友好、高效的人机界面。人机界面设计是一个迭有助于设计出友好、高效的人机界面。人机界面设计是一个迭代过程,通常,先创建设计模型,接下来用原型实现这个设计代过程,通常,先创建设计模型,接下来用原型实现这个设计模型并由用户试用和评估原型,然后根据用户意见修改原型,模型并由用户试用和评估原型,然后根据用户意见修改原型,直到用户满意为止。直到用户满意为止。 本章小结本章小结目前,对软件设计的质量进行定量度量还处在发展过程目前,对软件设计的质量进行定量度量还处在发展过程中,技术还不太成熟。其中程序复杂性定量度量的中,技术还不太成熟。其中程序复杂性定量度量的McCabeMcCabe方法比较成熟和使用广泛。使用环形复杂度可方法比较成熟和使用广泛。使用环形复杂度可以定量度量程序的复杂程度,实践表明,环形复杂度以定量度量程序的复杂程度,实践表明,环形复杂度V(G)=10是模块规模的合理上限。是模块规模的合理上限。为了保证设计的质量和效率,需要有一些为了保证设计的质量和效率,需要有一些CASE工具来工具来支持软件设计工作。目前市场上有许多支持设计的支持软件设计工作。目前市场上有许多支持设计的CASE工具,在这些工具,在这些CASE设计工具中比较流行的产设计工具中比较流行的产品有:品有:Microsoft Visio、PowerDesigner、IBM Rational Rose、ERwin和和ERStudio等。国内有一等。国内有一款轻量级款轻量级CASE工具工具PlayCASE,是一款相当不错的,是一款相当不错的免费的免费的CASE工具。工具。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号