什么是UML?
UML
是Unified Model Language
的缩写,中文是统一建模语言,是由一整套图表组成的标准化建模语言。
为什么要用UML?
通过使用UML使得在软件开发之前, 对整个软件设计有更好的可读性,可理解性,从而降低开发风险。同时,也能方便各个开发人员之间的交流。
UML提供了极富表达能力的建模语言,可以让软件开发过程中的不同人员分别得到自己感兴趣的信息。
上面一些常见的UML图,使用UML图可以帮助我们更好的表达出项目的结构和设计,更加通俗易懂。
一开始,我使用的是drawio
软件进行绘制,使用起来也较为方便,但每次都需要专门找个时间来思考怎么画图,修改也不太方便,后面也变成能不画就不画了。
最近又发现了PUML
这个工具,可以用文字的方式生成UML图,类似markdown,感觉比较方便。
使用方式
- Goland 安装plantUML插件
2.新建一个test.puml文件
3、即可开始绘制uml图,下面以我们最熟悉的时序图为例
例如我们现在有一个http服务器,redis缓存和db,那么一次访问的流程就可以用一个时序图来表示。
首先确定我们的参与者:用户actor,Http server, redis, DB
对于这些参与者,puml有对应的关键字
绘制的UML图要用@startuml
和@enduml
包裹起来
@startuml
actor Actor #red
entity HttpServer #grey
entity Redis #grey
database db #grey
title Http 一次访问实现
@enduml
下面绘制两种情况的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
这样子就绘制出了一个简单的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
其他更复杂的用法可以参考前面的文章进行加工。
4.导出图片
goland提供直接导出成图片的功能
Puml 绘制状态机
按照前面的方式可以正常绘制时序图等一些uml图;但在绘制状态机出现了错误
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
软连接到用户可执行文件目录下
现在就可以了
在状态机中,使用 [*]
来表示状态的起点
假设我们要画一个简单的股票买卖的状态机,
首先确定有几种状态:
- 游客(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