UML面向对象建模与设计——笔记(一)

UML主要是参考UML面向对象建模与设计(第二版)做的笔记。

这里涉及到UML建模的图,这里就用visio来现学现卖了。中间顺带插入一些用visio对应的操作。


visio绘制UML基本

1>.打开visio

2>.在模板类别中选择“软件和数据库”-选择”UML模型图”

3>.创建

创建完成后,左侧默认有导航,可以添加。
这里写图片描述


一.OO设计

1. OO设计的方法论(开发的阶段)

1>.系统构思

构思应用,并阐释临时需求。

2>.分析

和请求这一起理解问题,分析系统构思时的具体需求,清楚目标。
分析模型有两部分,领域模型,描述系统每部反应的真实世界的对象;应用模型,描述用户可见的应用系统本身的组成部分。
简单说:就是能够以让请求者明白的系统概念展现系统的模型,或者操作执行过程的模型,来达到保证需求正确的要求。

3>.系统设计

设计高级策略——系统架构。同时制定政策(??),充当后面更加详细设计的内容的默认选项。这个过程中确定一些关键的设计的解决方案。

4>.类的设计

配合系统设计策略,类的设计人员要给分析模型添加细节。类的设计的焦点在事先每个类的数据结构和算法。

5>.实现

2.三种模型(系统的视图)

三种模型是分别独立,但有相互交叉连接的。不同的模型有着有限而清晰的连接;好的设计会隔离系统的不同层面,限制它们的耦合。典型的软件合并了三种模型:它使用数据结构(类模型),按时间设定操作顺序(状态模型),并在对象间传递数据和控制(交互模型)。每种模型包含了对其他模型中的实体的引用。

1>.类模型

描述了系统内部对象及其关系的静态结构(属性,操作,关系,标识)。类模型界定了软件开发的上下文——论域。类模型包含类图。
类图的结点是类,弧表示类间的关系。

2>.状态模型

描述了对象随着时间发生变化的方面。状态模型使用状态图确定并实现控制。状态模型使用状态图确定并实现控制。
状态图的节点是状态,弧是由事件引发的状态间的转移。

3>.交互模型

描述了系统中的对象如何协作以完成更为宽泛的任务。交互模型自用例开始,用例随后会有顺序和活动图详细描述。
用例描述系统和外部参与这之间的交互的主要内容;顺序图显示交互对象以及发生的时间顺序;活动图描述重要的处理步骤。


二.类建模

1.类图

类名描述了拥有相同特性(属性),行为(操作),关系种别以及予以的一组对象。

1>.类图和对象图

我们可以通过两种结构模型——类图和对象图,来描述。

类图提供了对及其关系进行建模的一种图形化的表示法。

类的UML表示方法:一个方框,约定黑体表示类,把名字放在方框正中,大写首字母,单数名词表示。

在visio中可以选择UML静态结构——类拖入,拖入如下图:
这里写图片描述
这里写图片描述

对象图显示了单独的对象及其关系。

对象的UML表示方法是:一个方框,方框里是对象名后跟着一个冒号和类名。对象名和类名都有下划线,我们约定使用黑体表示对象名和类名。

在visio中可以选择UML静态结构——对象拖入,拖入,双击可更改对象的属性。名称为对象名称,类是对象的类型(这里用了前面创建的类),因为现在类中没有属性,所以特征值目前为空。
这里写图片描述

2>.值和属性

值是一段数据;属性是类的一个别名特性,他描述了类的每个对象都拥有的一个值。

属性的表示:UML表示法会在类图方框的第二格里列举属性。每个属性后都可以有(不是必要条件)可选项,如类型和默认值。在类型之前有个冒号。在默认值之前有个等号。约定用常规字体显示属性名,方框中的名称左对齐,首字母用小写。

属性的多重性:属性的多重性为属性的每个实例确定可能取值的数目。最常用的规范是强制单值[1],可选单值[0..1]以及多值[*]。多重性确定属性是强制的还是可选择的。多重性也可以指明属性是单个值还是集合。

在对象图的第二个里也可能会会包含属性值,其表示方法就是列出每个属性名,后跟等号和取值。
*注意:有些实现媒体要求对象有唯一一个标识符,不应该显式地把它们列举出来。

修改类的属性:双击类,然后选择特性进行添加。完成后出现在类方框的第二格中。
这里写图片描述
这里写图片描述

这时候对象也被添加了属性和值,可以通过双击-特性值来改值。

这里写图片描述

3>.操作和方法

操作是一个函数或者过程,可以用于类中的对象或别对象使用。

方法是类操作中的实现(多态特性)。

特性是描述属性或者操作的类属词汇。即包括了属性和操作。(这点和VISIO上显示的不太一致,VISIO上特性是这里对应的属性,操作就是操作,没有包含关系。)

操作的表示:在类图的第三个格里列举,约定用常规字体中列列出操作名称并左对齐,首字母小写。每个操作名后可以跟着一些可选项,例如参数列表和结果类型。用括号将参数列表括起来,并用逗号分隔参数,括号中空的参数列表显示表示没有参数。格式如下:

 direction argumentName:type = defaultValue

操作返回结果类型用一个冒号+类型表示。

修改类的操作:双击类,然后选择操作进行添加动作。如果需要增加形参,可以点击右侧的属性(画圈处),选择参数进行添加,完成后出现在类方框的第三格中。

这里写图片描述
这里写图片描述

4>.作用域

作用域是表示一个特征是否可用于对象或类。下划线用于区分类作用域(静态)和对象作用于的特征。约定分别在属性和操作方框的顶部列出类作用域的属性和操作。

5>.可见性

可见性是指方法引用其他类的特征能力,取值包括public,protected,private,package(在同一个包中作为目标类定义的类的方法可以访问包)。
可见性的表示:
public在特性前面“+”,protected在特性前面“#”,private在特性前面“-”,package在特性前面“~”。如果没有前缀,就表明没有可见信息。

2.链接和关联

这里涉及到了多个对象或者是类。

链接(对象概念上的)是对象之间物理上或者概念上的连接。

链接表示方法:对象间的一条直线(直线可以由几条线段组成)。

关联(类概念上的)描述了有着共同的结构和语义的一组链接。这里说一组连接可能(??)是因为类的对象可以有多个,但他们的关联是相同的,但链接是独立的。和后面的”is-a”相对,这里是”has-a”的概念。

关联表示方法:类间的一条直线(直线可以由几条线段组成)。约定用斜线显示链接和关联名(可选),将线段限制在直线格中。最好是从左到右安排关联中的类。
注:关联名称是可选的,如果有多重关联是就必须要用关联名或者关联终端名来消除歧义。

引用是在一个对象中引用另一个对象的属性。在编程中通常作为关联的实现方式。

多重性指定了一个类与关联类的单个实例可能相关的实例数目。如图所示:UML图明确的在关联先的两端列出了多重性,并且用区间表示:“1”表示刚好为1,,1..”表示1或更多,“3..5”表示3-5;“ ”表示速记符,表示“多”。

多重假设以及如何定义边界的问题,可能会随着需求改变。开发时,应该先确定雷和关联,再确定多重性。

关联终端名在问题描述中常以名词形式出现。对于一个类的两个对象之间的关联来说是必须的。

通过关联终端名可以统一对同一个类的多重引用。在创建类图是应该正确使用关联端名,不应该为每个引用引入一个独立的类。关联终端名可以区分对象,所以附在一个类上的关联远端的所有名称都必须是唯一的。名字可以消除对类的多次引用可能产生的歧义并促进导航。对于同一个类的两个对象之间的关联来说,关联名是必须的。

排序排序是关联固有部分,可以通过在适当的关联终端旁边标上“{ordered}”来表示一个有序的对象集合

是允许重复值的元素,序列是允许重复值的有序元素集合。这个标注是针对对象而言,对对象图进行约束。

关联类是一种关联,也是一个类,可以使用属性来描述关联的链接。理解起来就像把一组关联相关属性的合并组织成一个类,使用一个关联来连接类。这里详见书本:有种很重要解除耦合的方式。

关联类的表示:通过虚线连接依附与关联的一个方框(类图)。
这里写图片描述

多对多的关联为关联类提供了一种强制性的基础,此类关联的属性明确属于链接,不能归于某个类。

限定关联中被称为限定符的属性会消除关联多端的对象的歧义,可以将关联的有效多重性降为一对一。

为两个类建立一个简单的关联,可以用visio中的二元关联,连接到2个类。双击后可修改关联名,关联终端名,多重性等。对于排序,包和序列之类的目前不知道哪里标注。

这里写图片描述
这里写图片描述

对象之间选用链接连接即可。
这里写图片描述

n元关联:大多数n元关联可以分解成带限定符的属性和二元关联,并且常见的编程语言不能表示n元关联,所以要尽量避免n元关联。

n元关联的表示:UML符是以直线连接相关类的一个菱形。如果关联有名字,可以用斜体写在菱形旁边。

聚合:聚合是一种强类型的关联(特殊的关联),其中一个聚类对象由多个部件构成。聚合可以定义成装配件类与某个部件类相关联的一种关系。带有多种装配件,对应于许多个聚合。聚合最重要的特性是传递性,同时聚合也是反对称的。
聚合包括下面这些内容:材料单,结构分解和吧对象拓展成零部件。
聚合的表示方法:用小菱形指示装配件终端以外,聚合的绘制方法和关联一样。
这里写图片描述

组合:UML有两种部分-整体关系:普通形式成为聚合,更多限制的形式成为组合。组合是某种形式的聚合,有两个额外的约束。一个部件至多隶属于一个装配件。而且,一个部件一旦被指定给一个装配件,它就会与装配件有着相同的生存期。因此,组合意味着整体拥有其各个部分。
组合的表示方法:在装配件类旁边绘制一个小的实心菱形。
这里写图片描述

3.泛化和继承

泛化是指类(父类)与其一个或多个变体(子类)之间的关系。利用类的相似性和差异来组织类,同时描述对象的结构。父类拥有公共属性,操作和关联。子类增加了特定的属性,操作和关联。每个子类继承了父类的特征,并且可以有多层继承。泛化有时被成为”is-a”的关系。

泛化集名称是一个枚举属性,标明了某一特性的泛化抽象了对象的某个方面。

泛化的表示:大的中空箭头表示。箭头指向父类,另一头和子类连起来。最好将父类放在顶部,底部绘制子类。

*花括号表示UML的注释,指出还有子列在图中没有标注出来。

这里画书上的几何图形的继承来举例子。VISIO中的继承就是归纳,看图标。
这里写图片描述

抽象类:抽象类是指没有直接实例的类,但其子类有直接的实例。
抽象类的表示方法:抽象类类名用斜体表示。也可以在名称的下面或者后面放置关键词{abstract}。

多重继承:多重继承允许某个类有一个以上的父类,并继承所有父类的特征。他的优点是在识别类的增加复用上会更具有效力,缺点是失去了概念上和实现上的简洁性。

4.类模型导航

导航可以训练模型,揭示隐藏的缺陷和疏忽。可以通过手动导航或者编写导航表达式。

OCL(对象约束语言):UML合并的一门语言,可以在类模型中遍历制品(??),根据OCL的约束条件得到想要的结果。

5.枚举

数据类型是对值的一种描述。数据类型包括数字,字符串,枚举。枚举是由有限取值合集组成的一种数据类型。
枚举的表示:
枚举是一种数据类型,在方框的顶部枚举命长上面的《》中列举出关键字enumeration,就可以声明枚举。第二格中列举枚举值。
VISIO的枚举需要在数据类型中选择,然后把它的构造器改为enumeration。
这里写图片描述
这里写图片描述

6.元数据

元数据是描述其他数据的数据。例如,类定义就是元数据。模型是股友的元数据,因为模型描述被建模的内容。把类看做对象,但类是元对象,而不是真实世界中的对象。类描述符对象具有特点,并且反过来它们也有自己的类,被称为元类。

7.约束

约束是涉及模型元素的一种布尔条件。这些元素包括对象,类,属性,链接,关系和泛化集等。约束限制了元素可以假定的取值。可以用自然语言或者想对象约束语言(OCL)这样来表达约束。


三.状态模型

状态模型是描述响应外部激励而发生的操作序列。状态模型有多个状态图组成,每个类对应一个状态图,描述对应用程序而言的重要的时序行为。

状态图用有限状态机的图形表示法,联系起事件和状态事件表示外部激励,状态表示对象的取值。

1.事件

事件是指在某个时刻发生的事情。事件包括错误事件和普通事件。

几种常见类型的事件:

1>.信号事件

信号是从一个对象到另一个对象的明确单向信息流动。
信号事件指发送或接收信号的事件。每次信号传输都是唯一时间,会把它们组织成信号类,并赋予每个信号类一个名字,表示公共的结构和行为。

信号类的表示方法:在方框的顶部加<>,第二格中列举信号的属性。

这里写图片描述

2>.变更事件

变更事件是指满足布尔表达式而引起的事件。变更事件的意图是要不断测试表达式——无论何时只要表达式由假变真,事件就会发生。

变更事件的表示方式:采用关键词when,后跟着用括号括起的表达式。

3>.时间事件

时间事件是指在绝对时间上或者某个时间间隔内发生的事情所引起的事件。

时间事件的表示方法:++绝对时间++使用关键词when,后跟着用括号括起的包含时间的表达式。++时间段++的表示法采用关键字after,后面跟括号括起的时间间隔的表达式。

2.状态

状态是对象取值和链接的抽象。根据对象的总体行为,将取值和连接的集合组成一个状态。

状态的表示方法:包括可选状态名的圆角方框,约定使用黑体在圆角方框内列出状态名,首字母大写,同时状态经常对应着带有后缀“ing”。

这里写图片描述

类中的状态拥有有限数量的可能状态,对于每个状态来说,某个时刻只能存在一个状态。状态确定对输入事件的响应。

迁移指从一个状态到另一个状态的瞬时变化。从原状态到目标状态一发生变化,就说是触发了迁移。

警戒条件指为了要让迁移发生而必须为真的布尔表达式。在状态变成真之后,迁移就不会触发。注意:警戒条件仅触发一次,变化时间实际上要连续检查的。

迁移的表示方法:从初始状态到目标状态的一条直线。箭头指向目标状态。事件可以标记迁移,后面分着放在方括号里的可选的警戒条件。约定会把斜线段限制在直线网格内。我们会用斜体表示事件名,普通字体显示状态。

3.状态图

状态图说明了有事件序列引起的状态序列;结点是状态,有向弧是状态间的迁移。类中的所有对象都执行该类的状态图,状态图会建模对象的公共行为。

状态图的表示方法:用矩形框围住,并在左上角的小五边形里列出图的名称。

状态模型包含了多个状态图,每个类一个状态图,状态图的建模重要的时序行为。状态图必须匹配他们的接口——事件和警戒条件。

单触发状态图表示有限生存期的对象,有初始状态和终止状态。

表示方法:实心圆表示默认初始状态;靶心表示默认终止状态。也可以用进入和退出点表明初始和终止状态。

4.状态图行为

1>.活动效应

效应是对为响应是按而执行的行为的引用。活动是由效应触发的实际行为,可以表示内部控制操作。活动的执行条件包括:迁移,进入或退出某状态以及收到状态内的其他事件。

活动的表示方法:用 / 和活动名称(或描述),跟在引起活动的时间后面。关键词do来表示正在进行的活动,不能用作时间名称。

2>.do活动

do活动指持续了一段时间的一项活动,只在某状态内出现,不能附到迁移上。

表示方法:”do /”表示对象处于在某种状态下的全部或者部分持续时间内执行的do活动。do活动会被在执行过程中收到的某时间中断,此时间可能会,也可能不会引起迁移,离开包括do的活动状态。

3>.进入和退出活动

进入活动的标识方法:在状态框内显示关键词entry和字符 “/” 。
无论何时只要有到达迁移进入某状态,进入活动就会执行。进入活动等同于把活动链接到每个到达的迁移上,如果到达迁移已经有一项活动,就会优先执行此活动。

退出活动的表示方法:在状态框内显示关键词exit和字符 “/”。
无论何时只要输出迁移引起状态退出,就会先执行退出活动。

如果某状态存在多个活动,按一下顺序执行:到达迁移上的活动,进入活动,do活动,退出活动,退出迁移活动。只有自迁移会引起进入和退出活动的执行(???)。

4>.完成迁移

当活动完成时,会触发到另一状态的迁移。如果箭头上不带时间名,表示自动迁移,当于源状态相关的活动完成时就会触发,这样未标记的迁移成为完成迁移

注:不要在完成迁移上使用警戒条件来对待取值变化的事件进行建模,要把等待建模成变化事件。

5>.发送信号

对象可以给另一个对象发送信号。对象系统通过交换信号进行交互。如果一个对象从多个对象收到信号,并发的信号接收顺序也会影响最终的状态,称为竞争状态条件。


四.交互模型

交互模型是用来描述系统内部的交互,是跨越了许多对象的整体行为视图;类模型描述系统中的对象及其关系;状态模型描述对象的生存期,是简化的行为视图,它独立检测每个对象为完整的描述行为。

交互模型在3个不同的抽象层次上进行建模,分别是:用例模型,顺序模型,活动模型。

1.用例模型

用例模型描述系统如何与外部参与者交互。每个用例表示系统提供给其用户的一段功能。对于捕获非形式化的需求来说很有用。

参与者是系统的直接外部用户——直接与系统通信的一个对象或一组对象,但不是系统的一部分。建模参与者有助于定义系统,识别系统内部及其边界上的对象。

用例是系统通过与参与者的交互可以提供的一段连贯的功能。每个用例都会涉及一个或多个参与者以及系统本身。

用例涉及系统和参与者之间的消息序列。对于消息序列的制定,一般先定义主线行为序列,在定义可选的子序列,重复以及其他变体。错误条件也是用例的一部分。用例把一部分系统功能相关的所有行为组合在一起,包括普通主线行为,普通行为的变体,异常条件,错误条件和取消请求。

用例图包括一组用例和一组参与者。每个用例表示系统提供的一段功能。

用例图的表示:矩形包含了系统的用例,参与者列在矩形的外面。系统的名称可以写在矩形的某条边的附近。椭圆的名称表示用例,火柴人表示参与者,实现连接用例与参与者。

在visio中可以选择UML用例拖入。
这里写图片描述

这里写图片描述

用例模型的准则:
1>.确定系统边界。
2>.确保关注参与者。每个参与者都应该有单一的,一致的目的。如果有多可目的,可以拆分成多个参与者。
3>.每个用例都必须给用户提供价值。用例应该表示成提供给用户提供价值的而完整事务。
4>.关联用例和参与者。每个用例都至少有一个参与者,每个参与者都会至少参加一个用例。
5>.用例是非形式化的。从以用户为中心的角度来识别和组织系统功能。
6>.用例可以结构化。

2.顺序模型

顺序模型详细描述用例的主题,并显示一组对象间随着时间变化所交换的消息。消息包括异步信号和过程调用。顺序模型擅长显示系统用户所观察到的行为顺序。

顺序模型有两种:场景和顺序图。顺序图具有更加结构化的形式。

1>.场景

场景是指系统在某个特定的执行期内所发送的一系列事件,如用例。场景的范围可以变化,可以包括系统中所有事件,或者只包括与某些对象有密切联系或由这些对象生成的那些事件。场景可以是执行一个实际系统的历史记录,或者是执行拟采用系统的预想试验。

场景可以表示为一列文本。

场景的表达可分为高层和详细。在一开始可以用高层交互来表达整体流程,到后期,可以对整体流程进行细化。

场景包含对象间的消息以及对象所执行的活动。每条消息把信息从一个对象传到另一个对象。编写场景的第一步是识别那些交换消息的对象,然后必须确定没条消息的发送者和接收者,以及消息的顺序。最后,当场景转换成代码时,要为内部计算添加活动。

2>.顺序图

顺序图显示了交互的参与者以及参与者之间的消息序列,也显示了系统为了执行全部或部分用例而与其参与者的交互。

顺序图的表示:每个参与者以及系统都用一条垂直的生命线表示。每条消息从发送方指向接收方的水平箭头表示;时间从上往下延伸(间距不相关)。

这里写图片描述
这里写图片描述

每个用例需要一张或多张顺序图来描述其行为。每张顺序图显示用例的一个特定行为序列。我们也应该为用例内部的每种异常条件绘制一张顺序图。

3>.顺序模型的准则:

(1).至少为每个用例编写一种场景图。
(2).把场景抽象成顺序图。
(3).划分复杂的交互。把大型交互划分为各组成的任务,并为每个任务绘制一张顺序图。
(4).为每种错误条件绘制一张顺序图。

3.活动模型

活动模型提供了更多细节,显示了组成复杂过程的步骤序列。显示某次计算机中处理步骤间的控制流,注重于操作还不是对象,也可以显示数据流。活动图在设计算法和工作流的早期阶段最为有用。

活动图的表示:拉长的椭圆表示活动,箭头表示活动顺序。菱形表示决策点,粗线条表示并发线程的分流和合并。如果某个活动有一个以上的后继,那么每个箭头上可以用带着方括号的条件标记。带有输出箭头的实行圆表示活动图的起点;靶心(空心圆围绕的实心圆)表示终点。

活动图很像传统流程图,但与传统的流程图不同,活动图可以同时显示顺序和并发的控制流(特别是对分布式系统)。活动图的目标是显示复杂过程内部各个步骤以及他们之间的顺序约束。活动可以分解为更更细的活动,这和画流程图一样。

注:如果分支没有条件没条件被满足,系统则会被挂起,为了避免这种危险,可以使用else条件来解决。

活动模型的准则:
1>.不要误用活动图。
2>.让图保持平衡。
3>.注意分支和条件。
4>.考虑使用可执行的活动图。


  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值