2021年2月24日

使用 draw.io(Diagram) 绘图系列之「时序图」

  时序图是一种 UML 交互图,通过描述对象(类、组件、子系统、其他参与者)之间消息传递的时间顺序,来显示多个对象之间是如何动态协作的。它也是一个二维图,横轴表示对象,纵轴表示生命线,消息在各个对象之间横向传递,依照时间顺序纵向排列。
  
  一、时序图简单介绍
  
  时序图(Sequence Diagram),又名序列图、循序图,是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。它可以表示用例的行为顺序,当执行一个用例行为时,其中的每条消息对应一个类操作或状态机中引起转换的触发事件。(摘自百度百科)
  
  相比于传统的流程图而言,时序图能更加一目了然地描述对象的各种交互过程,也能描述并发情况。我将时序图也分为这两种:
  
  业务时序图(按照人与系统的维度)
  
  程序时序图(按照代码执行的维度)
  
  二、有哪些组成元素
  
  1、角色(Actor)
  
  角色/执行者,可以是人、机器、其他系统、子系统
  
  2、对象(Object)
  
  对象的命名方式不是强制的,尽可能的让阅读的人理解即可,可以用这种命名方式 “对象:类” 来表示。对象的左右顺序尽量遵循两个原则:把交互频繁的对象尽可能的靠拢;把初始化整个交互活动的对象放置在最左端
  
  3、生命线(Lifeline)
  
  在时序图中表示为从对象图标向下延伸的一条虚线,表示对象存在的时间
  
  4、激活期(Activation)
  
  在生命线上用小矩形表示,表示在这个时间段内对象将执行相应的操作,小矩形之外的为 “ 去激活 ”(Deactivation),指对象处于空闲状态, 在等待消息激活这个对象
  
  5、消息(Message)
  
  同步消息 – 发送者把消息传递给接收者后停止活动,等待接收者放弃或者返回
  
  异步消息 – 发送者把消息传递给接收者后不等待仍然进行自己的活动,此时接收者和发送者是并发工作的
  
  返回消息 – 过程调用后的返回响应
  
  自关联消息 – 表示方法的自身调用或者一个对象内的一个方法调用另外一个方法
  
  6、组合片段
  
  组合片段用来解决交互执行的条件和方式,为任何生命线的任何部分定义特殊条件和子进程。这里只列举了我们常用的 5 种(共有 13 种)名称及含义如下:
  
  7、draw.io 提供的图形介绍:
  
  draw.io 提供的图形
  
  Boundary、Control、Entity 是三种特殊的生命线对象类型,通常一起使用(MVC模式)
  
  Entity:实体对象,用于表示需要永久保存或较长生命期的数据对象,例如票据、文件、数据库(通常不直接说数据库等技术实现方式,而说逻辑意义的名称)
  
  Control:控制对象,用于表示业务逻辑、分工协调的职责对象
  
  Boundary:边界对象,可用于表示交互界面、子系统
  
  异步消息:有些资料使用 ”上半边箭头“ 表示,我在这里用不接收返回值来表示
  
  三、找个样例来看看
  
  这是微信支付文档里的一张图
  
  它是从人与系统的角度来描绘整个处理流程,主要描述了正常的流程(实际上里面还有很多异常处理需要考虑)
  
  参与的角色和对象有:用户、微信客户端、商户的后台系统、微信的支付系统
  
  在第 15 步,使用了一个异步回调的画法
  
  第 6 步之后,没有返回消息(感觉还是要加一下,返回支付信息并弹出确认支付界面)
  
  alt 组合片段没有描述条件(感觉有点问题)
  
  四、我们也来动动手
  
  场景:用户去「存取款机」存钱 (虚构的流程别太当真[看])
  
  绘制步骤可简单总结如下:
  
  1、划清边界,识别交互的语境 – 界定好要画的范围,是业务场景还是代码执行过程
  
  2、梳理角色和对象 – 将所要绘制的交互场景中的角色以及对象梳理出来,本例中有四个角色对象:用户、存取款机、银行后台系统、消息推送系统,注意命名不能用动词
  
  3、添加消息 – 从触发整个交互的某个消息开始,在生命线之间从上到下依次画出所有消息,并注明每个消息的特性(如含义、参数等)
  
  通过 draw.io 画的图,场景虚构
  
  这里用到了五种组合片段:break、alt、par、loop、opt,分隔线使用虚线
  
  适当的着色,有助于阅读
  
  组合框内的箭头、文案无法选中时,右键组合框,将组合框置于最底部(移至最后)
  
  注意层次:从左到右时,左边的消息高于右边,从右到左时,右边的消息高于左边
  
  异常的流程不太好画,主要还是描述正常流程即可
  
  每条消息最好有一个编号,方便在做重要说明时使用
  
  写在最后:
  
  我比较喜欢的两款绘图工具:draw.io 和 visio,风格比较现代化,相信你们如果用过也会喜欢的,关于他们的介绍和使用就不多说了,大家可以自行网上搜一搜,下一篇我将介绍如何用 draw.io 画流程图。