UML学习笔记以及绘制工具PlantUML介绍

UML学习笔记以及绘制工具PlantUML介绍

[TOC]
工作中的文档,自己编码时的思路整理都需要图形来整理和表达思路,UML是比较被广泛认可的一种.恰好最近在学习设计模式,于是稍微细学一下UML及其绘制.
本文为其学习笔记,以及开源绘制工具 PlantUML 的介绍.

基础

什么是UML?

UML是Unified Model Language的缩写,中文是统一建模语言,一种开放的方法,用于说明,可视化,构建和编写一个正在开发的,面向对象的,软件密集系统的制品的开放方法.UML正在逐渐成为工业标准.

为什么要用UML?

通过使用UML使得在软件开发之前, 对整个软件设计有更好的可读性,可理解性,从而降低开发风险.同时,也能方便各个开发人员之间的交流.

Page-Jones 在”Fundamental Object-Oriented Design in UML” 一书中总结了UML的主要目的,如下:

  1. 为用户提供现成的,有表现力的可视化建模语言,以便他们开发和交换有意义的模型.
  2. 为核心概念提供可扩展性 (Extensibility) 和特殊化 (Specialization) 机制.
  3. 独立于特定的编程语言和开发过程.
  4. 为了解建模语言提供一个正式的基础.
  5. 鼓励面向对象工具市场的发展.
  6. 支持更高层次的开发概念,如协作,框架,模式和组件.
  7. 整合最佳的工作方法 (Best Practices).

UML图有哪些?

一图胜千言.
uml_classification.jpeg
各类别的基本介绍
uml_classification2.jpeg

类图

在系统分析与设计阶段,类通常可以分为三种,分别是实体类(Entity Class),控制类(Control Class)边界类(Boundary Class),下面对这三种类加以简要说明:

  1. 实体类:实体类对应系统需求中的每个实体,它们通常需要保存在永久存储体中,一般使用数据库表或文件来记录,实体类既包括存储和传递数据的类,还包括操作数据的类.实体类来源于需求说明中的名词,如学生,商品等.

  2. 控制类:控制类用于体现应用程序的执行逻辑,提供相应的业务操作,将控制类抽象出来可以降低界面和数据库之间的耦合度.控制类一般是由动宾结构的短语(动词+名词)转化来的名词,如增加商品对应有一个商品增加类,注册对应有一个用户注册类等

  3. 边界类:边界类用于对外部用户与系统之间的交互对象进行抽象,主要包括界面类,如对话框,窗口,菜单等.

组成

类图有三个组成部分(第四个可选部分为内部类):
class.jpg

  1. 第一部分是类名:每个类都必须有一个名字,类名是一个字符串.

  2. 第二部分是类的属性(Attributes):属性是指类的性质,即类的成员变量.一个类可以有任意多个属性,也可以没有属性.

    1
    可见性 名称:类型 [ = 缺省值 ]

其中:

  • 可见性:公有(public),私有(private)和受保护(protected)三种,分别用符号+,-和#表示.
  • 名称:表示属性名,用一个字符串表示.
  • 类型:表示属性的数据类型,可以是基本数据类型,也可以是用户自定义类型.
  • 缺省值:是一个可选项,即属性的初始值.
  1. 第三部分是类的操作(Operations):操作是类的任意一个实例对象都可以使用的行为,是类的成员方法.

    1
    可见性 名称(参数列表) [ : 返回类型]

其中:

  • 可见性
  • 名称:即方法名,用一个字符串表示.
  • 参数列表:表示方法的参数,其语法与属性的定义相似,参数个数是任意的,多个参数之间用逗号”,”隔开.
  • 返回类型:是一个可选项,表示方法的返回值类型,依赖于具体的编程语言,可以是基本数据类型,也可以是用户自定义类型,还可以是空类型(void),如果是构造方法,则无返回类型.
  1. 内部类
    internal_calss.jpg

类与类之间的关系

关联关系

一种结构化关系,用于表示一类对象与另一类对象之间有联系.通常将一个类的对象作为另一个类的成员变量.在使用类图表示关联关系时可以在关联线上标注角色名,一般使用一个表示两者之间关系的动词或者名词表示角色名.
relationship.jpg

  1. 单向关联
  2. 双向关联
    dual_direction.jpg
  3. 自关联
    self_related.jpg
    Java里可以实现.在C++里面不能存在吧.我之前尝试这么做,失败了.
  4. 多重性关联
    表示两个关联对象在数量上的对应关系.
表示方式 多重性说明
1..1 表示另一个类的一个对象只与该类的一个对象有关系
0..* 表示另一个类的一个对象与该类的零个或多个对象有关系
1..* 表示另一个类的一个对象与该类的一个或多个对象有关系
0..1 表示另一个类的一个对象没有或只与该类的一个对象有关系
m..n 表示另一个类的一个对象与该类最少m,最多n个对象有关系 (m≤n)

例如:一个界面(Form)可以拥有零个或多个按钮(Button),但是一个按钮只能属于一个界面.

multipolicy.jpg

  1. 聚合关系
    聚合(Aggregation)关系表示整体与部分的关系,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在.用带空心菱形的直线表示.
    aggregation.jpg
  2. 组合关系
    组合(Composition)关系也表示类之间整体和部分的关系,但是整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在,成员对象与整体对象之间具有同生共死的关系.用带实心菱形的直线表示.
    composition.jpg

依赖关系

依赖(Dependency)关系是一种使用关系,体现在某个类的方法使用另一个类的对象作为参数.用带箭头的虚线表示,由依赖的一方指向被依赖的一方.
depedency.jpg
在系统实施阶段,依赖关系通常通过三种方式来实现,第一种也是最常用的一种方式是如图所示的将一个类的对象作为另一个类中方法的参数,第二种方式是在一个类的方法中将另一个类的对象作为其局部变量,第三种方式是在一个类的方法中调用另一个类的静态方法.

泛化关系

泛化(Generalization)关系也就是继承关系,用于描述父类与子类之间的关系,用带空心三角形的直线来表示.
generalization.jpg

接口与实现关系

接口其实就是没有属性的纯抽象操作的类,只有操作的声明,没有操作的实现.
接口和类之间还存在一种实现(Realization)关系,类实现了接口,类中的操作实现了接口中所声明的操作.用带空心三角形的虚线来表示.
interface.jpg

其他常见图

这里只先列出常见的几种,更多参见末尾的附录.

时序图

用来显示随时间变化,一个或多个元素的值或状态的更改.也显示时控事件之间的交互和管理它们的时间和期限约束.
time_sequece.jpeg

组件图

描绘系统中组件提供的,需要的接口,端口等,以及它们之间的关系.

订单系统组件依赖于客户资源库和库存系统组件.中间的虚线箭头表示依赖关系.另外两个符号,表示组件连接器,一个提供接口,一个需要接口.
zujian.jpeg

状态机图

state_machine.jpeg

序列图

根据时间序列展示对象如何进行协作.它展示了在用例的特定场景中,对象如何与其他对象交互.
superflow.jpeg

UML画图工具-PlantUML

基础介绍

开源项目,官网地址,基于java,源码github.虽然PlantUML本身是GPL License,但是它生成的图像(无论何种格式)均归其作者所有.

优点

  • 免费
  • 跨平台(java)
  • 提供基础的命令行接口(方便脚本化)
  • 文本形式编辑:随时可以编辑不依赖平台环境,方便版本管理(git),内容与样式解耦(恰如MVC中的M与V).
  • 支持多种导出格式:图片/ASCII码等.
  • 支持多种 UML 图形:时序图,用例图,类图,对象图,活动图,组件图,部署图,状态图,定时图.
  • 也支持多种非 UML 图: JSON Data, YAML Data, nwdiag, 线框图形界面, 规范和描述语言 (SDL), Ditaa diagram, 甘特图, MindMap, 以 AsciiMath 或 JLaTeXMath 符号的数学公式等.

缺点

  • 没有GUI工具上手快.
  • 没有GUI里拖动智能调整位置的便利性(有时候脚本自动生成的布局,不够好,有交叉等).

使用方式

  1. 直接访问 online server(我的首选,虽然有广告):PlantUML Web Server.

  2. 通过jar包的形式使用.

安装

  • 安装java

  • 安装graphviz-dot:可选的, 但是建议安装 (如果想绘制除 时序图和活动图以外的图, 就需要安装 Graphviz 软件).

使用

  • 从命令行运行

    1
    2
    java -jar plantuml.jar sequenceDiagram.txt 
    #创建一个文本文件作为输入,输出是一个图像.
  1. 部署Web服务端.

使用效果-类图为例

使用网页版,页面如下

web.PNG

下面常用操作摘自官方中文PDF手册.

元素声明

1
2
3
4
5
6
7
8
9
10
11
12
13
@startuml	#开始符
abstract abstract
abstract class "abstract class" #抽象类
annotation annotation #备注
circle circle #圆
() circle_short_form #短圆
class class #类
diamond diamond #菱形
<> diamond_short_form #短菱
entity entity #实例
enum enum #枚举
interface interface #接口
@enduml #截至符

元素示意图:
3.1.PNG

类之间的关系

3.2.PNG

关系上的标签

在关系之间使用标签来说明时, 使用:后接标签文字.
对元素的说明,你可以在每一边使用""来说明.

添加方法

系统检查是否有括号来判断是方法还是字段.

也可以使用 {} 把字段或者方法括起来.

可访问性

3.5.PNG

抽象与静态

通过修饰符 {static} 或者 {abstract},可以定义静态或者抽象的方法或者属性.
这些修饰符可以写在行的开始或者结束.也可以使用 {classifier} 这个修饰符来代替 {static}.

高级类体

自己定义分隔符来重排方法和属性(-- .. == __ 均可使用).

备注和模板

模板通过类关键字 (<<>>) 来定义.

你可以使用 note left of , note right of , note top of , note bottom of 这些关键字来添加备注.
你还可以在类的声明末尾使用 note left, note right,note top, note bottom 来添加备注.
此外,单独用 note 这个关键字也是可以的,使用 .. 符号可以作出一条连接它与其它对象的虚线.

也可以在注释中使用部分 html 标签,如改变字体加粗插图等.

综合演练结果

综合上面的命令写出的例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@startuml
Driver - Car : drives >
Class Car{
{static} String brand
{abstract} # void run(float speed)
..
I can use many lines
--
end of class
}
Car *- Wheel : have 4 >
Car -- Person : < owns
Person : +Work()
Person : -int age
Person : ~Car BMW
note bottom of Person : maybe this guy is <size:20>you</size>
note "oh this guy has a <u>BMW</u>" as N1
Person .. N1
N1 .. Car
@enduml

效果如下:

3.PNG

其他操作以及其他类的制作方法请查阅手册.

自定义风格

如果是在网页版使用的化,可以参考上面网页版界面截图中的红框为一些风格选项.如下为其中一个风格.

style.PNG

如果觉得不够用,可以下载本地软件,定制自己的风格(All Skin Parameters),或者是使用别人开发好的风格配置文件(puml-themes),加载命令如下.

1
java -jar plantuml.jar -config <path to file>/puml-theme-<THEME NAME>.puml

VS Code 插件

名为PlantUML的插件.

附录

更多UML图类型:

部署图

描述系统内部的软件如何分布在不同的节点上.
bushu.jpeg

对象图

对象图是类图的一个实例,是系统在某个时间点的详细状态的快照.
object.jpeg
例子为某时间点bat这个公司有一个研发部,一个销售部,两个部门只有一个人iisheng.

包图

描绘系统在包层面上的结构设计.
package.jpeg

  • “Use”关系表示使用依赖,Web Shopping依赖Payment.
  • “Merge”关系表示合并,Web Shopping合并了Shopping Cart就拥有了Shopping Cart的功能.
  • “Access”关系表示私有引入,比如代码中的指定包名类名.
  • “Import”关系表示公共引入,比如Java中的import之后,就可以直接使用import包中的类了.

组合结构图

描述了一个”组合结构”的内部结构,以及他们之间的关系.这个”组合结构”可以是系统的一部分,或者一个整体.
system.jpeg

轮廓图

提供了一种通用的扩展机制,用于为特定域和平台定制UML模型,用于在特定领域中构建UML模型.
outline.jpeg

用例图

指由参与者,用例,边界以及它们之间的关系构成的用于描述系统功能的视图.
instance.jpeg
用例图中包含以下三种关系:

  • “include”:包含关系使用符号.
  • “extend”:扩展关系使用符号.
  • 泛化关系,子用例继承父用例所有结构,行为和关系.

活动图

描述具体业务用例的实现流程.
flow.jpeg

通讯图

描述了收发消息的对象的组织关系,强调对象之间的合作关系而不是时间顺序.
communication.jpeg

交互概览图

交互概览图与活动图类似,但是它的节点是交互图.
communication_flow.jpeg

参考链接:
http://www.uml.org.cn/oobject/201211231.asp
https://www.yinxiang.com/everhub/note/d2f91fe6-22bc-4d73-a15a-9b0d28e19326
https://paul.pub/using-plantuml/

UML学习笔记以及绘制工具PlantUML介绍

https://www.chuxin911.com/UML_note_20211206/

作者

cx

发布于

2021-12-06

更新于

2022-07-16

许可协议