1、第十一章 面向对象分析与设计,11.1 面向对象分析(OOA)11.2 面向对象设计(OOD)11.3 面向对象实现11.4 面向对象分析与设计实例,11.1 面向对象分析(OOA)(以OMT方法为例)OOA的基本任务: 分析的目的是确定一个系统“干什么”的模型,该模型通过使用对象、关联、动态控制流和功能变换等来描述。分析过程是一个不断获取需求及不断与用户磋商的过程。,面向对象分析方法与传统分析方法的比较例:银行应用,银行应用的功能/数据方法,获取业务,银行业务,开户,提取,利息,银行存款,联帐,利息,存储,银行存款,联帐,银行存款,联帐,利息,银行应用的面向对象方法,其它对象,帐户 开户 提
2、取 存储,银行存款帐,联帐,利息帐,增加现金兑换业务对功能/数据方法的修改,获取业务,银行业务,开户,提取,利息,银行存款,联帐,利息,存储,银行存款,联帐,银行存款,联帐,利息,现金兑换,现金兑换,现金兑换,增加现金兑换帐目类型对OO方法的修改,其它对象,帐户 开户 提取 存储,银行存款帐,联帐,利息帐,现金兑换帐,OOA的结构(五个层次),类的边界,Class &object layer (类及对象层),Attribute layer (属性层),Service layer (服务层),Structure layer (结构层),Subject layer (主题层),实例的边界,实例连接
3、,消息连接,主题,服务,属性,三个OOA模型对象模型: 描述静态结构, 定义做事情的实体;功能模型: 描述处理(数据变换), 指明系统应“做什么”;动态模型: 描述交互过程, 规定什么时候做。 对象模型由系统中的对象及其关系组成,动态模型描述系统中对象对事件的响应及对象间的相互作用,功能模型则确定对象值上的各种变换及变换上的约束。,构造对象模型 构造对象模型的步骤如下: (1)识别对象与类 (2)定义属性与服务 (3)识别对象之间的关系 (4)定义服务和消息连接 (5) 标识主题(主体),将类分组成模块 最后得到: 对象模型=对象模型图+数据词典。 ,构造动态模型 构造动态模型的步骤如下: (
4、1) 准备典型交互序列的脚本。 (2) 确定对象间的事件并为各脚本安排事件跟踪。 (3) 准备系统的事件流图。 (4) 开发具有重要动态行为的各个类的状态图。 (5) 检查状态图中共享事件的一致性和完整性。 最后得到: 动态模型=状态图+全局事件流图。 ,构造功能模型 构造功能模型的步骤如下: (1) 确定输入、 输出值。 (2) 需要时使用数据流图来表示功能依赖关系。 (3) 描述各功能“干什么”。 (4) 确定约束。 (5) 详细说明优化标准。 最后得到: 功能模型=数据流图+约束。,构造对象模型的实例,步骤:识别对象与类定义属性与服务识别对象之间的关系定义服务和消息连接标识主题(主体),
5、将类分组成模块,步骤:识别类与对象 主要策略: 考虑问题域人员组织物品设备事件表格结构 考虑系统边界人员设备外系统 考虑系统责任,问题域描述中的名词,往往是候选的对象;根据问题域结构可提取候选的类及对象;与系统发生作用的其它系统和必要的设备可作为候选的类及对象; 如: 打印机等 (分析阶段可不把与实现有关的计算机部件作为候选的类及对象)系统必须观测、记忆的与时间有关的事件可作为候选的类及对象; 如:建立帐户的日期 打开一个帐户等与系统发生交互的人及系统必须保留其信息的人,可作为候选的类及对象; 如:柜员、储户等这些人所属的组织单位,可作为候选的类及对象; 如:总行、分行等系统必须记忆、且不在问
6、题域约束中的顺序操作过程(为了指导人机交互)可作为候选的类及对象; 如:柜员事务、远程事务等。系统需了解掌握的物理位置、办公地点等可作为候选的类及对象; 如:ATM机器、帐户等,帐册,上级系统接口,供货员,销售事件,商品,特价商品,计量商品,收款机,商品一览表,例:超市销售管理系 统,步骤2: 定义属性与服务定义属性定义服务对象的状态与状态转换图例:栈的状态/服务对照表,帐册,前班节余销售事件表收入累计上交款本班节余,接班计帐报帐交班,上级系统接口,帐目目册,消息发送查帐报帐价格更新种类增删,供货员,缺货登记表,缺货登记供货,销售事件,收款人购物清单应收款,销售计划入帐,商品,编号名称单价架上
7、数量下限,售出补充价格更新,特价商品,开始日期结束日期,计量商品,*单价计量单位计价方式,*售出*补充*价格更新,收款机,本班收款员开始时间结束时间,登录 售货 结帐,商品一览表,商品目录,检索种类增删,例:超市销售管理系 统,步骤3:标识对象之间的关系初步确定关联 对应于描述性动词或动词短语 需求陈述中隐含 根据问题域知识得出 筛选 完善,步骤1:识别对象与类步骤2:定义属性与服务,分析标识对象之间的关系对象之间的分类关系:一般/特殊结构对象之间的组成关系:整体/部分结构对象之间的静态联系:实例连接对象之间的动态关系:消息连接,从一般类发现特殊类,公司职员,股东,姓名身分证号码,股份,职员,
8、工资,公司职员,姓名身分证号码股份工资,?,?,从特殊类发现一般类,公司职员,股东,姓名身分证号码,股份,职员,工资,股东,姓名身分证号码股份,职员,姓名身分证号码工资,?,收款机,ABC,现钞收款机,DEF,现钞收款机,ABCDEF,XYZ,Z,XY,为支持复用建立结构,收款机类成为可供本领域其它系统复用的领域构件,取消没有特殊属性的特殊类,大学生,研究生,研究方向指导教师,学生,姓名学号班级,研究生,研究方向指导教师,学生,姓名学号班级,两种结构的变通,冷藏车,汽车,制冷设备,冷藏车,汽车,制冷设备,仅用一般/特殊结构,两种结构同 用,冷藏车,汽车,制冷设备,仅用整体/部分结构,中央计算机
9、,总行,通信,银行代码,ATM,拥有,分行计算机,出纳工作站,远程业务,现金卡,分行,帐户,储户,出纳员,出纳业务,通信,授权,存取,拥有,拥有,持有,组成,拥有,拥有,雇佣,进入,被进入,修改,修改,进入,ATM系统的初始对象图,步骤4:定义服务及消息连接 分析和认识对象之间在行为上的依赖关系。,步骤1:识别对象与类步骤2:定义属性与服务步骤3:定义结构域连接,顺序系统中的消息传递,主动对象A,a,被动对象B,b,被动对象C,c,被动对象D,d1,d2,运行开始,运行结束,服务执行,消息发送,控制点返回示意,并发系统中 的消息传递,主动对象A,主动对象B,被动对象D,任务Task1 线程Ta
10、,控制线程之间的消息连接,控制点返回示意,被动对象C,被动对象E,控制线程内部的消息连接,任务Task2 线程Tb,OOA对消息的表示消息连接 消息连接是OOA(或OOD)模型中对对象之间行为依赖关系的表示 识别和表示的主要问题:对象之间是否存在消息?消息是同一线程内部的还是不同线程之间?每一种消息是从发送者哪个服务发出的?由接收者哪个服务响应处理的?消息是同步还是异步?发送者是否等待消息的处理结果?,帐册,前班节余销售事件表收入累计上交款本班节余,接班计帐报帐交班,上级系统接口,帐目目册,消息发送查帐报帐价格更新种类增删,供货员,缺货登记表,缺货登记供货,销售事件,收款人购物清单应收款,销售
11、计划入帐,商品,编号名称单价架上数量下限,售出补充价格更新,特价商品,开始日期结束日期,计量商品,*单价计量单位计价方式,*售出*补充*价格更新,1,m,商品一览表,商品目录,检索种类增删,1,m,收款机,本班收款员开始时间结束时间,登录 售货 结帐,步骤5:标识主题(主体) 主题是把一组具有较强联系的组织在一起而得到的类的集合。,步骤 1:识别对象与类步骤 2:定义属性与服务步骤 3:定义结构域连接步骤 4:定义服务及消息连接,主题概念及其用途主题层是在OOA基本模型(类图)之上建立一个能帮助人们从不同的认识层次来理解系统的补充模型;主题一种比类和对象抽象层次更高、粒度更大的概念,用以建立系
12、统的高层抽象视图;主题有助于指导系统设计者或用户等理解一个大的系统模型, 有助于组织一个大项目的工作。,主题概念的特点是由一组类构成的集合一个主题内部的对象类应具有某种意义上的内在联系描述系统中相对独立的组成部分(如一个子系统)描述系统中某一方面的事物(如人员、设备)解决系统中某一方面的问题(如输入输出)主题的划分有一定的灵活性和随意性,主题的表示法三种表示方式:压缩方式 半展开方式 全展开方式,编号 主题名,压缩方式,编号 主题名,半展开方式:,类名 类名 类名,主题名,主题名,下层主题,主题的表示法,全展开方式:,编号,编号,编号,编号,类图上原有的全部内容,如何划分主题把每个结构作为一个
13、主题; (选取结构中最上层的类作为一主题)通过实例连接互相联系的类可划分到一个主题;把不属于任何结构,也没有实例连接的类作为一个主题。,何时引入主题 依赖于模型自身复杂性小系统: 不需引入主题;中等系统:先标识类及对象, 然后引入主题;大系统: 先标识主题,对问题域进行 划分,分给不同的任务组。,主题层次的控制中小型系统可只设一层主题,最多不超过两层;大型系统可只设两层主题,最多不超过三层。,中央计算机,总行,通信,银行代码,ATM,拥有,分行计算机,出纳工作站,远程业务,现金卡,分行,帐户,储户,出纳员,出纳业务,通信,授权,存取,拥有,拥有,持有,组成,拥有,拥有,雇佣,进入,被进入,修改
14、,修改,进入,ATM系统的初始对象图,3,3,3,3,3,2,1,1,1,1,2,2,2,帐册,前班节余销售事件表收入累计上交款本班节余,接班计帐报帐交班,上级系统接口,帐目目册,消息发送查帐报帐价格更新种类增删,供货员,缺货登记表,缺货登记供货,销售事件,收款人购物清单应收款,销售计划入帐,商品,编号名称单价架上数量下限,售出补充价格更新,特价商品,开始日期结束日期,计量商品,*单价计量单位计价方式,*售出*补充*价格更新,1,m,商品一览表,商品目录,检索种类增删,1,m,收款机,本班收款员开始时间结束时间,登录 售货 结帐,1,1,1,1,3,3,3,3,2,2,2,2,11.2 面向对
15、象设计(OOD),一. 从OOA到OOD 逐渐扩充模型的过程。,OOD分为两个阶段: 高层设计(系统设计) 低层设计:类的详细设计 1 系统设计 在系统设计阶段建立系统的高层结构,有各种标准结构可以用作设计的起点。面向对象的开发方法覆盖了完整的软件开发阶段。,2 对象设计 对象设计时,对分析模型进行详细分析和阐述并且奠定实现的基础,从分析模型的面向客观边界的观点转到面向实现的计算机观点上来。最后得到: 对象设计文档 = 细化的对象模型 + 细化的动态模型 + 细化的功能模型。 ,OOD导出的系统结构,数据管理,其它系统,文件RDBMSOODBMS,设备,系统交互界面,问题论域,人机交互界面,
16、. . . ., . . . .,窗口,报告,OOD模型,主体层,类及对象层,结构层,属性层,服务层,问题域 部分(PDC),人机交互部分(HIC),任务管理部分(TMC),数据管理部分(DMC),OOD阶段建立,OOA 阶段模型,OOD由四个活动组成:,二.问题域部分的设计,OOA的模型直接放到OOD的问题域,OOD阶段对OOA结果进行改动和增补。根据需求变化,对OOA产生模型的类与对象、结构、属性、操作进行组合与分解,增加必要的类、属性和关系。,对OOA结果加以增补要考虑的因素:,重用设计把问题域专用类组合在一起通过增添一般类而建立协议调整继承的支持级别改进性能增加低层的类和对象,调整继承
17、的支持级别 如OOA的一般/特殊结构包括多继承, 在使用只有单继承或无继承性的编程语言时,需对OOA的的结果进行修改。,层次的一般/特殊结构,汽车,客货两用车,载客人数吨数,货车,吨数,载客人数,客车,特殊类中存在相当的冗余信息,网络的一般/特殊结构,汽车,客货两用车,货车,客车,借助网络结构可:减少冗余信息;显示地表示更多的属性和服务的共性.,吨数,载客人数,汽车,客货两用车,货车,客车,针对单继承的调整:分解多继承, 采用整体/部分结构映射,汽车,1,m,货运,客运,汽车用途,汽车,客货两用车,货车,客车,1,m,货运,客运,汽车用途,汽车,1,针对单继承的调整:分解多继承, 采用实例连接
18、映射,货车,客车,汽车,针对单继承的调整:分解多继承, 展平为单继承,客货两用车,汽车,客货两用车,货车,客车,三. 人机交互部分的设计,虽然好的人机交互部分不可能挽救一个功能很差的软件, 但性能很差的人机交互部分将使一个功能很强的产品变得不可接受!,四. 任务管理部分的设计,1.为什么要有任务管理部分 系统中有许多并发行为时,需要按照各个行为的协调和通信关系,划分各种任务(进程),简化并发行为的设计和编码。根据动态模型分析、定义并发性;选择软件实现的控制方法。,2.怎样设计任务管理部分任务管理主要包括任务的选择和调整识别事件驱动任务识别时钟驱动任务识别优先任务和关键任务识别协调者审查每个任务
19、定义每个任务,五. 数据管理部分的设计,数据管理部分提供了数据在数据管理系统中存储和检索对象的基本结构,它分离了数据管理方案的影响 (不管该方案是普通文件、关系型数据库、面向对象数据库或其它方式.),(1)数据存放方法设计采用普通文件数据管理采用关系数据库管理采用面向对象数据库管理(2)相应服务的设计为每个需存储其对象的类增加一个属性和服务,11.3 面向对象实现,一. OO程序设计语言和工具将OOD结果 面向对象程序传统OO语言和工具:Smalltalk C+ Java高级OO语言和工具:Visual Basic (OO-4GL,RAD) Delphi C+ Builder Jbuilder
20、 Kylix PowerBuilder,二. 面向对象测试,四个层次 测试内容 相当与传统 测试的阶段,算法层,类层,类中每个方法,单元测试,类中方法和属性的相互作用,主题层,一组协同工作的类的相互作用,系统层,完整系统,组装测试,子系统测试,单元测试,类的测试技术:可使用传统技术面向对象测试的特殊问题(1)测试类的实现 应从各种可能的启动操作的次序组合中选出最可能发现属性的操作错误的若干中情况进行测试。,(2)对子类展开测试 例:父类中定义:属性 s 方法 f1,f2,f3 子类中定义:属性 r 方法 f1,f4,f5 测试子类的内容: 属性 s, r 方法 f1,f2,f3 f4,f5,1
21、1.4 面向对象分析与设计实例(银行网络系统,OMT方法),11.4.1 问题陈述,设计支持银行网络的软件。 银行网络包括人工出纳和分行共享的自动出纳机。每个分理处用自己的计算机来保存各自的帐户,处理各自的事务;各分理处的出纳站与分理处计算机通信,出纳站录入帐户和事务数据;自动出纳机与分行计算机通信,分行计算机与拨款分理处结帐,自动出纳机与用户接口接受现金卡,与分行系统通信完成事务,发放现金,打印收据。 系统需要记录保管和安全措施;系统必须正确处理同一帐户的并发访问。每个分理处为自己的计算机准备软件,银行网络费用根据顾客和现金卡的数目分摊给各分理处。,银行网络系统示意图,11.4. 2 建立对
22、象模型 首先标识类和关联,因为它们影响到整体结构和解决问题的方法; 其次是增加属性,进一步描述类和关联的基本框架, 使用继承合并和组织类; 最后将操作增加到类中去作为构造动态模型和功能模型的参考。 1. 确定类 构造对象模型的第一步是标识来自问题域的相关对象类, 对象包括物理实体和概念。所有类在应用中都必须有意义,在问题陈述中,并非所有类都是明显给出的, 有些是隐含在问题域或一般知识中的。,检查问题陈述中的所有名词, 产生如下的暂时对象类: 软件 银行网络 出纳员 自动出纳机 分行 分理处 分理处计算机 帐户 事务 出纳站 事务数据 分行计算机 现金卡 用户 现金 收据 系统 顾客 费用 帐户
23、数据 访问 安全措施 记录保管 根据下列标准,去掉不必要的类和不正确的类: (1) 冗余类:若两个类表述了同一个信息, 保留最富有描述能力的类, 如“用户”和“顾客”就是重复的描述。 ,(2) 不相干的类:除掉与问题没有多少关系或根本无关的类。 例如,摊派“费用”超出了银行网络系统的范围。 (3) 模糊类:类必须是确定的,有些临时类边界定义不对, 或范围太广。在银行网络系统中, 模糊类有“系统”、 “安全措施”、“记录保管”及“银行网络”等,应删除。 (4) 属性:如果某一性质的独立性很重要, 就应该把它归属到类,而不是属性。有些候选类是属性,如“帐户数据”、“收据”、 “现金”及“事务数据”
24、 属于属性,也应删除。 (5) 操作:如果所描述的操作并不适用于对象并且被其自身所操纵,那么这一定不是类, 具有自身性质的操作应该描述成类。, 2. 准备数据字典 为所有建模实体准备一个数据字典,准备描述各对象类的精确含义, 描述当前问题中的类的范围,包括对类的成员、 用法方面的假设或限制。 3. 确定关联 一种依赖表示一种关联。关联常用描述性动词或动词词组来表示,其中有物理位置的表示、传导的动作、通信、所有者关系及条件的满足等。从问题陈述中抽取所有可能的关联表述,但不要过早去细化这些表述。 ,1) 银行网络系统问题陈述中的关联(1) 银行网络包括出纳站和自动出纳机。(2) 分行共享自动出纳机
25、。(3) 分理处提供分理处计算机。(4) 分理处计算机保存帐户。(5) 分理处计算机处理帐户支付事务。(6) 分理处拥有出纳站。(7) 出纳站与分行计算机通信。(8) 出纳员为帐户录入事务。(9) 自动出纳机接受现金卡。(10) 自动出纳机与用户接口。 ,(11) 自动出纳机发放现金。 (12) 自动出纳机打印收据。 (13) 系统处理并发访问。 (14) 分理处提供软件。 (15) 费用分摊给分理处。 2) 隐含的动词词组 (1) 分行由分理处组成。 (2) 分理处拥有帐户。,(3) 分行拥有分行计算机。 (4) 系统提供记录保管。 (5) 系统提供安全。 (6) 顾客有现金卡。 3) 基于
26、问题域的知识 (1) 分理处雇用出纳员。 (2) 现金卡访问帐户。 4) 去掉不必要和不正确的关联 使用下列标准去掉不必要和不正确的关联:,(1) 若某个类已被删除,那么与它有关的关联也必须删除或者用其他类来重新表述。在示例中,删除了“银行网络”, 相关的关联也要删除。 (2) 不相干的关联或实现阶段的关联。删除所有问题域之外的关联或涉及实现结构中的关联,如“系统处理并发访问”就是一种实现的概念。 (3) 动作。关联应描述应用域的结构性质而不是瞬时事件, 因此应删除 “自动出纳机与用户接口”等。 (4) 派生关联,省略那些可以用其他关联来定义的关联。 因为这种关联是冗余的。,银行网络系统的初始
27、对象图,4. 确定属性 属性是个体对象的性质,属性通常用修饰性的名词词组来表示。 只考虑与具体应用直接相关的属性,不要考虑那些超出问题范围的属性; 找出重要属性,避免那些只用于实现的属性, 要为各个属性取有意义的名字。 按下列标准删除不必要的和不正确的属性: (1) 对象:若实体的独立存在性比它的值重要,那么这个实体不是属性而是对象。如在邮政目录中,“城市”是一个属性, 然而在人口普查中, “城市“则被看作是对象。,(2) 限定词: 若属性值固定下来后, 能减少关联的重数, 则可考虑把该属性重新表述为一个限定词。 (3) 内部值: 若属性描述了对象的非公开的内部状态,则应从对象模型中删除该属性
28、。 (4) 细化: 在分析阶段应忽略那些不可能对大多数操作有影响的属性。 ,银行网络系统中的部分属性,5. 使用继承来细化类 使用继承来共享公共结构, 以此来重新组织类。可以用下面两种方式来进行: (1) 自底向上通过把现有类的共同性质一般化成父类, 寻找具有相似的属性、关联或操作的类来发现继承。例如“远程事务”和“出纳事务”是类似的,可以一般化为“事务”。 (2) 自顶向下将现有类细化为更具体的子类。例如“事务”从“出纳站”和“自动出纳机”进入,“录入站”就是“出纳站”和“自动出纳机”的一般化。,带有属性和继承的对象模型,6. 完善对象模型 对象建模不可能一次就能保证模型是完全正确的,软件开
29、发的全过程就是一个不断完善的过程。模型的不同组成部分多半是在不同阶段完成的。若发现模型的缺陷,就必须返回到前面阶段去修改,有些细化工作是在动态模型和功能模型完成之后才开始进行的。 1) 几种可能丢失对象的情况及解决办法 (1) 同一类中存在毫无关系的属性和操作, 则分解这个类, 使各部分相互关联。,(2) 一般化体系不清楚, 则可能分离扮演两种角色的类。 (3) 存在无目标类的操作, 则找出并加上失去的目标类。 (4) 存在名称及目的相同的冗余关联, 则通过一般化创建丢失的父类,把关联组织在一起。 2) 查找多余的类 若类中缺少属性、 操作和关联, 则可删除这个类。 3) 查找丢失的关联 丢失
30、了操作的访问路径, 则加入新的关联以回答查询。 4) 修改,针对银行网络系统的具体情况作如下的修改: (1) 现金卡有多个独立的特性。 把它分解为两个类: 卡片权限和现金卡。 卡片权限是银行用来鉴别用户访问权限的卡片, 表示一个或多个用户帐户的访问权限; 各个卡片权限对象中可能具有好几个现金卡, 每张都带有安全码、卡片码,它们附在现金卡上,表示银行的卡片权限。 现金卡是自动出纳机得到标识码的数据卡片, 它也是银行代码和现金卡代码的数据载体。 ,(2) “事务”不能体现对帐户之间传输描述的一般性, 因它只涉及一个帐户。一般来说,在每个帐户中,一个“事务”包括一个或多个“更新”,一个“更新”是对帐
31、户的一个动作,它们是取款、存款、查询之一。因此,增加“更新”类,事务由若干更新组成, 更多涉及到帐户。 (3) “分理处”和“分理处计算机”之间、“分行”和“分行计算机”之间的区分似乎并不影响分析,计算机的通信处理实际上是实现的概念,将“分理处计算机”并入到“分理处”,将“分行计算机”并入到“分行”。 ,修改后的银行网络系统的对象模型,7. 将类组合成模块 模块是类的集合,该集合反映了整个模型的一些逻辑分集。 在银行网络系统的示例中,由于模型较小,不需要分解成模块,但它可作为进一步的详细模型的核心。,11.4.3 建立动态模型 动态分析从寻找外部可见的模拟和响应事件开始,确定各对象的可能事件的
32、顺序。在分析阶段不考虑算法的执行,它是实现模型的一部分。 建立动态模型的步骤: 第一步是准备典型的对话脚本; 第二步从脚本中抽取事件,把它与其目标对象联系起来; 第三步组织事件的顺序和状态,用状态图来表现; 第四步是比较各个不同对象的状态图,确保事件之间的匹配。 ,1. 准备脚本 脚本是事件序列,每当系统中的对象与外部用户发生互换信息时,就产生一个事件,所互换的信息值就是该事件的参数。对于各事件,应确定触发事件的动作对象和该事件的参数。 脚本中应表现重要的交互行为,通过脚本来逼近动态模型。 银行网络系统的问题陈述表明了需从用户处获得事务的数据,但确切需要什么参数,动作顺序是如何等还是模糊的。
33、首先为“正常”情况准备脚本,然后考虑“特殊”情况, 最后考虑用户出错情况。还必须考虑各种建立在基本交互行为之上的交互, 如帮助要求及状态查询等。 ,在银行网络系统的交互行为中,有正常的脚本和例外的脚本。 1) 正常的脚本 (1) 自动出纳机请求用户插入卡片; 用户插入现金卡。 (2) 自动出纳机接受卡片并读出它的卡号。 (3) 自动出纳机要求密码, 用户键入密码“4011”。 (4) 自动出纳机与分行确认卡号和密码;分理处检查它并通知承兑的自动出纳机。 (5) 自动出纳机要求用户选择事务类型(取款、 存款、 转户及查询), 用户选择取款。 (6) 自动出纳机要求现金数量; 用户输入100。,(
34、7) 自动出纳机要求分行处理事务; 分行把要求传给分理处,确认事务成功。(8) 自动出纳机分发现金并且要求用户取现金; 用户取现金。 (9) 自动出纳机提示用户是否想继续;用户指出不继续。(10) 自动出纳机打印收据, 退出卡, 并请求用户取出它们;用户拿走收据和卡。(11) 自动出纳机请求用户插入卡片。 ,2) 例外的脚本 (1) 自动出纳机请求用户插入卡; 用户插入现金卡。 (2) 自动出纳机接受卡并读它的卡号。 (3) 自动出纳机要求密码; 用户键入“9999”。 (4) 自动出纳机与分行确认卡号和密码, 在咨询分理处后拒绝它。 (5) 自动出纳机指示密码错并请求再键入; 用户键入“40
35、11”, 分行确认成功。 (6) 自动出纳机请求用户选择事务类型; 用户选择取款。,(7) 自动出纳机请求键入现金数量; 用户改变选择并键入“CANCEL”(取消)。 (8) 自动出纳机退出卡并且请求用户拿走卡; 用户取出卡。 (9) 自动出纳机请求用户插入卡。 2. 确定事件 检查两种脚本的各个步骤以确定所有外部事件,事件包括所有来自或发往用户的信息、外部设备的信号、输入、策略、 中断、转换和动作,使用脚本可以发现正常事件,但不要遗漏条件和异常事件。将各种类型的事件放入发送它和接受它的对象中。,3. 准备事件跟踪表 把脚本表示成一个事件跟踪表,即不同对象间的事件排序表。 对象为表中的列,若同
36、一类中的多个对象存在于这个脚本中, 则给每一个对象分配一个独立的列。给出类之间的所有事件。,银行网络系统脚本的事件跟踪表,4. 构造状态图 对各对象类建立状态图,反映对象接收和发送的事件, 每个脚本或事件跟踪表都对应于状态图中一条路径。 选择一条路径,该路径描述了一种典型的交互并且只考虑那些影响单个对象的事件,把这些事件放入一条路径, 路径的弧用跟踪表上某列上的输入输出事件来标识,两个事件之间的间隔就是一个状态,给每个状态起名字,名字是有意义的, 这张初始图就是事件和状态的一个序列。 ,“自动出纳机”类的状态图,“分行”类的状态图,“分理处”类的状态图,11.4.4 建立功能模型 功能模型用来
37、说明值是如何计算的,表明值之间的依赖关系及其相关的功能,数据流图有助于表示功能依赖关系, 其中的处理对应于状态图的活动和动作,其中的数据流对应于对象图中的对象或属性。 1. 确定输入值、 输出值 先列出输入、输出值,输入输出值是系统与外部世界之间的事件的参数。检测问题陈述,从中找到遗漏的所有输入输出值。由于所有系统与外部世界之间的交互都经过自动出纳机, 因而所有输入输出值都是自动出纳机事件的参数。,自动出纳机输入输出值,2. 建立数据流图 数据流图说明输出值是怎样从输入值得来的,数据流图通常按层次组织。最顶层由单个处理组成,也可由收集输入、计算值及生成结果的一个综合处理构成。 将顶层图中的处理
38、扩展成更低层次的数据流图,如果第二层次图中的处理仍包含一些可细化的处理,它们还可继续扩展。,自动出纳机顶层数据流图,自动出纳机“执行事务”处理的数据流图,3. 描述处理 当数据流图已细化到一定程度后,对各处理进行描述,描述的方式用自然语言、 伪码及判定树等,描述可以是说明的或过程的。 ,11.4.5 银行网络系统设计 银行网络系统是交互式接口和事务管理系统的混合物。录入站是交互式接口,它们的目的是通过与人的交互来收集构造事务处理所需的信息。录入站由对象模型和动态模型组成,分行和分理处主要是分布式事务管理系统, 它们的目的是维护数据库信息,并且在控制条件下允许在分布式网络上多次修改该数据库。所确定的事务管理部分是组成对象的主要部分。 银行网络系统含 3 个主要子系统:自动出纳机工作站、分行计算机和分理处计算机。其拓扑结构为星型。分行计算机同所有自动出纳机工作站、分理处计算机通信,其联结用专用电话线,工作站码和银行码用来区分联向分行的电话线。 ,银行网络系统的结构,银行网络系统的拓扑结构,练 习,习题十:4,