学习 UML
的目的是帮助我进行需求分析,CRUD
谁都会写,那是建立在数据库和业务需求都明确的基础之上的,所以这些基本功还是要掌握的。
不需要掌握复杂的 UML 语法,更多的是要去理解 面向对象
的分析方法,这可以提高需求分析能力。
文章目录
一、总览 UML
UML
有很多种图,可分为 2
类:
- 结构型:
- 类图
- 对象图
- 组件图
- 部署图
- 包图
- 行为型:
- 活动图
- 状态图
- 顺序图
- 协作图
- 用例图
- 结构型的图描述的是某种静态结构,它在一段时间内是稳定的,是不会变化的。
- 行为型的图恰恰相反,它描述的是某种行为,是动态的。
1、结构型 UML
1.1、类图(静态建模)
关于类图的介绍请看这篇文章,这里不再赘述。https://blog.csdn.net/weixin_43941364/article/details/109399805
类图描述的是一种静态关系,在系统的整个生命周期中都是有效的。
1.2、对象图
对象图只有在开发软件的时候才会用到,对象是类的实例化,同样的,对象图就相当于类图的实例化。
就是给类的各个属性赋值,它是类图在某一时刻的实例。
1.3、组件图(构件图)
组件图也叫作构件图,一部手机有各种硬件设备组成,同样的一个软件也是由很多个物理部分组成,组件图就是描述软件内部物理组成的一种图。
例如某一权限组件设计图:
右上角的标志表示这是一个组件,组件可以再包含组件。
构件有接口:
上图就是说,组件 1 需要组件 0 的服务。
组件图的使用场景:待开发的系统需要与第三方系统或者老系统交互时可以使用。
组件图常和部署图一起使用。
1.4、部署图
部署图描述系统如何部署的,描述本系统和其他系统之间是什么关系。
图中一个立方体表示一个节点,一个节点表示一个物理设备,节点之间的线条表示节点之间的物理连接关系。
部署图和构件图的捆绑使用:
1.5、包图
Package
就是打包的意思,包图的作用是打包类图,可以将某些类放入包中,通过包图来组织业务概念图。
同时还可以将用例放入包中。
2、行为型 UML
对象的状态模型用状态图和活动图进行描述,对象的交互模型用顺序图和协作图描述。
2.1、状态图
状态图实质上是一种由 状态、转移、事件和动作
组成的状态机,用于描述从状态到状态的控制流。
这是一个基本的状态图,有 初始状态
、终止状态
、状态
、转移
和 判定
等。
- 初始状态:一个图中只能有一个;
- 终止状态:一个图中可以有多个;
- 状态:又称简单状态,上面的部分是状态名,下面的部分是动作,分为
入口动作
,出口动作
和do动作
,执行时间是前、后、中;事件与动作之间用/
分隔。 - 转移:带箭头的直线表示,直线上可以写
事件[监护条件]/动作
,满足条件将会执行相应的动作。 - 判定:用空心菱形表示,它按照
监护条件
的取值发生分支,监护条件是布尔表达式。
如何确定状态?
对象的任何一个属性值都是一个状态,但并不是所有的状态都是需要关注的,只需要关注那些
明显影响
对象行为 的属性值对应的状态。
除此之外还有 子状态
,子状态分为:
-
顺序子状态:自状态不能同时执行,比如汽车无法同时前进和后退;
-
并发子状态:子状态可以同时执行,比如汽车可以低速前进,高速前进,低速后退,高速后退;
历史指示器 表示可以快速回到之前的状态,分为浅历史指示器和深历史指示器。
二者的区别在于,浅历史指示器
只能恢复与他同级的状态,而且转移不必从它转出:
而深历史指示器可以记录更深层级的状态,但是转移必须从它转出:
转移
转移指两个状态之间的关系,表示在第一个状态执行一定的动作之后,满足特定的条件会进入到第二个状态。当状态间发生转移时,称该状态转移被激活。
转移的语法格式如下:
转移名:触发事件名(参数列表)[监护条件] / 动作列表
- 触发事件
- 监护条件:他是一个布尔表达式,可以根据条件将原状态转移到不同的目标状态;
- 动作:包括给另一个对象发送消息、操作调用、创建和销毁对象等。
转移分为外部转移、自转移、内部转移、复合转移 4 种。
外部转移 就是我们最常见的一种:
自转移,自转移的原状态和目标状态是同一个,他会打断当前状态下的所有活动,使对象重新开始。
内部转移:只有一个原状态,没有目标状态,它转移后的状态还是它本身,就相当于没有转移。
内部转移和自转移的区别是自转移需要执行入口动作和出口动作,而内部转移不用执行。
复合转移:复合转移由 判定
、 并发分叉
和 并发接合
等组成。
多条件的分支判定可以分为链式结构和非链式结构两种。
链式结构:
非链式结构:
动作
- entry:入口动作,指定进入状态时执行的操作;
- exit:出口动作,指定状态被另一个状态取代,退出状态时执行的操作;
- do:指定处于某种状态时发生的活动;
- include:引用子状态机的状态,语法是:
include 子状态机名
; - event:当特定事件触发时,指定响应动作的执行,语法是
event事件名(参数表)[监护条件]/动作名
;
使用状态图进行建模时,可以参考以下步骤:
- 识别一个需要进行建模的实体;
- 对状态建模:确定对象可能存在的状态;
- 对事件建模:确定能引起状态转移的事件;
- 对动作建模:确定转移激活时执行的动作;
- 对建模结果精化细化;
2.2、活动图
活动图本质上就是一种流程图,他是流程图的升级版,它描述活动的序列,从一个活动到另一个活动的控制流。
在图形上,活动图由 节点(Node)
和 边(Edge)
组成:
- 活动节点:
- 动作
- 判定与合并
- 分岔与汇合
- 起点和终点
- 活动边:
- 控制流
- 对象流
下面是一个简单活动图:
活动是一个整体概念,活动图是由各种动作组成的。
很多元素和状态图一直,这里不再赘述。
控制流
控制流表示两个活动节点之间的转移,就是图中的那个箭头,与状态图不同,他不需要事件的触发,一个动作结束之后会立即转移到下一个节点。
判定与合并
判定就是空心菱形,表示选择,下图是最经典的使用方式:
合并是一种和判定相对立的控制节点,它的特点是流入有多个,流出只有一个:
分岔与汇合
为了处理 并发
操作,引入分岔汇合。
活动图中的并发行为是通过分岔来表示的,当这个节点前面的动作结束之后,一旦流入这个结点,就意味着它的每个流出的边所指的动作都可以执行了,他们的执行时并发的,可以同时执行。
与分岔相对的是汇合,汇合代表多个动作并发执行时,只有当所有的控制流 都到达汇合点
之后才能继续往下走。
分岔和汇合并不是一定是相对出现的,通常也会只出现其中一个。
泳道
泳道将活动图划分成若干个组,每一组指定给负责这组活动的业务组织,明确的表示了哪些活动是由哪些对象进行的。
对象流
可以使用一个矩形表示对象,与他连接的动作就构成了 对象流
。
2.3、顺序图(时序图)
顺序图用一个二维图描述系统中各个对象之间的交互关系,纵轴是时间轴,由上至下表示 时间
的先后顺序。
顺序图中有 4 种元素:
- 对象:一个矩形框,语法和对象图一样;
- 生命线:垂直方向的一条长虚线;
- 激活:当一条消息被传递给对象时,他会触发改对象的某个行为,就表示改对象被激活了,用细长的矩形表示;
- 消息:带箭头的直线,分为四种:
- 简单消息:对于同步和异步无关紧要时使用;
- 同步消息:当发送者发送一个消息同时接受者已经做好接收的准备时可以传送的消息,用实心箭头表头;
- 异步消息:发送者不管接收者是否做好准备都可以传送的消息,用普通箭头表示;
- 反身消息和返回消息:一个对象将消息发给他自己就是反身消息,返回消息表示消息的返回,用虚线箭头表示;
消息内容的格式为:
[序号][监护条件]*[重复次数][返回值表:=]操作名(参数表)
监护条件:用布尔表达式表示;
在系统动态行为建模的过程中,当强调按 时间
展开信息的传递时,一般使用顺序图建模技术。
下面是一个借阅图书的顺序图:
2.4、协作图(通信图)
协作图与顺序图几乎一致,二者可以互相转化。
构成协作图的图形元素有 3 种:
- 对象
- 链接
- 消息
链接是两个对象之间的连接,表示协作图中对象间的连接在交互中所扮演的 角色
。
在链接的两端可以标明约束,主要有以下 3 种:
- 全局性:表明该角色是全局的;
- 局部性:表明该角色是一个操作中的局部变量;
- 参数性:表明该角色是一个操作中的参数。
我们将上面的借阅图书的顺序图例子用协作图表示如下:
2.5、用例图(需求建模)
用例图中有三种关系:
- 泛化关系;
- 包含关系;
- 扩展关系;
泛化关系
子用例和父用例相似,类似于面向对象中的继承。
箭头由子用例指向父用例。
包含关系
由 基础用例
指向 包含用例
,基础用例的执行必然会使用包含用例。
我们可以理解为包含用例封装了可以供很多个用例使用的功能。
箭头指向被包含的用例。
扩展关系
由 扩展用例
指向 基础用例
,基础用例的执行可能会使用扩展用例。
在扩展关系中,基本用例是一个结构完整的用例,即可以独立存在。
箭头执行被扩展的用例。
用例描述
虽然用例图通过图形符号描述了参与者与系统之间的关系,但是对于细节有所欠缺,通常还需要以书面文档的形式对用例进行描述,每个用例应具有一个用例描述。
下面以归还图书用例为例,它的用例描述如下:
用例名称 | ReturnBook |
---|---|
标识符 | UC0002 |
用例描述 | 图书管理员代替借阅者办理还书手续 |
参与者 | 图书管理员 |
前置条件 | 图书管理员登录进入系统 |
后置条件 | 如果这个用例成功,删除相关的借阅记录 |
基本操作流程 | 1、图书管理员输入要归还的图书信息;2、系统验证图书信息的有效性;3、删除借阅记录。 |
可选操作流程 | 该借阅者有超期的借阅信息,进行超期处理;归还的图书不是本馆藏书,用例终止; |
二、活用 UML
流程分析三剑客
活动图、状态机图、顺序图 是分析流程的三大利器。三种图有不同的特点和使用场景。
顺序图的特点:
- 强调角色之间的交互,
信息传递
很明确; - 强调按
时间顺序
分别发生了什么事情; - 不太适合表达复杂的流程(循环、分支);
活动图的特点:
- 强调每个
角色
都做了什么事情,这些事情的先后
关系; - 适合表达各种特殊流程,分支、并发;
状态图的特点:
- 这件事情围绕某事物展开;
- 该事物有不同的状态,状态会因为发生了一些事情而变化;
实际工作中对于三者的取舍:
- 如果事情是围绕某个东西展开的,可以考虑使用 状态机图 ;
- 如果事情不是围绕某东西展开的,可以考虑使用 顺序图 或者 活动图 ;
- 如果没有复杂的特殊流程,可以考虑 顺序图 ;
- 如果有复杂的特殊流程,可以考虑 活动图 ;
- 优势可以同时使用两三种图,从多个角度进行分析。
系统设计
我们做系统分析,无论是否使用 UML 类图,其目的无非想表达以下内容:
- 系统所涉及业务的静态概念及他们之间的关系(结构建模);
- 系统所涉及业务的动态内容,一般就是各种业务流程(行为建模);
- 我们希望这个系统能为用户做什么事情。
参考文献:
- 《火球——UML大战需求分析》—— 中国水利水电出版社
- 《UML实用基础教程》——北京大学出版社
- 《UML面向对象分析与建模》——电子工业出版社