【教学课件】第三章软件设计.ppt
第三章 软件设计,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 模块独立性每个模块完成一个相对独立的子 功能,并且和其他模块之间的关 系很简单耦合和内聚两个定性标准度量 耦合:一个软件结构内不同模块之间互连程度的度量。数据耦合:模块之间通过参数交换数据信息。控制耦合:模块之间传递的参数含有控制信息。公共环境耦合:两个或多个模块通过一个公共数据环境相互作用。内容耦合:。,设计原则:尽量使用数据耦合,少用控制耦合,限制公共环境耦合,完全不用内容耦合。,数据耦合,控制耦合,公共环境耦合,内容耦合,低,高,耦合,非直接耦合数据耦合特征耦合控制耦合5。公共环境耦合6。内容耦合,弱耦合,中耦合,较强耦合,强耦合,模块1,模块2,模块3,模块4,数据耦合通过简单变量交换数据,特征耦合通过数据结构交换数据,非直接耦合模块之间没有信息传递,模块A,模块B,模块C,模块D,模块L,模块N,Flag=1?,S1,S2,模块1,控制耦合模块之间传递的是控制信息,T,F,模块A,模块B,内容耦合 访问其它模块的内部数据 直接跳到其他模块内部执行,公共环境耦合通过公共数据环境相互作用,内聚:一个模块内各个元素彼此结合的紧密程度。偶然内聚:一个模块完成一组任务,任务之间的关系很松散。公共语句。逻辑内聚:若干个逻辑功能类似的任务组成一个模块。时间内聚:若干个任务必须在同一段时间内执行。如初始化工作。,低内聚,中内聚,高内聚,过程内聚:模块内的处理元素是相关的,且必须以特定次序执行。通信内聚:模块中所有元素都使用同一个输入数据,和/或产生同一个 输出数据。,顺序内聚:模块中所有处理元素和同一个功能密切相关,且这些处理必 须顺序执行,通常上一个任务的输出是下一个任务的输入。功能内聚:所有处理元素属于一个整体,完成一个单一的功能。,3.总体设计(SD),3 抽象与细化在抽象的最高层次使用问题环境语言,以概括的方式叙述问题的解法在较低抽象层次采用更过程化的方法,把面向问题的术语和面向实现的 术语结合起来叙述问题的解法在最低的抽象层次用可以直接实现的方式叙述问题的解法细化与抽象是紧密相关的,在软件过程的每一步都是对软件解法的抽象层次的一次细化,3.总体设计(SD),3 信息隐蔽在设计和确定模块时,使一个模块包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。在面向对象方法中,对象的封装性很自然地支持了信息隐蔽地思想。在结构化方法中,要求模块内地信息要局部化4可重用性同一事物不做修改或稍加修改就能够多次重复使用重用(再生 复用)软件复用:数据复用、模块复用、结构复用、设计复用和规格说明书复用,3.总体设计(SD),启发式规则人们在开发计算机软件的长期实践中积累了丰富的经验,总结这些经验得出了一些启发式规则。这些启发式规则虽然不像上一节讲述的基本原理和概念那样普遍适用,但是在许多场合仍然能给软件工程师以有益的启示,往往能帮助他们找到改进软件设计提高软件质量的途径。下面介绍几条启发式规则 改进软件结构提高模块独立性 模块规模应该适中 深度、宽度、扇入、扇出都应适当 模块的作用域应该在控制域之内 力争降低模块接口的复杂程度 设计单入口单出口的模块 模块的功能应该可以预测,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、C,3.总体设计(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,转数计数器,流量传感器,微处理机,里程表,车速表,油效表,油管系统,加速/减速指示,超速报警,设计步骤:,1复查基本系统模型,4 确定输入流 和输出流 的 边界,划分 变换或 事务 中心,5完成“第一级分解”,设计步骤:,复查基本系统模型,复查并精化数据流图,确定数据流图具有变换特性还是事务特性,确定输入流和输出流的边界,划分变换或事务中心,完成“第一级分解”,Cm,Ca,Ct,Ce,第一级分解的方法,A,D,B,C,Cm,Ca,C,B,D,A,接受传感器 信 号,转换成rpm,收集SPS,读旋转信号,计算gph,读燃料流,数字仪表板 控 制,确 定加/减速,计算mph,计算gpg,计算里程,驱动仪表板,加速/减速显示,显示mpg,显示mph,显示里程,发出铃声,发光二极管显示,6进行“第二级”分解,数字仪表板 控 制,接受传感器 信 号,转换成rpm,读旋转信号,计算gph,读燃料流,数字仪表板 控 制,确 定加/减速,计算mph,计算gpg,计算里程,驱动仪表板,加速/减速显示,显示mpg,显示mph,显示里程,发出铃声,发光二极管显示,数字仪表板软件系统经过调整后的结构图,注意:红色模块的位置有所调整,7对软件结构进一步精化,事务分析,4,3,2,总 控,接收通路,C通路,B通路,A通路,调 度,A_CTL,1,4,2+1,3,2,1,B_CTL,C_CTL,设计优化先使系统工作起来,然后使它快起来。,数据流图,软件结构,3.3 详细设计(SD),目标:确定应该怎样具体地实现所要求的系统。作用:在总体设计阶段采用自顶向下逐步求精的方法,可以把一个复杂问题的解法分解和细化成一个由多个模块组成的层次结构的软件系统。而在详细设计或编码阶段可采用自顶向下逐步求精的方法,可以把一个模块的功能逐步分解、细化为一系列的具体处理描述,从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序,3.3 详细设计(SD),结构程序设计 E.W.Dijstra与Goto语句,1966,Bohm 和 Jacobini 证明了只要顺序、选择、循环这三种基本结构就能实现任何单入口单出口的程序。,结构程序设计:一种程序设计技术,它采用自顶向下逐步求精的设计方法和单入口单出口的控制结构。并且尽可能少用GO TO语句的程序设计方法。,使用结构化程序设计技术的好处:1可以显著提高软件开发工程的成功率和生产率2层次结构清晰,容易阅读和理解3容易保证程序的正确性和纠正错误(单入口、单出口)4源程序代码精晰流畅,易读易懂易测试5可重用代码量大(在修改或重新设计时)6程序的逻辑结构清晰,有利于程序正确性证明7不足之处:存储容量和运行时间有所增加(增10%20%),1、程序流程图(程序框图),开始或停止,准备,选择,多分支选择,注释,预先定义的处理,子程序,循环下界,循环上界,处理,控制流,3.3 详细设计(SD),3.3 详细设计(SD),1、程序流程图(程序框图),循环的标准符号 注解的使用,2 盒图(N_S图),S1,S2,S3,条件,F,T,Else部分,Then部分,Case 条件,值1,值2,。,值n,Case 1部分,Case 2部分,Case n部分,循环条件,Do-While 部分,循环条件,Do-Until 部分,A,特点:1)功能域(既一个特定控制结构的作用域)明确 2)不可能任意转移控制 3)很容易确定局部和全程数据的作用域 4)很容易表现嵌套关系,也可以表示模块的层次结构,3 PAD 图,P1,P2,P1,P2,条件C,Pn,P2,P1,WHILE C,P,UNTIL C,P,def,顺序,选择,Case 型多分支选择,当型循环,直到型循环,语句标号,定义,3 PAD 图,P1,P2,P3,P4,C,P5,P2,def,P6,P3,P8,C,Until C3,UNTIL C2,P9,P10,PAD图的主要优点:使用PAD符号设计的程序必然是结构化的程序.PAD图所描绘的程序结构十分清晰.用PAD图表现程序逻辑,易读,易记,易懂.容易将PAD图 转换成高级语言源程序.可用软件工具实现自动转换.即可以表示程序逻辑,也可以描绘数据结构.支持自顶向下,逐步求精方法的使用.,例:N-S图与PAD的转换,4、判定表,程序流程图、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)*2,T,T,T,F,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,5、判定树,行李费算 法,行李重量 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,免费,例:某校制定了教师的讲课课时津贴标准。对于各种性质的讲座,无论教师是什么职称,每课时津贴费一律是50元;而对于一般的授课,则根据教师的职称来决定每课时津贴费:教授30元,副教授25元,讲师20元,助教15元。,教师课时津贴判定树,课时津贴,一般授课,讲座,教授,副教授,讲师,助教,30,25,20,15,50,6过程设计语言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顺序结构 顺序结构的数据由一个或多个数据元素组成,每个元素按确定次序出现一次,例图:A由B、C、D三个元素顺序组成,2选择结构 选择结构的数据包含两个或多个数据元素,每次使用该数据时按一定条件从这些数据元素中选择一个。3重复结构 重复结构的数据,根据使用时的条件,由一个数据元素出现零次或多次构成,A,B0,C0,D0,根据条件,A是B或C或D中的某一个。,A,B*,A由B出现N次(N0)组成(注意:B的右上角有*),二改进的Jackon图 上面的后两个图中,选择条件和循环结束条件无法标出,影响了图的表达能力,不易译成程序。建议使用改进的Jackon图。,(a)顺序结构(b)选择结构s(i)为(c)可选结构为(b)的(d)重复结构i是循环结BCD 中任一都 条件,i是分支条件 特殊情形 束条件的编号不能是选择和重复的数据元素,A,B,C,D,A,Bo,Co,Do,A,Bo,A,B*,_o,S(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用伪码表示程序。(有下划 的为关键字),用伪码表示程序处理过程,设计步骤,应用举例:一个正文文件由若干个记录组成,每个记录是一个字符串。要求统计每个记录中空格字符的个数以及文件中空格字符的总个数。要求的输出数据格式是,每复制一行输入字符串之后,另起一行印出这个字符串中的空格数,最后印出文件中空格总个数。,统计表格,程序体,印总数,处理字符串*,印字符串,分析字符串,I(1),印空格数,分析字串*,I(2),处理空格*,处理非空格*,S(3),2,9,11,3,1,6,4,7,13,13,停止,关闭文件,印出空格总数,打开文件,读入字符串,Totalsum:=0,文件结束,印出字符串,字符串结束,字符是空格,Sum:=sum+1,Pointer:=pointer+1,10,12,8,9,Sum:=0,Pointer:=1,Totalsum:=totalsum+sum,读入字符串,统计空格seq 打开文件 读入字符串 totalsum=0 程序体iter until文件结束 处理字符串 seq 印字符串seq 印出字符串 印出字符串end sum t=0 pointer t=1,例:高考后将考生的基本情况文件(简称考生基本情况文件)和考生高考成绩文件(简称考分文件)合并成一个新文件(简称考生新文件)。考生基本情况文件和考分文件都是由考生记录组成的。为简便起见,考生基本情况文件中的考生记录的内容包括:准考证号、姓名、通讯地址。考分文件中的考生记录的内容包括:准考证号和各门考分。合并后的考生新文件自然也是由考生记录组成,内容包括:准考证号、姓名、通讯地址和各门考分。Jackson程序设计方法由五个步骤组成:,第一步 数据结构表示,对要求解的问题进行分析,确定输入数据和输出数据的逻辑结构,并用Jackson图描述这些数据结构。,第二步 找出输入数据结构和输出数据结构的对应关系,找出输入数据结构和输出数据结构中有对应关系的数据单元,即有直接因果关系、在程序中可以同时处理的数据单元。需要注意的是,对于重复的数据单元,必须是重复的次序、次数都相同才有可能有对应关系。,第三步 确定程序结构图,根据下述三规则,由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 end,A iter until(或while)conditionBA end,用Jackson伪码描述的程序:,产生新文件 seq打开两个输入文件从输入文件中各读一条记录分析考生记录iter until文件结束处理考生记录 seq产生准考证号产生姓名产生通讯地址产生考分生成一条新记录将新记录写入输出文件从输入文件中各读一条记录处理考生记录 end关闭全部文件停止产生新文件 end,3.4 面向对象的设计,3.4.1 面向对象的设计概述 面向对象的设计(简称OOD)与结构化设计有很大的不同,面向对象的设计是在面向对象的分析(简称OOA)的基础上,对OOA模型逐渐扩充的过程。OOD和OOA采用相同的符号表示,OOD和OOA没有明显的分界线,它们往往反复迭代地进行。在OOD时,主要解决系统如何做,因此需要在OOA的模型中为系统的实现补充一些新的类,或在原有类中补充一些属性和操作。OOD时应能从类中导出对象,以及这些对象如何互相关联,还要描述对象间的关系、行为以及对象间的通信如何实现。,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.系统设计概况 系统设计是把分析模型转变成系统设计模型。分析模型由功能模型、对象模型和动态模型组成。在UML中,功能模型用用例图表示,对象模型用类图表示,动态模型用状态图和顺序图表示。系统设计时将这些模型作为输入,将这些输入转变成包含系统内部结构信息的系统设计模型,或者更一般地说,转变成系统的硬件配置是如何实现的模型。系统设计的结果是得到一个模型,包括各个策略的清晰描述、子系统分解的UML包图以及表示系统硬件软件映射的UML配置图。,1.系统设计概况,对于一个复杂的系统为了减少复杂性,开发人员把系统分解成若干较小的部分,这些较小部分通常称为子系统,这些子系统可以独立实现。系统设计是一个围绕定义子系统的多次反复的活动。如何将一个复杂的系统分解,这需要面对整个系统范围的问题进行考虑。特别需要解决以下问题:软硬件映射。数据管理。访问控制。控制流。边界条件。,2 UML包图和UML配置图,UML包图 对于一个复杂的系统,通常都是把它分解成若干较小的系统(或称子系统),如果需要的话,每个较小的系统还可分解成更小的系统,这是一种解决问题复杂性的有效方法 在UML中使用了包的机制,一个包相当于一个子系统。包是一种分组机制,包用于定义一个名字空间或容器(Container),它本身是UML的一种模型元素。它把一些模型元素组织成语义上相关的组,包中拥有的或涉及的所有模型元素叫做包的内容。,(1)UML包图,作为模型组织的分组机制,包的实例是没有意义的因此包仅在建模时有用,而不需要转换成可执行的系统。包的图标是一个大矩形(内容框)的左上角带一个小矩形(名字框)。包的名字可以用一个简单名(文字串)表示,或用路径名表示。在包名之上可附加诸如System、Subsystem等符号,表示该包是系统模型和子系统。在包名之后或之下,可以用括在花括号中的文字说明包的性质。包可以嵌套,包的嵌套可以清晰地表现系统模型元素间的相互关系,但包的嵌套不宜过深,包的嵌套层数一般以23层为宜。包之间可以有关系,主要有两种:依赖和泛化。包的依赖是用一条虚箭线表示,虚箭线从依赖包(源)指向目标包。包的依赖没有传递性。包的泛化用一条带空心三角箭头的实线表示,箭尾连接特殊包,箭头指向一般包,意指特殊包必须遵循一般包的接口。,(1)UML包图,包图由包和包之间的联系构成。包图的图形节点是包,节点之间用弧(依赖或泛化)连接。,包图图例,(2)UML配置图,UML配置图用来描述运行时组件和硬件节点间的关系。组件是为其他组件或执行者提供服务的独立实体。UML配置图的基本元素有结点、连接、组件、对象、依赖等。结点是某种计算资源的物理对象,包括计算机、设备(如打印机、读卡机、通信设备)等。结点既可看作类型,也可看作实例。结点用三维立方体表示,中间写上结点名,当结点表示实例时,名字应加下划线。结点上还可附加诸如printer、Router等符号,表示特定的设备类型。,(2)UML配置图,结点通过通信关联相互连接,连接用一条直线表示,它指出结点之间存在着某种通信路径,并指出通过哪条通信路径可使这些结点间交换对象或发送消息。在连接上可附加诸如TCPIP、DecNet等符号,以指明通信协议或所使用的网络。可执行组件实例可以包含在结点实例符号中,表示它们在该结点实例上驻留并执行。组件是用一个大矩形上带两个小矩形表示。组件间的依赖关系可以用一条虚箭线表示,虚箭线从依赖组件(源)指向被依赖组件。两个构件实例之间的依赖关系表示一个组件使用了另一个组件的服务。一个对象可以画在一个构件实例中,也可以画在结点实例中,表示它驻留在该结点上,还可以用嵌套的方式把对象画在另一个对象中。,3 系统分解,系统设计的首要任务通常要把系统划分成小的子系统。每个子系统共享某些公共特性,并完成系统某个方面的功能,在相同的物理位置或同样的硬件上运行。一个子系统不是一个对象,也不是一个功能。它是类、关联、操作、事件和约束的一个相关集合。通常一个子系统由它提供的服务来识别,所谓一个服务就是一组具有共同目标的相关功能。将系统按照某种要求进行划分是系统设计中决定整个系统结构的关键一步。在这一步中就是根据系统分析的三种模型,将系统分析中得到的类组成子系统,用UML表示就是将系统分析中得到的类放入不同的包中,每一个包就是一个子系统。如何组织子系统或包,一般按照下列原则组织:,3 系统分解,将提供通用服务(或者一组相关服务集)的类组织成一个子系统或包,这些类之间具有高耦合度和密切的协作关系。系统分解为子系统后可以组织成一系列的水平分层和垂直分块。(1)分层 这种组织方式把软件系统组织成一个层次系统,每层是一个子系统。上层在下层的基础上建立,下层为实现上层功能而提供必要的服务。每一层内所包含的对象,彼此间相互独立,而处于不同层次上的对象,彼此间往往有关联。消息的流动是单向的,一个子系统只知道它下层的存在。层次结构又可进一步划分成两种模式:封闭式和开放式。,3 系统分解,(2)分块 这种组织方案把软件系统垂直地分解成若干个相对独立的、弱耦合的子系统,一个子系统相当于一块,每块提供一种类型的服务。利用分层和分块的各种组合,可以将多个子系统组织成一个完整的软件系统。当混合使用层次结构和块状结构时,同一层次可以由若干块组成,而同一块也可以分为若干层。,3.4.3 对象设计,对象设计是对分析和系统设计成果的进一步细化,在需求分析中,我们获得了系统的对象模型、动态模型和功能模型。对象模型系统中的对象和类,包括它们的属性和操作。对象模型中的信息必须以某种形式在设计中呈现出来,通常最简单和最好的方法就是把分析得到的类直接带到设计中。而对象设计仅仅是一个添加细节并做出实现决策的过程。功能模型描述系统中必须实现的操作。在对象设计过程中,我们必须确定如何实现每一个操作,选择操作的算法,并把复杂的操作分解成简单的操作。这种分解是一个必须在相关低级抽象层次上反复迭代的过程。动态模型描述了系统如何响应外部事件,程序的控制结构是从动态模型中导出来的。,3.4.3 对象设计,具体步骤大致如下:组合三种模型(对象模型、动态模型、功能模型)以获得类中的操作。实现操作的设计算法。优化数据的访问。实现外部交互式地控制。调整类结构以提高继承性。设计关联。确定对象属性的精确表示。把类和关联封装成模块。上述8个步骤用UML表达时,就是对用例图、状态图、顺序图、类图及对象图等的反复细化。从各个侧面来不断求精系统,直至得到一个能够实现的、精确的系统描述。,3.4.4 设计模式,有经验的面向对象的开发人员(和其他一些软件开发人员)建立了一套一般原则和常用解决方案的“指令集”,用来指导软件设计。这些原则和惯用法如果用格式编纂成文,文中描述了所要解决的问题和对应的解决方案,并且被赋予名字,那么这些原则和惯用就被称为模式(pattern)。一个设计模式通常可用四个信息来描述:1)模式名。2)所解决的问题。3)解决方案。4)应用设计模式的效果。,面向对象设计中23种常用的设计模式,1)Abstract Factory