写设计方案时的绘图工具--PlantUML工具介绍

1,949

什么是UML?

UMLUnified Model Language的缩写,中文是统一建模语言,是由一整套图表组成的标准化建模语言。

为什么要用UML?

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

UML提供了极富表达能力的建模语言,可以让软件开发过程中的不同人员分别得到自己感兴趣的信息。

image.png

image.png

上面一些常见的UML图,使用UML图可以帮助我们更好的表达出项目的结构和设计,更加通俗易懂。

一开始,我使用的是drawio软件进行绘制,使用起来也较为方便,但每次都需要专门找个时间来思考怎么画图,修改也不太方便,后面也变成能不画就不画了。

最近又发现了PUML这个工具,可以用文字的方式生成UML图,类似markdown,感觉比较方便。

使用方式

  1. Goland 安装plantUML插件

image.png

2.新建一个test.puml文件

image.png

3、即可开始绘制uml图,下面以我们最熟悉的时序图为例

语法可以参考这篇文章

例如我们现在有一个http服务器,redis缓存和db,那么一次访问的流程就可以用一个时序图来表示。

首先确定我们的参与者:用户actor,Http server, redis, DB

对于这些参与者,puml有对应的关键字

image.png 绘制的UML图要用@startuml@enduml包裹起来

@startuml
actor Actor #red
entity HttpServer #grey
entity Redis #grey
database db #grey

title Http 一次访问实现

@enduml

image.png

下面绘制两种情况的http访问:

  • 请求打到redis上直接返回
  • 请求打到redis上查询不到,再访问db

autonumber 关键字可以给请求自动编号

==title== 区分不同情况的时序图

alt/else/end 来组合不同分组

@startuml
actor Actor #red
entity HttpServer #grey
entity Redis #grey
database db #grey

title Http 一次访问实现

autonumber

==情况一==
activate Actor #pink
activate HttpServer #pink
activate Redis #pink
activate db #pink
Actor ->HttpServer:用户请求API
alt 缓存命中情况
        HttpServer -> Redis: 查询缓存
        Redis -> HttpServer:缓存命中
        HttpServer ->Actor:返回数据
    else 缓存没有命中情况
        HttpServer -> Redis: 查询缓存
        Redis -> db:缓存没有命中
        db ->HttpServer:db查询数据
        HttpServer ->Actor:返回数据
   end
@enduml

image.png

这样子就绘制出了一个简单的UML时序图

下面再增加一个场景:Http服务器不用访问外部存储,自己处理数据后返回

自己指向自己即可绘制一个返回的箭头

@startuml
actor Actor #red
entity HttpServer #grey
entity Redis #grey
database db #grey

title Http 一次访问实现

autonumber

==情况一==
activate Actor #pink
activate HttpServer #pink
activate Redis #pink
activate db #pink
Actor ->HttpServer:用户请求API
alt 缓存命中情况
        HttpServer -> Redis: 查询缓存
        Redis -> HttpServer:缓存命中
        HttpServer ->Actor:返回数据
    else 缓存没有命中情况
        HttpServer -> Redis: 查询缓存
        Redis -> db:缓存没有命中
        db ->HttpServer:db查询数据
        HttpServer ->Actor:返回数据
   end

==情况二==
autonumber
Actor ->HttpServer:用户请求API
loop 10次
    HttpServer->HttpServer:处理数据
end
HttpServer->Actor:返回数据
@enduml

image.png

其他更复杂的用法可以参考前面的文章进行加工。

4.导出图片

image.png goland提供直接导出成图片的功能

Puml 绘制状态机

按照前面的方式可以正常绘制时序图等一些uml图;但在绘制状态机出现了错误

image.png

解决方式:github.com/igorrosenbe…

mac:

brew install graphviz

安装好后可能还显示这个错误,可能能安装的路径不对,没关系,我们做一个软连接

locate dot |grep graph
找到dot可执行文件的位置
sudo ln -s /opt/homebrew/Cellar/graphviz/2.47.3/bin/dot /usr/local/bin/dot
软连接到用户可执行文件目录下

image.png 现在就可以了

在状态机中,使用 [*] 来表示状态的起点

假设我们要画一个简单的股票买卖的状态机,

首先确定有几种状态:

  • 游客(sightseer):下载了软件,没有别的操作,是一个初始状态
  • 买家(buyer):当我们开通账户后,就变成了买家,可以进行买卖
  • 持有者(holder):当我们购买并拥有股票后,就变成了持有者

然后确定可能的事件和状态转换

  • 开户:由游客变成了买家
  • 购买股票:由买家变成了持有者
  • 卖出部分股票:持有者仍然为持有者
  • 全部卖出: 持有者变成买家
  • 注销账户:买家变游客
  • 其他情况就暂时不考虑了

这样我们可以绘制出下面的状态机

@startuml

Sightseer :
Buyer :
Holder :

[*] --> Sightseer : init status
Sightseer --> Buyer: openAccount
Buyer --> Holder : buy
Holder --> Holder : partial sell
Holder --> Buyer : sell all
Buyer --> Sightseer : writeOff

@enduml

image.png