作者爱说话
Hello,大家好,我是 行云 ☁️
本来这周想接着写集合相关的源码解析,但是坐下来的时候,突然想暂时(shui)换(yi)个(pian)方向
不知道有多少小伙伴,之前没有在开发前设计过时序图,开发的时候,最多直接写个开发文档,直接梭哈
那今天来了解一下?
Java 开发,设计先行
林布丁:清幽现南山,虚静出内功
林步动:步动,你怎么还念起诗了
林布丁:哈哈,表哥,我最近在看阿里的《Java 开发手册》,我看到了一条设计规约,你瞅瞅
林步动:这个规约说的没毛病啊
林布丁:那表哥我问你啊, 什么是时序图?如何画时序图?
林步动:今天没空,我约了小美吃饭
林布丁:表哥,你上次欠我的 500 块钱,你看看?
林步动:咋哥两,钱不钱,都小事,主要是想给你讲点东西,你快拿出小本本吧,我给你讲讲 时序图 到底是何方神圣
什么是时序图?
林步动:时序图(Sequence Diagram),又名序列图、循序图,是一种 UML 交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。它可以表示用例的行为顺序,当执行一个用例行为时,其中的每条消息对应一个类操作或状态机中引起转换的触发事件。
林布丁:表哥,别百度,说人话
林步动:时序图就是反映了一组对象的交互与协作关系,可以清晰地反映系统的调用过程
林布丁:😮
林步动:时序图的核心元素包括:
- 对象(Actor)
- 生命线(Lifeline)
- 控制焦点(Focus of control)
- 消息(Message)
- 序列片段(Sequence Fragments)
掌握了,这些你就基本入门了。但是学习这些东西之前我们得,工欲善其事必先利其器
林布丁:表哥,我知道了,我已经买好了小米巨能写,小米巨能写成功书写圆周率小数点后178022位!🤣 画个图绝对是没问题的
林步动:…
林步动:对,你很聪明,我们用的就是 visual paradigm 这一款软件
接下来,我们说下上面的时序图核心元素,然后进行实操
对象
步动:对象(可以指人,外部其他系统,还可以指子系统)
布丁:表哥,这是时序图的对象??😅
步动:搞错了
步动:这才是
生命线
生命线就是一条垂直的虚线,用来表示交互的独立个体(诸如你的 Controller,Service),表示时序图中的对象在生命周期,线多长,活多久
控制焦点
控制焦点 表示对象执行一项操作的时期(比如你的 Service 层向 Dao 层发起操作),是时序图中表示时间段的符号,用覆盖在生命线长矩形表示,矩形的顶部和箭头对齐,分别表示开始和结束时间,因此矩形的长度也表示持续的时间
消息
消息(Message)是对象之间的一种通信机制(比如 Service 层向 Dao 层发起,查找码儿的嘟嘟骑公众号作者信息,这就是一个消息)。
调用消息(Call Message)
调用消息对目标生命线的一次调用。通常使用实心箭头表示同步调用,使用左右朝向的开放箭头表示异步调用
返回消息(Return Message)
返回消息表示目标对象传递给调用者的消息。使用朝向调用者的虚线开放箭头表示。
自调用消息(Self Message)
表示对当前生命线的调用消息(比如你在当前对象的 A 函数,又调用了一次 B 函数)
递归消息(Recursive Message)
递归消息表示对当前生命线的调用消息(相当于一个对象的 A 函数内部再次调用 A 函数)
创建消息(Create Message)
创建消息表示目标生命的实例化消息,即初始化一个对象。使用朝向初始化对象的带虚线开放箭头表示。
持续消息(Duration Message)
持续消息显示消息调用的两点之间的距离。
注释
可以将注释附着在各种元素上,注释不包括时序的语义,但可能包含对建模非常有用的信息。
序列片段
UML 2.0 引入了序列片段,通过它可以更轻松地精确创建和维护时序图。
序列片段也成为组合片段,使用一个框来表示,它包含时序图的一部分交互。
序列片段左上角的符号表示片段的操作类型。
片段的主要类型包括: ref, assert, loop, break, alt, opt, neg。
片段操作类型 | 片段类型介绍 |
---|---|
alt | 只执行条件为真的片段 |
opt | 可选,仅在条件为真时才执行 |
par | 并行:每个片段并行执行 |
loop | 循环:指此片段可以多次执行 |
region | 关键区(临界区):一次只能有一个线程执行 |
neg | 否定:片段显示无效的交互 |
ref | 参考:指在另一个图上定义的交互 |
sd | 时序图:用于包围整个时序图 |
如何画时序图?
布丁:那表哥,怎么画时序图啊?
步动:如此如此,这般这般
- 与产品 Battle 需求
- 确认需求,设计参与该需求的对象
- 为每个对象创建生命线
- 从初始消息开始,依次画出后续消息
- 结合上述序列片段的几种操作类型,考虑消息的复杂逻辑
- 对时序图进行修改、美化
在这个过程中,主要是对需求的思考,正常的可以进行开发的合格设计中,需要详细划出从界面开始到各模块之间的处理流程,包括:校验,事务,判断,异常,补偿等
设计足够完善后,你才可以在实际 Coding 中有更多的思考,诸如对更多的场景去思考,以及代码性能的优化,当然你的设计够完善,也可以配合测试设计更合理的测试用例,QA 万岁
时序图小 Tip
1,当你的框框想适应文字的时候
2,当你的控制焦点想分开的时候
3,对你的 alt (if else) 进行骚操作?
4,搞条虚线回去?
5,等等,只要多多接触,你就会发现 其实 visual paradigm 还是挺难画的
6,不对,还有个 Tip,在推荐 IDEA SequenceDiagram 插件来学习时序图,它可以根据代码调用链路自动生成时序图
妈妈再也不用担心我,看源码的时候不知道类的执行顺序了
7,不对,还有个 Tip, visual paradigm 社区给出了大量的时序图范例,大家可以参考学习。
https://online.visual-paradigm.com/cn/
参考文章:
孤静:《阿里巴巴 Java 开发手册》嵩山版
明明如月:解锁大厂思维:剖析《阿里巴巴 Java 开发手册》
visual paradigm 社区
我是 行云,点个赞再走吧,我们下期再见 👋