UML
基于 UML Distilled Third Edition: A Brief Guide to the Standard Object Modeling Language 编写
在线画图网站:draw.io
简介
统一建模语言 Unified Modeling Language(UML) 是图像标记家族,通常用于面向对象编程中
标准由 OMG 制定
UML 通常有三种用法:
- 草稿——最常用
- 蓝图
- 编程语言
两个时间阶段:
- 前向工程:在写代码之前画图
- 逆向工程:从现有的代码中构造 UML 图以帮助理解代码
也正因为前两种用法更常见,故应该力求简洁,抓住要点,就像设计模式一样,通过公认的规范让人能够快速抓住要点。所以在使用的过程中要尽量避免那些微妙的歧义之处
类图
类图是最常见的图之一
属性 properties 代表类的结构化特征,有两种标记方式:
- Attribute:直接写在类的框图中
- 通常语法如下:
可见性 名字: 类型 乘数 = 默认值 {属性字符串}
- 例如:
- title: String [1] = "Untitled" {readOnly}
- 通常语法如下:
- 关联 association:用带箭头的线将两个对象连接起来
乘数 multiplicity:多少对象充满该属性,如 1
、0..1
、*
等
单箭头的是单向关联,双箭头的则是双向关联
操作 operation 的语法是:可见性 名称 (参数列表): 返回类型 {属性字符串}
泛化 generalization 即软件中的继承
标签样式的是注释
虚线箭头表示依赖 dependency,即被依赖方改变,依赖方也要跟着改变
注意依赖不一定有传递性,因为可能并不改变接口
依赖的关键字:
关键字 | 意义 | 关键字 | 意义 |
---|---|---|---|
<<call>> |
调用操作 | <<create>> |
创建实例 |
<<derive>> |
从目标派生 | <<instantiate>> |
是目标的实例 |
<<permit>> |
访问目标的私有特征 | <<realize>> |
是目标定义的接口或规范的实现 |
<<refine>> |
不同语义上的关系 | <<substitute>> |
可替代目标 |
<<trace>> |
跟踪需求 | <<use>> |
需要目标用于实现 |
约束 constraint 放在 { }
中
时序图
分布式和中心式控制
如果一个对象要创建,则发出 new
消息;如果要删除,则画上 X
尽管并不擅长,时序图仍然支持循环和条件
同步信息和异步信息
类图:进阶概念
关键词 keyword
也可以在类中加入责任 responsibility
静态操作和属性加下划线
组合 composition 和关联不同,强调了没有共享,即一方删除了,其包含的内容也会被删除
派生属性 derived attribute:前面加 /
,表示这是由计算得来的
接口和抽象类
- 抽象类用斜体表示,抽象方法也用斜体表示
- 虚线箭头表示实现某接口
- 套接字的写法也可以
限定关联:用于强调例如“Order 中的每个 Product 实例有一个 Order Line”
区别分类 classification 和泛化 generalization:
- 分类:对象是某类型的一个实例
- 泛化:类型是某个类型的子类
多分类:和泛化一样,但是在箭头边上加上分类鉴别符 discriminator
关联类:支持多对多
模板类:C++ 限定
激活类:边框是双竖线,表示在客户端中的线程中执行
可见性:常用 +
(public) 和 -
(private)
对象图
通常用于展示对象之间的关系
包图
用于表示包的依赖,资产,实现关系等
部署图
- 结点 node 是主持软件的东西
- 设备是硬件
- 执行环境是主持或容纳其他软件的软件
- 人工制品 artifact是软件的物理操作,通常是文件,包括可执行文件、数据文件、配置文件、HTML 文档等
用例
用例的实际重点在于内容,一般有主要成功设想和扩展构成,一步一步得出过程,用例之间的包含关系也可以通过链接实现
用例图展示了演员、用例及其之间的关系
用例分为三种级别:
- kite-level:较高级,展示用例如何用于更宽的业务中
- sea-level:中级,表示初级演员和系统之间具体的交互
- fish-level:较低级
注意用例代表外部的对系统的看法
状态机图
转移的格式如下:触发器签名 [守卫] / 动作
一些状态可以在没有转移的情况下对事件作出反应,称作内部活动,直接在状态盒子内部写活动就行了
活动状态:do/ ...
,和常规的活动相比可以被打断
也可以将几个状态组合为一个超状态,其接受相同的转移
还有历史伪状态,其记忆了上一次使用时的状态
实现的方法有:嵌套 switch、状态模式和状态表
通常用于描述一个对象在几个用例之间的表现,通常和时序图,活动图等结合
活动图
活动图用于描述过程逻辑、工作流等。相对于流程图来说区别在于其支持并行行为
其同样支持发送和接受信号来控制:
事实上,可以将活动图视为 token 的产生和传递
扩展区域描述对集合中的每一个物品活动发生一次
这种图尽管功能强大,但并不常用,因为描述复杂的东西太困难了
通信图
类似于时序图,但似乎更强调参与者之间的连接而不是顺序
复合结构
用于将复杂类分解为内部结构层次
组件图
没什么特别的,注意新的符号
交互概述图
相当于时序图和活动图的组合
时间图
常用于 EE