基于 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:多少对象充满该属性,如 10..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