第九讲面向对象的方法软件工程传统方法与面向对象方法传统面向对象方法UML与RUP基于UML的实例分析第9讲面向对象的方法9.1传统方法与面向对象方法(1)传统方法存在的问题传统方法的发展以结构化程序设计为基础,并逐步扩展到分析与设计阶段的一种软件工程方法。面向功能的方法面向数据流的方法面向数据结构的方法传统方法的本质进行功能分解,从目标系统的整体功能着手,自顶向下不断将复杂的处理分解为子处理,直至每个子处理比较简单,在使用的时候一个一个依次调用就可以了。传统方法存在的主要问题由于围绕处理功能来构造系统的,因此任何需求的变化都会对原有系统产生致命的影响;需求不能精确描述,从分析到设计的转化存在鸿沟,造成分歧,系统的稳定性和易变性差;将数据与实现方法相分离的做法,偏离了客观世界中人们处理问题的方式;产生的软件重用性差,易变性差,可维护性差,软件不能满足用户要求的问题。DFD数据结构功能SC程序结构界面与细节鸿沟问题空间解空间?(2(1)认识问题、分析问题、解决问题的方式不同将数据和方法封装在一个称为“对象”的统一体中;对象之间通过“消息”相互联系,“对象+消息”机制取代了“数据结构+算法”的思路,减小了系统变化所带来的波动性;以对象为中心构建系统。(2)“问题空间”与“解空间”有较一致的表示在“OOA-OOD-OOI”的过程中,采用一致的模型表示,弥合了“鸿沟”问题。(3)利用继承性和封装性支持软件复用后一阶段可直接复用前一阶段的结果,可重用性好。(4)适应复杂大型系统的发展和变化要求以对象为中心,而不是基于功能与功能的分解来建立系统,因此,当功能需求发生变化时,不会引起系统的整体变化,稳定性较好(5)采用迭代的思想,通过连续的分析、设计,逐步认识系统例如五子棋,传统的设计思路就是确定问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。9.2传统面向对象方法OOA/OOD方法(Coad和Yourdon提出)OMT方法(Rumbaugh提出)Booch方法(Booch提出)OOSE方法(Jacobson提出)例问题简要描述:一个管理机构对于购买车的信息进行管理。管理机构有多名职员参与该管理工作。如果职员被授权进行进行管理,那么要对购车的信息进行登记:谁买了车、买了什么车、登记合法信息。合法信息分为注册和颁发执照。一个车主可能购买几部不同种类型的车,也可能一部车有几个车主。车分为卡车、小轿车、拖车,拖车分为标准拖车和旅行拖车。Coad/Yourdon方法(1)方法简介提出:P.Coad和E.Yourdon于1991年提出。该方法分2个阶段:OOA(Object-OrientedAnalysis)面向对象分析OOD(Object-OrientedDesign)面向对象设计。1、获取用户基本需求用户与开发者之间进行充分交流,常用Usercase来收集和描述用户的需求。即先标识使用该系统的不同的行为者(actor)。(2)OOA的分析过程获取用户基本需求标识类和对象定义类的结构和层次定义类(对象)间的关系为对象行为建模行为者所提出的每个使用场景(或功能)称为一个用例,所有的用例则构成完整的系统需求。组织机构车主执照注册汽车职员表示对象对象服务对象属性对象名标识类和对象主题(subject)又称为子系统(subsystem)是将一些联系密切的类组织在一起的类的集合。按照粒度控制原则,将系统组成几个主题,便于理解。组织机构车主执照注册汽车职员合法事件拖车轿车卡车标准旅行43211职员4汽车3合法事件2车主4、标识主题(可选)用“对象-关系模型”描述系统的静态结构组织机构名字管理者地址车主名字地址电话汽车编号出厂日期颜色型号柴油机座位职员用户名授权开始日期结束日期合法事件时间拖车×柴油机×座位轿车卡车重量标准旅行长度执照编号所属关系证明费用注册开始时间结束时间费用5、定义类(对象)间的关系通过消息连接说明所标识的各种对象是如何通信、协作,使系统运作起来。组织机构名字管理者地址车主名字地址电话汽车编号出厂日期颜色型号柴油机座位职员用户名授权开始日期结束日期合法事件时间拖车×柴油机×座位轿车卡车重量标准旅行长度执照编号所属关系证明费用CalculateFeeAcceptFee注册开始时间结束时间费用CalculateFeeAcceptFee隐含服务显式表示服务消息连接6、定义服务及消息连接是将OOA所创建的分析模型转换为设计模型,解决如何作的问题。OOD与OOA没有明显的分界,采用相同的符号。(3)OOD(Object-OrientedDesign)OOA人机交互部分HIC数据管理部分HIC问题域部分PDC任务管理部分HIC属性层结构层类/对象层主题层服务层设计人机交互部分设计问题域部分设计任务管理部分设计数据管理部分OOD4部分OOD4个活动什么是问题域设计OOD是对OOA的修改、增补根据实现技术及实现方面的限制,合并或分开一些类及对象、结构、属性、服务,但保留在OOA模型中所捕获到的基本的系统行为什么是人机交互设计通常在OOA阶段给出了所需的属性和操作,在设计阶段必须根据需求把交互的细节加入到用户界面的设计中,包括有效的人机交互所必需的实际显示和输入。什么是任务管理设计当系统中有许多并发行为时,需要依照各个行为的协调和通信关系,划分各种任务。任务管理主要包括识别事件驱动任务、识别时钟驱动任务、识别优先任务、识别协调任务、审查每个任务、定义每个任务等什么是数据管理设计数据管理提供了在数据管理系统中存储和检索对象的基本结构,包括对永久性数据的访问和管理。它分离了数据管理机构所关心的事项,包括文件、关系型DBMS或面向对象DBMS等。9.3UML与RUP(1)UML概述20世纪90年代,3个最流行的面向对象方法是:OMT方法(Rumbaugh提出),Booch方法(Booch提出),OOSE方法(Jacobson提出),每种方法各有所长,但不同符号体系的使用给用户带来了混乱。1994年Rumbaugh加入Booch所在的Rational公司,他们将Booch和OMT方法统一为UM0.8,后来Jacobson也加入到这一工作中,并于1996年6月和10月发布了UML0.9和UML0.91。到1996年年底,UML已经占据面向对象技术市场85%的份额,成为事实上的工业标准。97年在其它一些组织的参与下,OMG采纳了UML1.1为面向对象的标准建模语言。(2)UML的特点统一了Booch,OMT,OOSE和其它面向对象方法的基本概念和符号,汇聚了面向对象领域中各种优秀的思想。UML是一种可视化建模语言,而不是一种方法,因为UML中没有过程的概念,而过程是方法的一个重要组成部分。这意味着,用户在使用UML进行建模时,可以根据需要选用任何适合的过程。(3)UML的组成UML语义:描述基于UML的精确元模型定义。使开发者能在语义上取得一致,消除了因人而异的最佳表达方法所造成的影响.UML表示法:定义UML符号的表示法。UML中包括三种构造模块:元素、关系、图。其中元素包括:类、接口、用例、组件、节点、消息、连接、状态、事件、活动、包等。关系包括:依赖关系、关联关系、泛化关系、聚合关系、实现关系等。图共有9种,包括:用例图、类图、对象图、状态图、时序图,协作图、活动图、组件图和配置图。(1)标准建模语言UML(用例图)用例图描述的是外部执行者(Actor)所理解的系统功能。它将系统看作黑盒,从外部执行者的角度来理解系统,一个用例模型由若干个用例图描述,用例图主要元素是用例和执行者。用例图是包括执行者、由系统边界(一个矩形)封闭的一组用例,执行者和用例之间的关联、用例间关系以及执行者的泛化的图。(1)标准建模语言UML(用例)一个用例是用户与计算机之间的一次典型交互作用。是系统执行的一系列动作,执行的结果能被执行者察觉到(为参与者产生一个可观测的结果值)用例特点:用例捕获某些用户可见的需求,实现一个具体的用户目标。用例由执行者激活,并提供确切的值给执行者。用例可大可小,但它必须是对一个具体的用户目标实现的完整描述。(1)标准建模语言UML(执行者)执行者是指用户在系统中所扮演的角色(执行者未必是人)。通信联系:将执行者与用例连接到一起不带箭头的线段,表示两者之间交换信息。执行者触发用例,并与用例进行信息交换。单个执行者可与多个用例联系;反过来,一个用例可与多个执行者联系。对一个大系统,要列出用例清单常常是十分困难。这时可先列出执行者清单,再对每个执行者列出它的用例,问题就会变得容易很多。使用和扩展(UseandExtend):扩展关系:一个用例可由其它用例扩展而来,但扩展是有条件的。在没有遇到扩展点前,基用例正常执行,在到达扩展点且条件为真时,转入扩展用例执行,完成后再回到基用例继续执行。使用关系:当有一大块相似的动作存在于几个用例,又不想重复描述该动作,将重复的部分分离为一个用例,两用例间关系称为使用关系(1)标准建模语言UML(用例间关系)泛化关系将特定用例抽象为更一般的用例,子用例继承父用例的行为和含义,增加新行为或覆盖父用例的行为。参与者之间也可以存在泛化关系(1)标准建模语言UML(符号表示)用例图中的图符:用例执行者系统:用于界定系统功能范围,描述该系统功能的用例都置于其中,而描述外部实体的执行者都置于其外。关联:使用:由用例A指向用例B,表示用例A中使用了用例B中的行为或功能。扩展:由用例A指向用例B,表示用例B描述了一项基本需求,而用例A则描述了该基本需求的特殊情况。泛化:«使用»«扩展»设置边界风险分析交易估计进行交易超越边界更新帐目评价贸易经理营销人员记帐系统销售人员«使用»«使用»«扩展»与用例有些相似的概念是脚本。用例是一个类,它代表一类功能。而脚本是该用例的某个具体实例,表明系统的一次具体执行过程。如旅客订票是一个用例,而张三向系统订购到上海的机票,系统找零并打印车票,这就是一个脚本;而李四订购到北京的机票,但票已售完,这是另一个脚本。用例描述了系统做什么,但没有规定怎么做,它只是显示了参与者与用例间的关系,因此需要为用例图配上结构化的文本或图形(时序图、协作图、活动图)。用例图与脚本(场景)例如:某系统中用户“登录”用例:简单描述本用例描述用户如何登录到系统中。前置条件无后置条件如果用例成功,则用户登录到系统中。否则,系统状态不变。扩充点无事件流基本流程当用户登录到银行系统时,用例启动。(1)系统提示用户输入用户名和密码。(2)用户输入自己的用户名和密码。(3)系统验证用户名和密码(E1),用户登录系统成功。可选流程E1:如果用户名和密码无效,系统提示错误信息,用户可重新输入或停止。脚本示例(2)标准建模语言UML(类图)在面向对象的建模技术中,类、对象和它们之间的关系是最基本的建模元素。对于一个想要描述的系统,其类模型、对象模型以及它们之间的关系揭示了系统的结构。类图描述了系统中的类及其相互之间的各种关系,其本质反映了系统中包含的各种对象的类型以及对象间的各种静态关系(关联,子类型)。类图中的图符:类:表示一个类,其中第一栏是类的名,第二栏是类的属性,第三栏是类的操作。包:包是一种分组机制,表示一个类图集合。关联:用于表示类的对象之间在语义上的联系