前言
前一篇文章我们介绍了UML
中类图的使用,虽然刚开始还不熟悉,但是在平时使用多了,会发现还是很好记忆的,尤其对一些不太熟悉的、比较复杂的、继承关系较多的代码来说,简直是神兵利器。
本篇文章来介绍UML
时序图,时序图在表示和描述复杂的方法调用链时有很大的帮助,可以让我们快速地在多个模块之间构建关系,是熟悉代码和梳理逻辑的必备之选。
正文
还是和前面一篇文章介绍UML
类图一样,我们在文章中使用掘金markdown
编辑器所使用的Mermaid
来说明时序图的组成,以及每个部分的作用和使用。
UML
时序图介绍
下面是一个典型的时序图,表示着小程序和服务器的关系:
sequenceDiagram
小程序 ->> 小程序:wx.login()获取code
小程序 ->>+ 服务器:wx.request()发送code
服务器 ->>+ 微信服务器:code+appid+sercret
微信服务器 -->> 服务器:openid
服务器 ->> 服务器:根据openid生成token
服务器 -->>- 小程序:token
通过时序图,我们可以很方便地显示模块之间的关系,下面我们就来逐一介绍其组成和含义。
参与者
参与者就是上面的小程序、服务器和微信服务器这些3个部分,表示3个参与逻辑流程的主体,用矩形表示,其竖线从上往下就表示时间的流向。
在Mermaid
中使用participant
关键字来定义参与者,或者不使用关键字隐式定义,代码如下:
也可以不使用participant关键字:
对于比较复杂的参与者名字,可以为其起别名:
上述3种定义参与者的效果都是下面这样:
sequenceDiagram
participant A as Alice
participant J as John
A ->> J:Hello John
J -->> A:Hello
消息
消息就是俩个参与者之间的交互,比如代码调用,使用实线或者虚线加箭头来表示。
标准格式如下:[Actor][Arrow][Actor]:Message Text
,即从一个参与者指向另一个参与者,根据消息的类型,这里一共有4种消息类型,如下表:
类型 | Mermaid描述 | 含义 | 效果 |
---|---|---|---|
同步消息/调用消息 | 使用实心箭头和实线: Alice ->> John | 表示发送者发送完消息,然后停止活动,等待消息接收者返回消息或者放弃。 | |
异步消息 | 使用箭头和实线:Alice -) John | 消息发送者发送消息到接收者,然后继续自己的活动,不等待接收者的返回。 | |
返回消息 | 使用虚线和箭头: John --) Alice | 表示接收者返回消息给发送者 | |
自关联消息 | 使用实心箭头和实线: Alice ->> Alice:自关联消息 | 表示方法的自身调用或者一个对象的一个方法调用另外一个方法 |
上述的几种关系其实非常好记忆和理解,首先是实线和虚线的区别,实线表示发送方主动发出消息,而虚线表示返回消息,其中对于同步消息用实心的箭头标记,为了强调,而异步消息,则用普通箭头标记。
激活框
这是针对参与者来说的,当收到一个消息时,可以表示对消息处理的时间间隔,在Mermaid
中使用activate
和deactivate
来激活和停用,比如代码如下:
效果如下:
sequenceDiagram
APP ->> 服务器:查询数据
activate 服务器
服务器 --) APP:查询到数据
deactivate 服务器
这里会发现使用activate/deactivate
关键字比较麻烦,可以使用+/-符号来代替,比如下面代码:
效果和上面是一样的。
对于激活框来说,它是可以反复多次被激活的,来表示不同的耗时间隔,比如下面效果:
sequenceDiagram
APP ->>+ 服务器:查询数据1
APP ->>+ 服务器:查询数据2
服务器 --)- APP:查询到数据2
服务器 --)- APP:查询到数据1
注释
在我们的时序图中,我们可以使用Note
关键字来定义注释,该关键字的使用格式是 "Note left/rigth of 参与者"
,还可以使用over来跨域多个参与者,测试代码如下:
效果如图:
sequenceDiagram
Note left of Alice:这是Alice
Note right of Bob:这是Bob
Alice ->> Bob:Hello
Note over Alice,Bob:共同Text
组合部分
在时序图中前面我们介绍的场景都是按时间流向一个一个执行,但是对这其中的执行操作我们可以根据实际逻辑进行组合,比如循环、if-else
等情况,下面我们就来看几个常见的场景。
Loop
循环
循环在我们代码中非常常见,而在UML
时序图中的循环就相当于代码中的While
关键字,使用loop
关键字,使用格式如下:
loop 循环的文字
内容
end
比如下面测试代码:
sequenceDiagram
老板 ->> 程序员:开发个支付宝
loop 开发未结束
程序员 ->> 产品经理:这功能抄哪个APP
产品经理 --) 程序员:抄这个APP
end
效果如图:
sequenceDiagram
老板 ->> 程序员:开发个支付宝
loop 开发未结束
程序员 ->> 产品经理:这功能抄哪个APP
产品经理 --) 程序员:抄这个APP
end
Alt
抉择
抉择也就是在俩个或者多个互斥的消息序列中选择一个进行执行,相当于代码中的if-else
,使用Alt
关键字,使用格式如下:
alt 抉择的信息
内容1
else
内容2
else
内容3
end
比如下面测试代码:
sequenceDiagram
土豪 ->> ATM:查询余额
alt >5000
ATM --) 土豪:取出5000
else >0
ATM --) 土豪:都取了
else 0
ATM --) 土豪:这是公交卡!
end
效果如图:
sequenceDiagram
土豪 ->> ATM:查询余额
alt >5000
ATM --) 土豪:取出5000
else >0
ATM --) 土豪:都取了
else 0
ATM --) 土豪:这是公交卡!
end
Opt
选项
从字面意思上来理解就是选项,是选择或者非选择,所以它包含一个可能发送或者不发生的序列,相当于上面没有else
的Alt
,使用opt
关键字,测试代码如下:
sequenceDiagram
土豪 ->> ATM:查询余额
opt >0
ATM --) 土豪:都取出来
end
ATM --) 土豪:退卡
效果如图:
sequenceDiagram
土豪 ->> ATM:查询余额
opt >0
ATM --) 土豪:都取出来
end
ATM --) 土豪:退卡
Par
并行
这个很好理解,就是多个任务同时进行,在代码中就是并发的意思,使用Par
关键字,测试代码如下:
sequenceDiagram
老板 ->> 员工:开发个APP
par
员工 ->> 员工:和产品经理battle
员工 ->> 员工:和测试battle
end
员工 --) 老板:终于可以上线了
效果如图:
sequenceDiagram
老板 ->> 员工:开发个APP
par
员工 ->> 员工:和产品经理battle
员工 ->> 员工:和测试battle
end
员工 --) 老板:终于搞完了
在UML
时序图中常用的组合就是上面几个,其实只需要记住一个关键字即可,使用起来非常方便。
背景高亮
这里说一下Mermaid
的功能,就是可以给某一块的序列操作设置背景,这样可以更加明显地看出某块的流程组合,使用如下:
rect rgb()
content
end
比如测试代码:
sequenceDiagram
老板 ->> 员工:开发个APP
rect rgb(191,223,255)
par
员工 ->> 员工:和产品经理battle
员工 ->> 员工:和测试battle
end
end
rect rgb(200,250,255)
员工 --) 老板:终于可以上线了
end
效果如图:
sequenceDiagram
老板 ->> 员工:开发个APP
rect rgb(191,223,255)
par
员工 ->> 员工:和产品经理battle
员工 ->> 员工:和测试battle
end
end
rect rgb(200,250,255)
员工 --) 老板:终于可以上线了
end
到这里关于UML
时序图的知识就介绍完了,其实内容不多,其逻辑都和我们代码控制块是一一对应的,比如while
循环和if-else
等,关于Mermaid
的使用,多写几次也就熟悉了。
IDE插件
生成时序图的Android Studio
插件,我在网上查了一些资料,推荐使用:SequenceDiagram
,安装、重启完该插件后,直接点击我们需要生成时序图的方法,然后右键:
短暂的等待后就会生成一个时序图:
通过时序图我可以更方便地查看方法地调用链。
总结
关于UML
时序图的使用,还要加强,可以快速让我们捋清楚逻辑,配合前面所说的UML
类图一起使用,效果更好。