1、第6章 OO方法与UML,6.1面向对象开发方法概述,面向对象方法的发展简史 面向对象开发方法(OO方法)是一种用于指导软件开发的系统方法。它最早出现在挪威计算中心和奥斯陆大学共同研制的仿真语言Simula67中。80年美国Xerox研究中心推出的SmallTalk80语言使得面向对象的编程开始得到比较完整地支持。80年代中后期OO方法不断成熟,并在开发GUI应用系统和大规模信息系统等方面取得了一系列成功范例。90年代以后,OO方法开始广泛流行,并逐渐取代结构化开发方法的主流地位。,6.1.1 OO方法的基本思想,OO方法理解和构造软件系统的基本思想是: 软件系统不是由彼此独立的“数据”和“功
2、能”组成的,而是由“一起协作、相互作用以完成指定任务的对象集合” 构成的。“对象”封装了“有关的数据和功能”代表了业务领域中存在的“事物”。 软件系统中的对象通过“属性(数据成员)”说明自己的当前状态;通过“方法(成员函数)”参与业务活动并承担自己的职责;通过“消息”请求与其他对象的协作,利用他们的方法提供自己所需的服务。 “类”是对具有相同特征的对象的抽象定义,它描述了对象的内部结构(属性、方法),是用于创建实例对象的模板。OO方法提供“继承”机制,允许以层次结构来体现“一般性事物”和“较特殊事物”的共性和差异。,综上所述,面向对象方法的基本思想可以用如下等式来概括:OO = Objects
3、 (对象)+ Classes (类)+ Inheritance (继承)+ Communication with messages(消息通信),结构化方法数据与功能是分离的,功能1,输入,输出,功能2,功能3,对象把和一个事物有关的数据和功能封装为系统组成的基本单位,结构化方法 系统是功能和数据的集合 功能处理数据输入并产生输出 功能与功能之间传递数据,面向对象方法 系统是对象的集合 对象封装自身数据和功能 对象间通过消息协作,6.1.2 OO方法 VS 结构化方法,6.1.3 OO方法的优点,问题空间与解空间结构的一致性 通过对现实(业务)系统的直接模拟来构造软件系统,将现实系统中的事物直接
4、映射到软件系统中。 体系结构的独立性对象固有的封装性和信息隐藏机理保证了对象具有很强的自含性和独立性,消息通信弱化了对象之间的依赖,局部修改不会造成大范围的影响,从而使系统便于拓展、维护和进化 可复用性 对象具有较强的独立性,可复用于多个项目,同时继承机制使得子类可以自动得到父类的程序实现,有利于减少编码量,提高开发效率。 开发过程的高度连贯性 在系统分析、设计、实现等阶段始终围绕着“类和对象”进行发现和精化,核心任务和概念没有变化,便于开发工作的平滑过渡。 ,6.1.4 OOA的主要任务,OO方法也由一组用于指导系统分析(OOA)、设计(OOD)和实现(OOP)的技术集合构成。其中在面向对象
5、的分析阶段,要完成如下任务: 定义系统范围,说明系统内部要向外部的“参与者”提供哪些服务以及提供服务的方式。 定义系统的结构,确定系统内部应包含的事物(类),事物的内部结构(属性、方法)以及事物之间的静态关系。 定义系统行为,说明提供每一种系统服务的过程是由系统内哪些对象以什么样的消息通信方式协作完成的。 为上述信息建立可视化的模型,统一建模语言(Unifide Modeling Language UML)是一种绘制软件蓝图(蓝图意为一个详细的、各部分完全协调的计划或行动规划)的可视化建模语言,可用于对软件密集型系统进行可视化、详述、构造和文档化。,6.2 UML统一建模语言,6.2.1 UM
6、L的发展历程,UML产生的背景OO方法大战。80年代末对OO分析和设计技术的研究达到高潮,当时指导面向对象开发的方法论有50多种,其中比较有代表性的包括 由Grady Booch(Rational公司)提出的Booch方法 Booch是面向对象方法最早的倡导者之一 , Booch方法强调利用“宏开发”和“微开发”两个过程实现系统的演进,比较适合于指导系统的设计和构造。 由James Rumbaugh(通用电气公司)提出OMT方法 OMT引入各种独立于语言的表示符。用对象模型、动态模型、功能模型和用例模型完成对整个系统的建模,比较适用于分析和描述以数据为中心的信息系统 由Ivar Jacobso
7、n(Objectory公司)提出的OOSE方法 OOSE最大特点是以用例(Use-Case)为中心驱动开发过程, 用例是精确描述需求的重要武器, 也贯穿于对系统的测试和验证过程。OOSE比较适合支持商业工程和需求分析。,众多的开发方法论和建模技术限制了OO方法的有效应用,94年开始,在OO方法研究领域内具有领导性的三位大师( Grady Booch 、 James Rumbaugh 、 Ivar Jacobson )开始彼此从对方的方法中吸纳思想,并致力于将他们的主要工作结果进行统一化。 吸收了多种不同开发方法的优点,建立了一种适用于面向对象软件开发的,以用例驱动的、以体系结构为中心的,迭代及
8、增量的软件开发过程RUP( Rational 统一软件开发过程) 统一了不同开发方法的基本概念,定义了用以可视化表现这些概念的符号体系及语义,形成了可用于对各个开发阶段的制品进行建模的可视化建模语言UML,6.2.2 UML的特点,UML是一种定义良好、富有表达力且普遍适用的建模语言。可用于对复杂系统(包括非软件领域的系统)的静态结构、动态行为和构造实施建立可视化模型;特别适用对采用OO方法开发的软件系统进行建模。 UML是一种可以在软件开发全过程中使用的建模语言,对于需求分析、系统设计、实现等不同阶段的制品都可以采用UML进行文档化。 UML只是一种建模语言,而不是软件开发方法,也不是软件开
9、发过程。 UML更适合对采用OO方法开发的软件系统进行建模。 UML更适合用于“用例驱动的,以体系结构为中心的、迭代及增量的”软件开发过程中。,6.2.3 UML的构成三要素,UML是一种语言,一种语言的概念模型必须包括如下要素:用于信息交流的词汇表;组合词汇表中词汇的规则;运用于整个语言的公共机制。UML同样包含这三种构成要素。 基本构造块 规则 公共机制,6.2.4 UML的基本构造块,事物、关系和图是UML的三种构造块, 事物是模型中应用的元素,它代表了以不同视角和抽象程度分解系统所确定的基本成分。 关系定义了事物之间的结合形式 图聚集了一定范围内的事物及他们之间关系,对观察者表现出一个
10、有意义的整体含义。 简单的说,事物是系统的基本成分,关系使事物结合在一起,图表达了系统某个范围内的事物和关系。,(1)UML中的事物,UML包含四种事物,分别是 结构事物模型中的名词部分,说明被观察范围内,构成系统的逻辑元素或物理元素。 行为事物模型中的动词部分,说明结构事物在一段时间和空间内的动作行为。 分组事物模型中的组织部分,分组事物是一个逻辑上的集合,将有必要划分在一起的相关事物组织成一个整体。 注释事物模型中的说明部分。用以对模型中任何需要解释的其他事物进行说明。,1)结构事物,UML中定义了7种基本的结构事物 类(对象) 接口 协作 用例 主动类 构件 结点,2)行为事物,UML定
11、义了两种主要的行为事物 交互:由在特定语境中共同完成一个任务的一组对象之间交换的消息组成。 消息在UML中用一个带有名字的有向直线表示。状态机:对一个对象(或交互)在生命期内响应事件所经历的状态序列的描述。,3)分组事物,UML中“包”是最主要的分组事物,“包”将有必要被划分在一起的相关事物组织成一个“逻辑”上的整体如“子系统”。,4)注释事物,UML中“注解”是最主要的注释事物,它依附与模型中某个被说明的事物,并包含对其的解释信息。,(2)UML中的关系,系统中的“事物”不是孤立存在的,而是以某种形式结合在一起,“关系”定义了事物之间的结合形式。 UML定义了事物间的4种关系形式,并提供了相
12、应的图形符号表示,这4种关系是: 依赖 关联 泛化 实现,1)依赖关系,依赖是一种使用关系,它说明一个事物要利用其他事物来完成自身的职责,因而被依赖事物的变化将影响到依赖于它事物;但反之则未必。 依赖关系被表示为一条指向被依赖事物的有向虚线。 在代码上看,当类A的方法声明中,包含有引用类B对象的形参时,表明类A依赖类B。,2) 泛化关系,泛化是一种继承关系,表达了一般性事物和该事物中较特殊种类之间的联系。 泛化关系被表示为一端带有空心箭头的实线。箭头指向“一般性事物”(基类)。,3)实现关系,实现关系是一种约定关系。即一个事物对外公开了一组由另一个事物保证执行的契约。 例如C+中,实现文件CV
13、iew.cpp实现了由对应头文件CView.h对外公开的契约。 实现关系在语义上是依赖和泛化关系的交叉,被表示为一端带有空心箭头的虚线。指向公开契约的事物(头文件)。 在UML模型中,有两种情况可能使用到实现关系 用于表示一个接口和实现该接口的类或构件之间的联系。 用于表示一个用例和实现该用例的协作之间的联系。,4) 关联关系,关联是事物间结构关系,关联表示了事物间存在的连接,从而确保事物可以相互协作。从对象的语境看,关联被实例化为对象间进行消息通信的“链”。 简单关联说明两个事物间可以相互导航。用直线表示。 当需要表达事物间“整体/部分”的结构关系时,可以使用特殊的关联形式 聚合:“整体”包
14、含了对“部分”的引用;“部分”可以单独存在,表示为“整体”端带有空心菱形。 组合:“整体”包含了对“部分”的值;“部分”不可以脱离整体单独存在,表示为“整体”端带有实心菱形。,关联的修饰,名字:关联可以被命名,用以描述该关系的性质和含义。角色:可以为关联的事物命名角色,角色名是关联中靠近它一端的事物对另一端的事物呈现的职责。多重性: 关联的事物可以被指定多重性,用以描述关联另一端的一个事物实例,本端要求的实例数量。,(3) UML中的图,“图”通过在语法规则内组合有关的事物和关系,完整地表现出系统某一范围内使观察者感兴趣的特征信息。 因为没有那个复杂系统可以从一个角度理解其全局,所以UML定义
15、了多种图,分别用于在不同的开发阶段 “观察”目标系统的各个方面。,UML的9种图,包图: 包中的类以及包与包之间的关系(静态图),UML的9种图可以简单地划分为两类 静态图表现系统的静态结构 类图、对象图、构件图、实施图 动态图表现系统的行为特征 用例图、协作图、顺序图、活动图、状态图也可根据观测系统的不同视角,将9种图详细的分为5类视图。 结构视图(类图、对象图) 用于在分析和设计阶段观察系统由哪些“逻辑元素” 构成 物理视图(构件图、实施图) 用于在实现和发布阶段观察系统由哪些“物理元素” 构成 用户视图(用例图) 用于对从用户的角度所能观察到的系统服务集建模。 行为视图(活动图、状态图)
16、 对系统运行的控制流程和对象状态随事件序列发生的变化建模。 交互视图(协作图、顺序图) 表现系统运行过程中有关对象间的消息通信和协作过程。,1) UML中图的分类,用例图主要用于创建用户视图,表现系统提供的服务集合,并指出使用这些系统服务的用户角色。,购买商品,登录,退货,收款员,POS系统,顾客,启动/关闭,管理用户,其他,管理员,系统管理员,2) 用户视图,结构视图关注于系统的逻辑组成结构,类图、对象图和包图用于创建结构视图 类图展示系统中包含的类、类的属性、方法、以及类之间的关系。 对象图是类图的实例化,它主要用于表现在特定时刻系统中包含的对象实例,对象的当前状态(属性值)以及对象之间的
17、“链” 包是一种组合机制,包将有关的元素组织成一个整体。包图也用于描述系统的逻辑结构,表示包与包之间的关系。,3) 结构视图,类图举例,对象图举例,包图举例,行为视图关注于目标系统的动态行为特征,通常使用活动图和状态图进行表现。 状态图用于对一个对象(或交互)在生命期内响应事件所经历的状态序列进行描述。 活动图在本质上是一种流程图,显示一组连续执行的活动间的控制流。,4) 行为视图,活动图和状态图举例,交互视图关注的是:在提供系统服务的过程中,有关对象如何进行协作和消息交换。交互视图的主要通过顺序图和协作图进行表现。 顺序图显示对象之间的动态合作过程,强调消息序列的时间顺序 协作图与顺序图同构
18、(可以相互转换), 也表达对象间的动态协作过程,但注重表达对象间的联系。,5) 交互视图,顺序图举例,协作图举例,物理视图关注于软件系统自身的实现结构(例如软件包含哪些可执行组件,将来被配置在哪些运行结点上),使用构件图和实施图建模 构件图表现出目标系统由哪些“构件” (可执行文件、动态链接库)组成,以及构件的相互关系 实施图定义系统配置结点(计算机、外设)的物理体系结构,结点之间的连接关系,以及各个结点包含的可执行构件。,6) 物理视图,构件图举例,实施图举例,7)4+1视图,不同的视图代表了从不同角度对系统的观察结果。但5种视图之间并不是一种平行的关系。用例视图从用户角度对软件需求进行建模
19、,是产生其他视图模型的基础。,UML是一种可以应用于面向对象软件开发全程的建模语言,在系统分析阶段经常使用如下UML图对“需求”和系统分析的结果进行建模 用例图 活动图 类图/对象图 顺序/协作图 状态图,6.2.5 UML在OOA阶段的应用,(1) 用例图,用例图可以用于表示从用户角度上可以发现和使用的系统服务,通常在用例图中还标注出系统边界。 用例图是对软件需求的直接建模。 用例图中的主要事物用例 代表系统向外部用户提供的一个完整服务单元。用户在特定场景下使用这种服务,并获得一个可见的服务结果。 参与者 执行用例的用户角色。,用例,参与者,1)用例图中的关系,参与者与用例之间的关系 关联
20、参与者之间的关系 泛化关系:“管理员是特殊的操作员” 依赖关系:“操作员在借书时用手持扫描设备扫描图书条码” 用例与用例之间的关系 泛化关系:“系统登录分为外网用户登录和本网用户登录” 依赖的转义“包含” 、“拓展” 包含关系Include :基础用例的执行必然激活其他用例,指向被包含的用例。 拓展关系Extend :基础用例有条件地激活其他用例,指向基础用例。,(2) 类图,类图是在面向对象的系统模型中使用得最普遍的图。类图包含了一组类、接口和协作以及他们之间的关系 类图所传达的信息包括 在所观察的范围内包含的类 类的成员及可见性:属性、方法 类之间的关系,UML中类表示为一个被分隔成三栏的
21、矩形框 第一栏:类名 第二栏:属性集合 第三栏:方法集合属性和方法的可见性可以通过特定符号表示 Public: + Private: Protect: #特定的建模工具可能采用不同的图标进行表示,1) 类的表示,2) 类图中的关系,在类图中可以对类之间的关系进行可视化表示,常见的关系形式有 泛化:基类与子类的关系 关联:需要彼此“连接”的类之间的关系。 聚合:整体类对部分类的引用包含 组合:整体类对部分类的值包含 依赖:类之间的使用关系,一个类的方法中包含有对其他类对象的引用。,3)从程序实现角度理解关系,关联关系(简单关联1:1),Class person private char name
22、20;char sex;int age;pet *p;car *c;public void IncAge(); char* GetName();void SetName(char *NewName),Class pet private: char name20;char color4;person *ownerpublic:void chgNm(char *c ); ,聚合、组合,Class family privateperson* member; ;,Class moto ;Class car privatemoto m;person* owner ,泛化关系(单继承) 依赖关系,Clas
23、s Dog: public pet public:void bark();; Class Cat: public pet public:void miaow();; ,Class Teacher: public Person public:void teach(CourseWare CAI);; Class CourseWare public:Person* author;int hours; ,(3) 对象图,对象是类的实例,在UML中一般将对象表示成2栏的矩形 名称栏:说明对象的名字及所属类,名称栏的内容带有下划线 属性栏:说明对象属性的当前值。 对象的方法被定义在类的语境中,一般不再对象
24、图中显式表示。,对象图,对象图用于表达在某个特定时刻,系统内实例对象的具体状态(属性值)和与其他对象的当前连接。,(4) 顺序图、协作图,交互视图描述了执行系统功能的各个对象之间相互传递消息的协作关系。交互视图可以用顺序图和协作图进行表示。 通过顺序图和协作图,可以表示出 参与协作的对象 对象间的消息通信 消息通信的时序 顺序图和协作图可以相互转化,但二者强调的重点不同。 顺序图强调表现消息交换的时间次序 协作图强调表现对象之间的结构关系。,1)顺序图,顺序图一般包括 参与者和对象:在图的顶部沿X轴排列 对象生命线:对象下面垂直的一条虚线,表示该对象在一段时间内存在 对象激活框:对象生命线上的
25、矩形,表示对象在该段时间处于活动状态并参与协作。 消息:连接对象激活框的有向边,指向响应消息的对象,一般要给出响应消息对象的方法型构 顺序图的Y轴代表时间轴,消息通信和对象激活的时序可以通过水平高度表达。 若对象在协作过程中被析构,可以在其生命线的对应位置画“X”,2)协作图,协作图一般包括 参与协作过程的对象 链:连接协作对象的直线,是对象进行消息传递的“渠道”。“链”是类图中关联关系的实例化。 消息:标号方法型构,标号用以表达时序。 协作图和顺序图能够传达相同的信息含义,二者可以转化。 教材作者(Leszek A)认为:顺序图用于分析阶段、协作图用于设计阶段比较合适,(5)状态图,状态图用
26、于对单个对象在其生命周期内响应事件所经历的状态变化序列建模 在状态图中主要由如下元素构成 状态:代表对象可能处于的一种工作模式。 初态、终态:整个变换序列的开始和结束。 子状态:复杂状态内部嵌套的状态。 转换:代表由事件导致的对象状态之间的迁移 源状态:转换前的状态 事件:导致转换的事件名 监视值:导致转换发生所需满足的条件 动作:转换过程中的行为 目标状态:转换后进入的新状态,(6)活动图,活动图用于对一组活动的执行流程进行建模。可以将活动图看成是一种流程图。 活动图是状态图的变体 活动可以被视为不可停留的“瞬时状态” 活动间的控制流可被视为“瞬时状态”间的无触发条件的转换。 活动图中的主要元素: 初态、终态:流程的开始和结束 活动状态/动作状态:可分解/不可分解的活动 转换:活动间的控制流 分支:表明要根据判定条件选择某一个转换路径 并发/结合:表明一组活动的并发和同步(并发结束) 泳道:用于将相关活动分组,活动图的基本符号,用活动图对访谈过程建模,