PlantUML——高效绘制时序图和类图的神器

730 阅读4分钟

背景介绍

什么是时序图和类图

在软件工程中,时序图(Sequence Diagram)类图(Class Diagram)UML(Unified Modeling Language,统一建模语言) 中最常用的两种图。前者用于描述系统的动态行为,后者则用于描述静态结构。动静结合,天下无敌。

时序图用于描述系统中对象的交互行为,它展示了对象中消息传递的过程,以及这些消息的传递顺序。良好的时序图有助于帮助使用者直观理解系统逻辑,尤其是涉及多个模块或对象时的复杂业务逻辑和流程。

类图用于描述系统静态结构,展示了系统中类的属性、方法以及类之间的关系(如继承、实现、依赖、关联等)。适用于开发阶段基于面向对象原则设计类及其交互。

两者结合使用有助于深入理解和设计复杂系统。

在项目设计阶段,经常需要绘制时序图和类图。设计良好的时序图有助于增进对系统的理解,尤其是交互复杂的系统,时序图更是必不可少。而通过类图,我们可以

为什么选用PlantUML进行绘制

为什么使用代码化的PlantUML工具,而不是图形化的drawio等软件?原因有以下几点:

  • 效率至上:由于PlantUML可以自动调整大小、样式等,熟练以后,代码的效率远远高于图像接口。
  • 版本管理:用代码的方式记录图形,可以通过git进行版本和分支控制。
  • 插件支持:有markdown等统一语言支持,对于编辑器、IDE等,也存在成熟的插件支持。

绘制过程

以下记录关键元素的绘制过程,对于不常使用的功能,本文不再详述,可以通过查阅文末链接来获取。

绘制时序图

在markdown中使用```plantuml开启一个uml代码块,内部使用@startuml@enduml作为uml的标签。

image.png

以上图片展示了90%能使用到的时序图功能,其源码如下所示:

'单引号开头表示注释
'开启标签
@startuml cook

'==添加大标签
==把大象装进冰箱==

'box声明背景色,可以指明颜色值,使用participant来指明要覆盖背景色的成员
box "有机物" #LightGreen
participant 小王
participant 大象
end box

box "无机物" #Tomato
participant 冰箱
end box

'group - end添加小标签,用来框选一系列步骤
'->实线箭头,-->虚线箭头
group 买大象
小王 -> 大象: 买一头大象
小王 <-- 大象: 收到大象
note left: 万能的淘宝
'单引号开头表示注释,note必须跟在箭头后面
end

group 开门
小王 -> 冰箱: 打开冰箱门
note right: 双开门大冰箱
小王 <- 冰箱: 冰箱门已打开
end

'activate 角色 —— 开启某一流程,进入某一状态
'deactivate 角色 —— 结束某一流程,退出某一状态
group 把大象放进去
小王 -> 大象: 拿起大象
activate 小王
activate 大象
小王 <- 大象: 拿在手上
deactivate 大象
小王 -> 冰箱: 放进去
deactivate 小王
activate 冰箱
小王 <-- 冰箱: 放好了
deactivate 冰箱
end

group 关门
小王 -> 冰箱: 关闭冰箱门
小王 <- 冰箱: 冰箱门已关闭
end

@enduml

内置颜色集合

PlantUML内置了近百种颜色,可以通过#LightBlue格式的标签来设置色值。

image.png

绘制类图

PlantUML类图使用文档

相比于时序图而言,类图的绘制要简单的多,原因在于类图所使用的图形样式要大大少于时序图。

对类图而言,我们要关注的主要是两点:

  1. 元素,包含类和接口,元素内部由变量及方法组成。
  2. 关系,包含泛化关系(继承和实现)、组合关系(儿子脱离老子后仍然有意义)、聚合关系(儿子脱离老子则无意义)。

类(Class)与接口(Interface)

抽象类abstract,普通类class,接口interface

image.png

@startuml
'抽象类
abstract abstract
abstract "abstract class"
'类
class class
'接口
interface interface
@enduml

成员变量(variable)与函数(function)

还可以直接用类似Java的语法来写类、接口、变量、函数。

image.png

@startuml
class User {
    String name
    String getName()
}
@enduml

继承(extends)与实现(implements)

以下箭头方向可以左右灵活使用。

  • 泛化:<|--,空心三角+实线,继承普通非抽象类或者接口
  • 实现:<|..,空心三角+虚线,继承抽象类
  • 组合:*--,实心菱形,强依赖,子体不可以脱离主体独立存活
  • 聚合/包含:o--,空心菱形,弱依赖,子体可以脱离主体独立存活
  • 接口调用:<--,关联关系

image.png

@startuml
Class01 <|-- Class02
Class011 <|.. Class022
Class03 *-- Class04
Class05 o-- Class06
Class07 <-- Class08
@enduml

在VSCode中使用PlantUML

依次安装如下2个插件后,就可以愉快地使用了:

  • PlantUML
  • Markdown Plantuml Preview

此外,也可以使用在线工具(plantuml-editor.kkeisuke.com)实时绘制。

参考资料