面向对象的分析和设计_第1页
面向对象的分析和设计_第2页
面向对象的分析和设计_第3页
面向对象的分析和设计_第4页
面向对象的分析和设计_第5页
已阅读5页,还剩182页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、软件工程,面向对象的分析和设计,2,内容摘要,面向对象的基本概念 面向对象的分析和设计过程 UML概述 用况建模 静态建模 动态建模 物理体系结构建模,3,内容摘要,面向对象的基本概念 面向对象的分析和设计过程 UML概述 用况建模 静态建模 动态建模 物理体系结构建模,4,Peter Coad和Edward Yourdon提出用下列等式识认面向对象方法: 面向对象 = 对象(object) + 分类(classification) + 继承(inheritance) + 通过消息的通信(communication with messages) 可以说,采用这四个概念开发的软件系统是面向对象的

2、,5,面向对象方法的出现很快受到计算机软件界的青睐,并成为20世纪90年代的主流开发方法。我们可以从下列几个方面来分析其原因: 从认知学的角度来看,面向对象方法符合人们对客观世界的认识规律。 面向对象方法开发的软件系统易于维护,其体系结构易于理解、扩充和修改。 面向对象方法中的继承机制有力支持软件的复用,6,面向对象的基本概念,1. 对象(object) 对象是指一组属性以及这组属性上的专用操作的封装体。 属性(attribute)通常是一些数据,有时它也可以是另一个对象。每个对象都有它自己的属性值,表示该对象的状态。对象中的属性只能通过该对象所提供的操作来存取或修改。 操作(operatio

3、n)(也称方法或服务)规定了对象的行为,表示对象所能提供的服务,7,封装(encapsulation)是一种信息隐蔽技术,用户只能看见对象封装界面上的信息,对象的内部实现对用户是隐蔽的。封装的目的是使对象的使用者和生产者分离,使对象的定义和实现分开。 一个对象通常可由对象名、属性和操作三部分组成,8,2. 类(class) 类是一组具有相同属性和相同操作的对象的集合。一个类中的每个对象都是这个类的一个实例(instance)。 类是创建对象的模板,从同一个类实例化的每个对象都具有相同的结构和行为,9,10,3. 继承(inheritance) 继承是类间的基本关系,它是基于层次关系的不同类共享

4、数据和操作的一种机制。父类中定义了其所有子类的公共属性和操作,在子类中除了定义自己特有的属性和操作外,可以继承其父类(或祖先类)的属性和操作,还可以对父类(或祖先类)中的操作重新定义其实现方法,11,12,有时,我们定义一个类,它把一些类组织起来,提供一些公共的行为,但并不需要使用这个类的实例,而仅使用其子类的实例。我们把这种没有实例的类称为抽象类(abstract class)。在抽象类中可以定义抽象操作,抽象操作指:只定义这个类的操作接口,不定义它的实现,其实现部分由其子类定义。抽象操作操作名用斜体字表示,也可以在操作特征(signature)后面加上特征字符串abstract,13,14

5、,如果一个子类只有唯一一个父类,这个继承称为单一继承。如果一个子类有一个以上的父类,这种继承称为多重继承,15,4. 消息(message) 消息传递是对象间通信的手段,一个对象通过向另一个对象发送消息来请求其服务。一个消息通常包括接收对象名、调用的操作名和适当的参数(如果有必要的话)。消息只告诉接收对象需要完成什么操作,但并不指示接收者怎样完成操作。消息完全由接收者解释,接收者独立决定采用什么方法完成所需的操作,16,5. 多态性(polymorphism) 多态性是指同一个操作作用于不同的对象上可以有不同的解释,并产生不同的执行结果。例如“画”操作,作用在“矩形”对象上,则在屏幕上画一个矩

6、形,作用在“圆”对象上,则在屏幕上画一个圆。也就是说,相同操作的消息发送给不同的对象时,每个对象将根据自己所属类中定义的这个操作去执行,从而产生不同的结果,17,6. 动态绑定(dynamic binding) 动态绑定是指在程序运行时才将消息所请求的操作与实现该操作的方法连接起来。 传统的程序设计语言的过程调用与目标代码的连接(即调用哪个过程)放在程序运行前(即编译时)进行(称为静态绑定),而动态绑定则是把这种连接推迟到运行时才进行。 动态绑定是一种在运行时确定被执行代码的技术,18,在一般与特殊关系中,子类是父类的一个特例,所以父类对象可以出现的地方,也允许其子类对象出现。因此在运行过程中

7、,当一个对象发送消息请求服务时,要根据接收对象的具体情况将请求的操作与实现的方法进行连接,即动态绑定,19,if 条件 then p := t ; else p := r ; area := p.getarea,Var p : polygon ; Var t : triangle := triangle.new ; Var r : rectangle := rectangle.new,20,内容摘要,面向对象的基本概念 面向对象的设计过程 UML概述 用况建模 静态建模 动态建模 物理体系结构建模,21,面向对象的设计过程,面向对象设计的一般步骤如下: 系统设计 将子系统分配到处理器 选择实现

8、数据管理、界面支持和任务管理的设计策略 为系统设计合适的控制机制 复审并考虑权衡(折衷,22,对象设计 在过程级别(procedural lavel)设计每个操作,即设计每个操作的实现细节 定义内部类 为类属性设计内部数据结构 消息设计 使用对象间的协作和对象-关系模型,设计消息模型 复审 复审设计模型并在需要时迭代,23,1. 系统设计 1) 将分析模型划分成子系统 在OO系统设计中,我们把分析模型中紧密相关的类、关系等设计元素包装成子系统。 通常,子系统的所有元素共享某些公共的性质,它们可能都涉及完成相同的功能;它们可能驻留在相同的产品硬件中;或者它们可能管理相同的类和资源。子系统由它们的

9、责任所刻画,即,一个子系统可以通过它提供的服务来标识。在OOD中,这种服务是完成特定功能的一组操作,24,子系统的设计准则是: (1) 子系统应具有定义良好的接口,通过接口和系统的其它部分通信; (2) 除了少数的“通信类” 外,子系统中的类应只和该子系统中的其它类协作; (3) 子系统的数量不宜太多; (4) 可以在子系统内部再次划分,以降低复杂性,25,2) 标识问题本身的并发性,并为子系统分配处理器 通过对对象-行为模型的分析,可发现系统的并发性。如果对象(或子系统)不是同时活动的,则它们不需并发处理,此时这些对象(或子系统)可以在同一个处理器上实现。反之,如果对象(或子系统)必须对一些

10、事件同时异步地动作,则它们被视为并发的,此时,可以将并发的子系统分别分配到不同的处理器,或者分配在同一个处理器,而由操作系统提供并发支持,26,3) 任务管理设计 Coad和Yourdon提出如下管理并发任务对象的设计策略: (1) 确定任务的类型; (2) 必要时,定义协调者任务和关联的对象; (3) 将协调者任务和其它任务集成。 通常可通过了解任务是如何被启动的来确定任务的类型,如事件驱动任务,时钟驱动任务。每个任务应该定义其优先级,并识别关键任务。当有多个任务时还可以考虑增加一个协调者任务,以控制这些任务协同工作,27,4) 数据管理设计 通常数据管理设计成层次模式,其目的是将数据的物理

11、存储及操纵与系统的业务逻辑加以分离。 数据管理的设计包括设计系统中各种数据对象的存储方式(如内部数据结构、文件、数据库),以及设计相应的服务,即为要储存的对象增加所需的属性和操作,28,5) 资源管理设计 OO系统可利用一系列不同的资源(如磁盘驱动器、处理器、通信线路等外部实体或数据库、对象等抽象资源),很多情况下,子系统同时竞争这些资源,因此要设计一套控制机制和安全机制,以控制对资源的访问,避免对资源使用的冲突。 6)人机界面设计 对大多数应用系统而言,人机界面本身是一个非常重要的子系统。人机界面主要强调人如何命令系统,以及系统如何向人提交信息。它包括窗口、菜单、报告的设计,29,7) 子系

12、统间的通信 子系统之间可以通过建立客户/服务器连接进行通信,也可以通过端对端(peer to peer)连接进行通信。我们必须确定子系统间通信的合约(contract),合约提供了一个子系统和另一个子系统交互的方式,30,2. 对象设计 对象设计是为每个类的属性和操作作出详细的设计,并设计连接类与它的协作者之间的消息规约。 1) 对象描述 对象的设计描述可以采取以下形式之一: (1) 协议描述:描述对象的接口,即定义对象可以接收的消息以及当对象接收到消息后完成的相关操作; (2) 实现描述:描述传送给对象的消息所蕴含的每个操作的实现细节,实现细节包括有关对象私有部分的信息,即关于描述对象属性的

13、数据结构的内部细节和描述操作的过程细节。 对对象的使用者来说,只需要协议描述就够了,31,2)设计算法和数据结构 为对象中的属性和操作设计数据结构和实现算法,32,内容摘要,面向对象的基本概念 面向对象的分析和设计过程 UML概述 用况建模 静态建模 动态建模 物理体系结构建模,33,统一建模语言UML,Unified Modeling Language,34,模型元素 模型元素指模型中的实体以及实体间相互连接的关系,35,视图与图,36,静态视图 静态视图对应用领域中的概念以及与系统实现有关的内部概念建模,主要由类以及类之间的相互关系组成,在静态视图中不描述依赖于时间的系统行为。静态视图用类

14、图来展示。 设计视图 设计视图对应用自身的设计结构建模,例如,将设计结构扩展成:结构化类元,为实现功能所需的协作和定义接口的构件的组装。设计视图由内部结构图、协作图和构件图实现,37,用况视图 用况视图对被称为执行者的外部代理(他与特定视点的主题交互)所感受到的主题(如系统)功能建模。用况视图的意图是列出系统中的用况和执行者,并显示哪个执行者参与了哪个用况的执行。用况的行为用动态视图,特别是交互视图来表示。用况视图用用况图来展示,38,状态机视图 状态机视图对一个类的对象的可能生命历程建模。一个状态机包括用迁移连接的状态,每个状态对一个对象在其生命期中满足某种条件的一个时间段建模。当一个事件发

15、生时,它会导致触发对象的一个状态向另一个新状态的迁移,附加在迁移上的动作或活动也同时被执行。状态机视图用状态机图来展示,39,活动视图 活动展示了包含在执行计算或工作流中的计算活动的控制流。一个动作是一个基本的计算步,一个活动结点是一组动作或子活动,一个活动可描述顺序的和并发的计算。活动视图用活动图来展示。 交互视图 交互视图描述系统各部分中消息交换的顺序。交互视图提供了系统中行为的整体视图,也就是说,它展示了多个对象间交叉的控制流。交互视图用顺序图和通信图来展示,40,部署视图 部署视图描述了运行时结点上制品的分布。制品是一个物理实现单元,如一个文件,它也可以表示一或多个构件的实现(一种表现

16、形式)。结点是运行时表示计算资源的物理对象,如,计算机、设备或内存。部署视图允许对分配的结果和资源分配进行评估。部署视图用部署图来展示,41,模型管理视图 模型管理视图对模型自身的组织建模。一个模型由一组保存模型元素(如类、状态机、用况)的包组成。包还可以包含其它的包,因此,一个模型从一个间接包含所有模型内容的根包(root package)开始。包是操纵模型内容的单元,还是访问控制和配置控制的单元。每个模型元素可以被一个包或另一个元素拥有。模型管理信息通常展示在包图中,它是类图的变种,42,剖面(profile) UML是用一个元模型(metamodel)定义的,元模型是指描述建模语言自身的

17、模型。通常元模型的改变是复杂的,也是危险的。剖面机制允许在不修改基础元模型的前提下对UML作有限的变化。UML包含三个主要的可扩展结构:约束(constraints)、版型(stereotypes)和标签值(tagged values)。 约束是以自然语言或特定形式语言的正文表示的语义条件或限制,约束写在花括号中(),如value0,or。版型是在基于现有各类模型元素的外形中定义模型元素的新类型,它本质上是一种新元类(metaclass)。版型可以扩展语义,但不能扩展原元模型类的结构。用标记版型,如signal。标签值是贴在任何模型元素上的被命名的信息片,43,版型,角色 客户,44,类图 类

18、图展示了系统中类的静态结构,即类与类之间的相互联系。类之间有多种联系方式,如关联(相互连接)、依赖(一个类依赖或使用另一个类)、泛化(一个类是另一个类的特殊情况)等。可以把若干个相关的类包装在一起作为一个单元(包),相当于一个子系统。一个系统可以有多张类图,一个类也可以出现在几张类图中。 对象图 对象图是类图的实例,它展示了系统执行在某一时间点上的一个可能的快照。对象图使用与类图相同的符号,只是在对象名下面加上下划线,同时它还显示了对象间的所有实例链接(link)关系,45,协作图 协作图展示了协作的定义,是一种合成的结构图。协作是为了完成某一目的而一起工作的一组对象间的上下文关系,46,构件

19、图 构件图展示了系统中的构件(即来自应用的软件单元),构件间通过接口的连接,以及构件之间的依赖关系,47,用况图 用况图展示了各类外部执行者与系统所提供的用况之间的连接。一个用况是系统所提供的一个功能(也可以说是系统提供的某一特定用法)的描述,执行者是指那些可能使用这些用况的人或外部系统,执行者与用况的连接表示该执行者使用了那个用况。用况图给出了用户所感受到的系统行为,但不描述系统如何实现该功能。用况通常用普通正文描述,也可以用活动图来描述,48,状态机图 状态机图通常是对类描述的补充,它说明该类的对象所有可能的状态以及哪些事件将导致状态的改变。一个事件可以是另一个对象向它发送的一条消息,或者

20、是满足了某些条件。状态的改变称为迁移(transition)。一个状态迁移还可以有与之相关的动作,该动作指出状态迁移时应做什么。 并不是所有的类都要画状态机图,有些类有一些意义明确的状态,并且其行为受不同的状态所影响和改变,这些类才需要画状态机图,49,活动图 活动图展示了连续的活动流。活动图通常用来描述完成一个操作所需要的活动。当然它还能用于描述其它活动流,如描述用况。活动图由动作状态组成,它包含完成一个动作的活动的规约(即规格说明)。当一个动作完成时,将离开该动作状态。活动图中的动作部分还可包括消息发送和接收的规约,50,顺序图 顺序图展示了几个对象之间的动态交互关系。它主要是用来显示对象

21、之间发送消息的顺序,它还显示了对象之间的交互,即系统执行的某一特定点所发生的事,51,部署图 部署图展示了运行时处理结点和在结点上生存的制品的配置。结点是运行时的计算资源,制品是物理实体,如构件、文件。 部署图中显示部署在结点上的制品和它们之间的关系,以及结点之间的连接和通信方式,52,包图 包图是由包和它们间的关系组成的结构图 模型是在某一视点给定的精度上对系统的完整描述,一个系统可以从不同的视点(如分析模型、设计模型)存在多个模型。一个模型可看作一个特定类型的包,通常仅显示包就足够了(不必显示包内部的细节)。 下图给出了剧院系统所细分成的包以及它们之间的依赖关系,53,内容摘要,面向对象的

22、基本概念 面向对象的分析和设计过程 UML概述 用况建模 静态建模 动态建模 物理体系结构建模,54,用况建模,用况建模是用于描述一个系统应该做什么的建模技术,用况建模不仅用于新系统的需求获取,还可用于已有系统的升级。用况模型用用况图来描述。 用况图展示了各类外部执行者与系统所提供的用况之间的连接。一个用况是系统所提供的一个功能(也可以说是系统提供的某一特定用法)的描述,执行者是指那些可能使用这些用况的人或外部系统,执行者与用况的连接表示该执行者使用了那个用况。用况图给出了用户所感受到的系统行为,但不描述系统如何实现该功能。 用况通常用普通正文描述,也可以用活动图来描述,55,任何一个涉及到系

23、统功能活动的人都会用到用况模型。 客户:用况模型指明了系统的功能,描述了系统能如何使用。用况建模时客户的积极参与是十分重要的。 开发者:用况模型帮助他们理解系统要做什么,同时为以后的其它模型建模、结构设计、实现等提供依据。 集成测试和系统测试人员:根据用况来测试系统,以验证系统是否完成了用况指定的功能,56,用况建模步骤,创建用况模型的步骤包括: 1定义系统 2确定执行者 3确定用况 4描述用况 5定义用况间的关系, 6确认模型,57,用况模型由用况图组成,用况图展示了执行者、用况以及它们之间的关系。用况通常用正文形式来描述。 一个用况模型可由若干幅用况图组成。一幅用况图包含的模型元素有系统、

24、执行者、用况,以及表示它们间的不同关系,如关联、扩展、包含、泛化等,58,用况图,59,一. 确定执行者 执行者是指与系统交互的人或其它系统 执行者代表一种角色,而不是具体的某个人 执行者可分成主执行者和副执行者: 主执行者使用系统的主要功能 例如,保险系统中主执行者处理保险的注册和管理 副执行者处理系统的辅助功能 例如,管理数据库、通信、备份以及其它管理等系统维护,60,执行者还可分为主动执行者和被动执行者: 主动执行者开始一个用况 被动执行者从不开始用况,只是参与一个或多个用况,61,我们可以通过回答下列问题来确定执行者: 谁使用系统的主要功能(主执行者)? 谁需要从系统中得到对他们日常工

25、作的支持? 谁需要维护、管理和维持系统的日常运行(副执行者)? 系统需要控制哪些硬件设备? 系统需要与哪些其它系统交互? 哪些人或哪些系统对系统产生的结果(值)感兴趣,62,确定用况 1. 用况的特征 用况总是被执行者启动的(initiated),执行者必须直接或间接地指示系统去执行用况 用况向执行者提供值,这些值必须是可识别的 用况是完整的,一个用况必须是一个完整的描述,63,2. 寻找用况 可以通过让每个执行者回答以下问题来寻找用况: 执行者需要系统提供哪些功能?执行者需要做什么? 执行者是否需要读、创建、删除、修改或储存系统中的某类信息? 执行者是否要被系统中的事件提醒,或者执行者是否要

26、提醒系统中某些事情?从功能观点看,这些事件表示什么? 执行者的日常工作是否因为系统的新功能(尤其是目前尚未自动化的功能)而被简化或提高了效率,64,另外还有一些不是目前的执行者回答的问题: 系统需要哪些输入/输出?谁从系统获取信息?谁为系统提供信息? 与当前系统(可能是人工系统而不是自动化系统)的实现有关的主要问题是什么? 对同一个项目,不同的开发者选取的用况数是不一样的。例如一个10个人年规模的项目,有人选取了20个用况,而在一个类似的项目中,有人选用了100个用况。 似乎20个太少,而100个太多,希望在项目规模和用况数之间保持均衡,65,3. 用况的描述 用况通常用正文(text)来描述

27、,也可用活动图来描述 。 用况的正文描述应包括以下内容: 用况的目的:用况的最终目的是什么?它试图达到什么? 用况是如何启动(initiate)的:哪个执行者在什么情况下启动用况的执行? 执行者和用况之间的消息流:用况与执行者之间交换什么消息或事件来通知对方改变或恢复信息?描述系统与执行者之间的主消息流是什么?以及系统中哪些实体被使用或修改,66,用况中可供选择的流:用况中的活动可根据条件或异常(exception)有选择地执行。 如何通过给执行者一个值来结束用况:描述何时可认为用况已结束,67,执行者的简要描述 如客户:向公司订购商品的人 客户代表:公司处理客户请求的雇员 库存系统:记录公司

28、库存的软件 用况的简要描述 如订购货物:客户创建一个新的请求商品的订单,并为那些商品付费 取消订单:客户取消一个已经存在的订单,68,用况的详细描述 前置条件和后置条件 前置条件和后置条件表示用况开始和结束的条件 事件流(flow of events) 事件流是一系列陈述句,它是从执行者的角度看,列出用况的各个步骤 用况描述中可以包含条件、分支和循环。 例如:订购货物用况的描述如下,69,用况名称:订购货物 参与的执行者:客户、客户代表 前置条件:一个合法的客户已经登录到这个系统 事件流: 当客户选择订购货物时,用况开始 客户输入他的姓名和地址 如果客户只输入邮编,系统将给出州和城市名 当客户

29、输入产品代码 a. 系统给出产品描述和价格 b. 系统往客户订单中添加该物品的价格 循环结束 5. 客户输入信用卡支付信息,70,6. 客户选择提交 7. 系统检验输入的信息,把该订单作为未完成的交易保存,同时向记账系统转发支付信息。如果客户提交的信息不正确,系统将提示客户修改。 8. 当支付确认后,订单就被标记上已经确认,同时返回给客户一个订单ID,用况也就结束了。如果支付没有被确认,系统将提示客户改正支付信息或者取消。如果客户选择修改信息,就回到第5步;如果选择取消,用况结束。 后置条件:如果订单没有被取消,它将保存在系统中,并做上标记,71,其他需求 在用况中还可描述一些特殊的需求,这些

30、需求常常是非功能性需求,如可用性、安全性、可维护性、负载、性能、自动防故障、数据需求等。 如订购货物用况的其他需求: 前置条件:(略) 事件流: (略) 特殊需求: 系统必须在一秒内响应客户的输入 后置条件: (略,72,事件流可分为两部分: 基本路径 基本路径是运转正常时的路径,是一系列没有分支和选择的简单陈述句 可选路径 可选路径是指不同于基本路径而允许不同的事件序列的路径。 对于明显有可能随时发生的事情来说,可选路径非常有效,73,如订购货物用况的基本路径: 事件流: 基本路径 当客户选择订购货物时,用况开始 客户输入他的姓名和地址 当客户输入产品代码时 a. 系统给出产品描述和价格 b

31、. 系统往客户订单中添加该物品的价格 循环结束 4. 客户输入信用卡支付信息 5. 客户选择提交 6. 系统检验输入的信息,把该订单作为未完成的交易保存,同时向记账系统转发支付信息 7. 当支付确认后,订单就被标记上已经确认,同时返回给客户一个订单ID,用况结束,74,如果在订购货物用况中,客户可以在提交订单前随时取消订单,其可选路径如下: 可选路径: 在选择提交前的任何时候,客户都可以选择cancel。这次订购没有被保存,用况结束。 在基本路径第6步,如果有任何不正确的信息,系统提示客户去修改这些信息。 在基本路径第7步,如果支付没有被确认,系统将提示客户改正支付信息或者取消。如果客户选择修

32、改信息,就回到基本路径第4步;如果选择取消,用况结束,75,确定用况之间的关系,76,77,实例,本实例实现一个简化了的银行储蓄账户管理系统,该系统是在银行的柜台上对客户办理活期储蓄业务。系统的需求陈述如下: 一个客户可以在多个银行中开设账户,一个客户也可在同一银行中开设多个不同的账户。客户可以通过银行职员进行开户、存款、取款、转账、注销账户等活动。其中转账指客户将自己的某个账户上的钱款转入同一银行的不同账户(称为银行内转账)或转入不同银行的账户(称为银行间转账)。系统管理员负责系统的账户管理及业务报表的生成,78,识别执行者 客户:到银行办理储蓄业务的人,负责输入密码 银行职员(客户代理):

33、银行工作人员,代表客户进行储蓄业务的操作 银行职员(管理人员):银行工作人员,根据客户的储蓄业务更新账户 管理员:银行计算机的管理人员,负责账户的管理和业务报表的生成,79,识别用况 从系统的需求陈述可知,银行职员(客户代理)需要系统提供开户、存款、取款、转账、注销账户等功能,这些功能都包含了校验密码的功能。系统管理员需要系统提供账户管理和报表生成功能。银行职员(管理人员)则参与了账户管理中的更新账户的功能。此外,转账功能可分为银行内转账和银行间转账,我们可将它们设计成三个用况,其中银行内转账用况和银行间转账用况都继承了基本转账用况。据此分析,得到该系统的用况图如下图所示,80,81,开户用况

34、描述 用况名称:开户 参与的执行者:银行职员(客户代理),客户 前置条件:一个合法的银行职员(客户代理)已登录到该系统 事件流: 1.当选择开户功能时用况开始 2.输入客户信息(姓名、地址、身份证号等) 3.从账户管理系统获取新的账号 4.请客户输入密码 5.请客户再次输入密码 6.如果两次密码不一致则回到第4步,否则继续 7.在账户库中添加新账户 8.打印存折,用况结束 后置条件:在账户库中增加了一个新账户,得到一张新存折,82,取款用况描述 用况名称:取款 参与的执行者:银行职员(客户代理) 前置条件:一个合法的银行职员(客户代理)已登录到该系统 事件流: 基本路径: 1.当选择取款功能时

35、用况开始 2.当输入客户信息(姓名、账号等)后 a)如果客户信息与账户不一致,显示错误信息,可以重新输入或结束用况 b)如果该账户被冻结(如因挂失而冻结),显示冻结信息并结束用况 3.输入并校验密码,83,4.输入取款金额,如果该账户的余款小于取款金额,显示错误信息,要求重新输入 5.打印取款单,交客户签字 6.建立取款事件记录,更新账户信息 7. 打印存折,用况结束 可选路径: 1.在第5步客户签字之前的任何时刻,客户可以取消本次取款,用况结束 2.第3步校验密码时,如发现密码不一致,则重新输入密码,或用况结束 后置条件:如果取款成功,客户账户中的余额被更新(减少),否则余额不变,84,描述

36、取款用况的活动图,85,内容摘要,面向对象的基本概念 面向对象的分析和设计过程 UML概述 用况建模 静态建模 动态建模 物理体系结构建模,86,静态建模(类和对象建模,类和对象模型的基本模型元素有类、对象以及它们之间的关系。系统中的类和对象模型描述了系统的静态结构,在UML中用类图和对象图来表示,87,类图由系统中使用的类以及它们之间的关系组成。类之间的关系有关联、依赖、泛化、实现等。类图是一种静态模型,它是其它图的基础。一个系统可以有多张类图,一个类也可出现在几张类图中。 对象图是类图的一个实例,它描述某一时刻类图中类的特定实例以及这些实例之间的特定链接。对象图使用了与类图相同的符号,只是

37、在对象名下附加下划线,对象名后可接以冒号和类名,即 object-name:class-name,88,89,类图和对象图,实例,x,90,确定类,1. 标识类 这里介绍一种类责任协作者(classresponsibilitycollaborator,简称CRC)技术。CRC实际上是一组表示类的索引卡片,每张卡片分成三部分,它们分别描述类名、类的责任和类的协作者,91,1) 标识潜在的对象类 通常陈述中的名词或名词短语是可能的潜在对象,它们以不同的形式展示出来,如: 1)外部实体(如,其它系统、设备、人员),他们生产或消费计算机系统所使用的信息; 2)物件(如,报告、显示、信函、信号),它们是

38、问题信息域的一部分; 3)发生的事情或事件(如,性能改变或完成一组机器人移动动作),它们出现在系统运行的环境中,92,4)角色(如:管理者、工程师、销售员),他们由与系统交互的人扮演; 5)组织单位(如:部门、小组、小队),他们与一个应用有关; 6)场所(如:制造场所、装载码头),它们建立问题和系统所有功能的环境; 7)构造物(如,四轮交通工具、计算机),它们定义一类对象,或者定义对象的相关类,93,回答下列问题来识别潜在对象: 是否有要储存、转换、分析或处理的信息? 是否有外部系统? 是否有模式(pattern)、类库和构件等? 是否有系统必须处理的设备? 是否有组织部分(organizat

39、ional parts)? 业务中的执行者扮演什么角色?这些角色可以看作类,如客户、操作员等,94,2)筛选对象类,确定最终对象类 我们可以用以下选择特征来确定最终的对象: 1)保留的信息:仅当必须记住有关潜在对象的信息,系统才能运作时,则该潜在对象在分析阶段是有用的; 2)需要的服务:潜在对象必须拥有一组可标识的操作,它们可以按某种方式修改对象属性的值; 3)多个属性:在分析阶段,关注点应该是“较大的”信息(仅具有单个属性的对象在设计时可能有用,但在分析阶段,最好把它表示为另一对象的属性,95,4)公共属性:可以为潜在的对象定义一组属性,这些属性适用于该类的所有实例; 5)公共操作:可以为潜

40、在的对象定义一组操作,这些操作适用于该类的所有实例; 6) 必要的需求:出现在问题空间中的外部实体以及对系统的任何解决方案的实施都是必要的生产或消费信息,它们几乎总是定义为需求模型中的类,96,对象和类还可以按以下特征进行分类: 1)确切性(tangibility):类表示了确切的事物(如,键盘或传感器),还是表示了抽象的信息(如,预期的输出)? 2)包含性(inclusiveness):类是原子的(即不包含任何其它类),还是聚合的(至少包含一个嵌套的对象)? 3)顺序性(sequentiality):类是并发的(即,拥有自己的控制线程),还是顺序的(被外部的资源控制),97,4)持久性(pe

41、rsistence):类是短暂的(即,它在程序运行期间被创建和删除)、临时的(它在程序运行期间被创建,在程序终止时被删除)、还是永久的(它存放在数据库中)? 永久对象(persistent object):其生存周期可以超越程序的执行时间而长期存在的对象。 5)完整性(integrity):类是易被侵害的(即,它不防卫其资源受外界的影响),还是受保护的(该类强制控制对其资源的访问)。 基于上述分类,CRC卡的内容可以扩充,以包含类的类型和特征,98,99,2. 标识责任 责任是与类相关的属性和操作,简单地说,责任是类所知道的或要做的任何事情。 (1)标识属性 属性表示类的稳定特征,即为了完成客

42、户规定的目标所必须保存的类的信息,一般可以从问题陈述中提取出或通过对类的理解而辨识出属性。分析员可以再次研究问题陈述,选择那些应属于该对象的内容,同时对每个对象回答下列问题:“在当前的问题范围内,什么数据项(复合的和/或基本的)完整地定义了该对象,100,2) 定义操作 操作定义了对象的行为并以某种方式修改对象的属性值。操作可以通过对系统的过程叙述的分析提取出来,通常叙述中的动词可作为候选的操作。类所选择的每个操作展示了类的某种行为。 操作大体可分为三类: 以某种方式操纵数据的操作(如,增加、删除、重新格式化、选择); 完成某种计算的操作; 为控制事件的发生而监控对象的操作,101,3. 标识

43、协作者 一个类可以用它自己的操作去操纵它自己的属性,从而完成某一特定的责任,一个类也可和其它类协作来完成某个责任。如果一个对象为了完成某个责任需要向其它对象发送消息,则我们说该对象和另一对象协作。协作实际上标识了类间的关系。 为了帮助标识协作者,可以检索类间的类属关系。如果两个类具有整体与部分关系(一个对象是另一个对象的一部分),或者一个类必须从另一个类获取信息,或者一个类依赖于(depends-upon)另一个类,则它们间往往有协作关系,102,UML对属性的描述 UML中,描述一个属性的语法如下: visibilityopt /opt attribute-name : type opt m

44、ultiplicityopt = initial-valueopt property-stringopt 其中带下标opt或 opt的部分表示该部分是任选的。 visibility(可见性):表示该属性在哪个范围内可见(即可使用),见下表,103,可见性,104,attribute-name:表示属性名。 type(类型):用来指明属性名的类型。 multiplicity(重数):用来指出该属性可能的值的个数以及它们的排列次序和唯一性。值的个数写在方括号( )中,其形式是:minimum.maximum。maximum可以是“*”,表示“无限”。当值的个数是单一值(如值的个数是3)时,可写成3

45、.3或简写成3。典型的写法有:0.1,1(表示1.1),*(表示0.*),1.*,1.3。当重数缺省时,隐含表示重数为1。当一个属性有多个值时,可在值的个数后面指明值元素的排列次序和唯一性,排列次序和唯一性写在花括号( )中,可使用的关键字如下表所示,其默认值是set,即无序且值元素唯一,105,106,initial-value(初值):在创建一个类的实例对象时,应对其属性赋值,如果类中对某属性定义了初值,那么该初值可作为创建对象时该属性的默认值。 property-string(特征字符串):用来明确地指明该属性可能的候选值,如红,黄,绿指出该属性可枚举的值只能是红、黄、绿,107,属性还

46、可以定义为类属性(class attribute,C+或Java中称为静态属性static attibute) ,表示被这个类的所有实例对象共享该属性的值。类属性是这个类的名字空间中的全局变量。类属性用下划线来指明,108,109,UML对操作的描述 UML中描述一个操作的语法如下: visibilityopt operating-name(parameter-list) : return-type opt property-string opt 操作可见性的含义与属性中的含义相同。参数表是用逗号分隔的形式参数序列,描述一个参数的语法如下: directionopt parameter-nam

47、e :type multiplicityopt = default -valueopt 其中:direction(方向):用来指明参数信息流的方向,110,方向的取值,111,type 和multiplicity的含义与属性中的含义相同,default value(默认值)是在操作的调用者未提供参数时,用它作为该参数的值。 类也可以定义类操作(class operation)。通常操作是在该类的对象实例上被调用的,而类操作可以在没有对象实例的情况下被调用,但此时只允许访问类属性,112,113,类之间的关系,114,1. 关联 关联描述了系统中对象之间或其它实例之间的连接。关联的种类主要有二元

48、关联,多元关联,受限关联,聚集(aggregation)和组合(composition,115,1)二元关联 二元关联表示为在两个类之间用一条直线连接,直线上可写上关联名,116,关联的两端可加上重数(multiplicity) ,表示该类有多少个对象可与对方的一个对象关联,117,允许一个类与自身关联,118,119,2)多元关联 三个或三个以上的类之间可以互相关联,120,121,3)受限关联(qualified association):受限关联用于一对多或多对多的关联。限定符(qualifier)用来区分关联“多”端的对象集合,它指明了在关联“多”端的某个特殊对象,122,4) 聚集和

49、组合 聚集(aggregation)是表示整体一部分关系的一种关联,它的“部分”对象可以是任意“整体”对象的一部分,123,组合(composition):组合是一种更强形式的关联,代表整体的组合对象有管理它的部分对象的特有责任,如部分对象的分配和解除分配。组合关联具有强的物主身份,即“整体”对象拥有“部分”对象,“部分”对象生存在“整体”对象中,124,5)关联类 :UML中可以把关联定义成类,该关联的每个链都是这个类的实例,125,6)导航性(navigability,126,导航性,127,泛化 泛化指出类间的“一般特殊关系” (is-a) 一般类定义了它的特殊类的公共属性和操作 对一般

50、类扩展一些属性和/或操作后,可以特化(specialize)成特殊类 一般类是特殊类的父类,特殊类是一般类的子类 特殊类可以继承一般类的属性和操作 子类可以定义自己的属性和操作,也可重新定义父类中的操作,但重新定义的操作必须与父类具有相同的操作特征(signature,128,129,泛化是一种分类学关系,一个一般类可以从不同的维或方面将其特化(specialization)成不同的特殊类集合,用一个类元(用作分类符)来表示一个维或方面,由一个类元特化而成的特殊类组成一个泛化集(generalization set)。在泛化集中可对其元素应用约束,在UML中提供以下约束,见下表,130,泛化集

51、的约束,131,132,3. 实现:实现关系将一个模型元素(如类)连接到另一个模型元素(如接口),后者(如接口)是行为的规约(specification),而不是结构,前者(如类)必须至少支持(通过继承或直接声明)后者的所有操作。可以认为前者是后者的实现。 泛化和实现都可以将一般描述与具体描述联系起来。其区别是,泛化是同一语义层上的元素之间的连接,通常在同一模型内;而实现是不同语义层中的元素之间的连接,它通常建立在不同的模型内,如设计类到分析类是一种实现关系,133,134,4. 约束和派生(constraint & derivation) 约束是用自然语言或特定的形式语言正文表示的语义条件或

52、限制,它用“正文字符串”形式表示。约束可以附加到任何模型元素上,如前面有关泛化的约束有:不相交、交迭、完全的、不完全的,135,136,137,138,内容摘要,面向对象的基本概念 面向对象的分析和设计过程 UML概述 用况建模 静态建模 动态建模 物理体系结构建模,139,动态建模,动态建模用来描述系统的动态行为,显示对象在系统运行期间不同时刻的动态交互。UML中用状态机图、活动图、顺序图、通信图和协作图来建立动态模型,140,状态机图,状态机图通常是对类描述的补充,它说明该类的对象所有可能的状态,以及哪些事件将导致状态的改变。状态机图描述了对象的动态行为,是一种对象生存周期的模型,141,

53、画状态机图的步骤,1)列出对象具有的所有状态 状态分为起始状态、结束状态和中间状态。一张状态机图可以有一个起始状态和若干个(可以为0)结束状态。 2)标识导致状态转换的事件 当一个对象接收到某个事件时,会导致从一个状态转换到另一个状态,称为状态迁移(transition)。 3)为状态和迁移定义状态变量和动作 在状态迁移和/或处于某个状态中时都可能需要执行一些相应的动作,综合这些动作,使得对象完成相应的功能,142,143,144,状态,一个状态由状态名、状态变量和活动三部分组成。 状态变量是状态机图所显示的类的属性,也可以是临时变量。 活动部分列出了处于该状态时要执行的事件和动作,145,有

54、三个标准事件:entry,exit和do。 Entry和exit事件用于指明进入和退出该状态时的特定动作。 do事件用于指明在该状态中时执行的动作。 活动区中事件的语法如下: event-nameopt (argument list ) opt guard-condition opt /activity-expressionopt 其中,事件名可以是包括三个标准事件(entry,exit,do)在内的任何事件,参数表表示该事件所需的参数,警戒条件是一布尔表达式,动作表达式是该事件将被执行的动作,146,147,148,状态迁移,1. 状态迁移 引起状态迁移的原因通常有两种: 当标在迁移箭头上的

55、事件出现时会引起状态的迁移。此时,首先执行引起迁移的事件中的动作,然后迁移到新的状态,执行新状态中的内部动作(包括entry、exit、do以及用户定义的动作)。在执行do或用户定义的动作时,可以被外部的事件(将导致该状态的迁移)中断,但entry动作和exit动作是不能被中断的,并且它们总是要执行完的,149,当状态机图中相应的迁移上未指明事件时,表示当位于迁移箭头源头的状态中的内部动作(包括entry、exit、do以及用户定义的动作)全部执行完后,该状态迁移被自动触发,150,151,状态迁移的语法如下: event-name opt ( parameter-list ) opt gua

56、rd-condition opt /effect-listopt 其中: 事件名及其参数表指出触发迁移的事件,参数表的语法与“操作”中定义语法相同。 警戒条件是一个布尔表达式。如果状态迁移中既有事件特征又有警戒条件,则表示仅当这个事件发生并且警戒条件为真时才触发相应的状态迁移;如果状态迁移上只有警戒条件,则表示当该条件变为真时,触发状态迁移,152,effect-list是当该迁移触发时执行的过程表达式,即动作表达式。表达式中可引用相应对象中的属性、操作,或者事件特征中的参数。动作可以包括调用、发送和其它种类的动作。一个状态迁移上可以有多个用/符号分隔动作表达式,它们按从左到右的次序依次执行。

57、不允许有嵌套的或递归的动作表达式,153,154,事件,事件是指已发生并可能引发某种活动的一件事,类,155,状态机图之间发送的消息,状态机图之间可通过动作(如在发送子句中指明接收者)或图间的虚线箭头向其他状态机图发送消息。 当采用虚线箭头时,状态机图必须画在矩形框中。 在图间的消息箭头有两种画法: 从表示源对象的状态机图中的状态迁移上画虚线箭头到表示目标对象的状态机图的边框上; 在两个状态机图的边框间画虚线箭头,表示源对象在其执行期间的某时刻发送该消息。 在状态机图之间发送消息时,在目标对象的状态机图中应画有一个捕获这个消息的相应的迁移,156,157,组合状态,一个简单状态没有子结构,一个

58、组合状态被分解成区域,每个区域中包含一或多个直接子状态。下面给出了UML中的主要状态种类 简单状态:一个没有子结构的状态 正交状态(并发):一个被分成多个区域的状态,当该状态活跃时,每个区域中的一个直接子状态并发地活跃,158,非正交状态(非并发):一个包含一或多个直接子状态的组合状态,当该组合状态活跃时,在同一时刻组合状态中只有一个子状态是活跃的 初始状态:当嵌套状态被调用时,表示开始状态的伪状态 终结状态:一个特定的状态,它的激活表示嵌套状态已完成了活动,159,终止:一个特定的状态,它的激活将终止拥有该状态机的对象的执行 选择:一个伪状态,它实现单个运行到完成(run-to-comple

59、tion)迁移中的动态分枝,160,历史状态:一个伪状态,它的激活将还原到组合状态中先前活跃的状态 入口点:一个状态机中外部可见的伪状态,它标识作为目标的内部状态 出口点:一个状态机中外部可见的伪状态,它标识作为源的内部状态,161,非正交状态,非正交状态(非并发):一个包含一或多个直接子状态的组合状态,当该组合状态活跃时,在同一时刻组合状态中只有一个子状态是活跃的。 一个状态可以有嵌套的子状态,一个非正交的组合状态可以拥有一或多个直接子状态,当该组合状态活跃时,该组合状态在同一时刻中只有一个子状态是活跃的。例如,汽车中的变速器有中间状态、前进状态和倒退状态,前进状态又有三个排挡子状态:第一、

60、第二、第三,在任一时刻,这三个子状态同时只有一个是活动的,所以前进状态是“非正交”组合状态,162,163,如果某些对象是另一些对象的聚集对象,则这些代表“部分”对象的状态图通常是并发的,它们都是聚集对象的并发子状态。 例如“汽车”对象是“点火”、“变速器”、“刹车”、“油门”等对象的聚集对象,164,165,历史指示器,历史指示器用来记忆内部的状态,用里面标有H字母的圆圈表示。历史指示器作用于标有它的状态区域,如果指向历史指示器的迁移被触发,对象就会恢复到该状态区域先前活跃的状态。它使得对象能在活动被中断或需要逆行时回到先前活跃的那个状态。历史指示器可以有几个进入它的状态迁移,但没有离开它的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论