当前位置: 首页 > news >正文

【UML】第12篇 序列图(1/2)——基本概念和构成

目录

一、什么是序列图(Sequence Diagram)

1.1 定义

1.2 主要用途

1.3 序列图和BPMN的区别和联系

二、序列图的构成

 2.1 对象

2.2 生命线

2.3 消息 

2.4 激活


序列图,是我个人认为的用处最多的一种图。产品和研发的同学,都应该熟练掌握的一种业务建模和沟通工具。

有时,我们会把序列图,和泳道图(Swimlane Diagram),或者BPMN图相混,认为是一种图。实际上,他们都可以为业务流程进行建模,不过使用的场景、针对的实体、流程描述的角度、颗粒度,都有很大的区别。

关于BPMN建模方式,可参考我之前的博文:业务建模工具BPMN-CSDN博客

一、什么是序列图(Sequence Diagram)

1.1 定义

序列图(Sequence Diagram)是一种用于显示对象之间交互的图形化表示。它描述了在特定场景下,对象之间按照时间顺序进行的消息传递和协作过程。

在序列图中,对象被表示为带有垂直虚线的矩形,虚线表示对象的生命周期。对象之间的交互通过箭头表示的消息来表示,箭头从一个对象的生命线指向另一个对象的生命线,表示消息的发送和接收。

1.2 主要用途

UML中的序列图是一种重要的建模工具,它可以帮助开发人员更好地理解系统的动态行为,并辅助设计和开发过程。

  1. 描述对象之间的动态交互:序列图可以清晰地展示对象之间的消息传递和协作过程,帮助开发人员理解系统的动态行为。
  2. 辅助设计和开发过程:通过绘制序列图,开发人员可以更好地理解系统需求和设计,从而更好地实现系统的功能。
  3. 用于测试和调试:序列图可以作为测试和调试的依据,帮助测试人员理解系统的预期行为并与实际行为进行比较。

1.3 序列图和BPMN的区别和联系

这方面很少有人对比,我来试着讲述一下。序列图和BPMN(业务流程建模与标注)中的流程图在用途、表达方式和关注点上有显著的区别,同时也存在一定的联系。

区别——

  1. 用途不同:序列图主要用于展示在特定场景下对象之间的交互顺序和消息传递,强调时间和顺序的关系;而BPMN的流程图则主要用于描述业务流程的执行过程,强调任务、活动和流程控制。
  2. 表达方式不同:序列图使用垂直线和箭头表示对象之间的消息传递和交互,对象被表示为带有垂直虚线的矩形;而BPMN的流程图使用符号和连接线表示任务、活动和流程控制,如椭圆表示任务,菱形表示决策点等。
  3. 关注点不同:序列图关注对象之间的动态交互和消息传递的细节,强调对象之间的协作;而BPMN的流程图关注业务流程的整体流程和任务执行顺序,强调流程的优化和改进。

联系——

  1. 都是建模工具:序列图和BPMN的流程图都是用于建模的工具,可以帮助人们更好地理解和描述复杂的系统或业务流程。
  2. 可相互补充:在实际应用中,序列图和BPMN的流程图可以相互补充。例如,可以使用BPMN的流程图描述整体业务流程,然后使用序列图详细描述流程中关键部分的对象交互和消息传递。

这两种工具,可以相互补充以提供更全面的视图和理解。

在实践中,序列图往往提现了BPMN中某个部分的具体实现逻辑。

二、序列图的构成

上图是一个典型的序列图的样子,用ROSE的风格画的,当然可能不是用的ROSE工具。ROSE的配色,黄底色,红边框,早已经深入人心。

序列图主要由对象(Object)、生命线(Lifeline)、激活(Activation)和消息(Message)构成。

  • 对象:对象是类的实例,在序列图中用带有垂直虚线的矩形表示,虚线表示对象的生命周期。我们经常会把Actor也画到同样的维度,比如Customer。
  • 生命线:生命线是一条垂直的虚线,表示对象的存在时间。
  • 激活:激活表示对象正在执行某个操作或方法,通常通过在生命线上绘制一个细长的矩形来表示。
  • 消息:消息是对象之间的交互,通过箭头表示从一个对象的生命线指向另一个对象的生命线,箭头上标注有消息的名称或内容。

这些元素共同构成了序列图,用于描述在特定场景下对象之间的交互顺序和消息传递。

 2.1 对象

对象有如下三种表示方法。

  1. 对象名+对象所属的类名;
  2. 只有对象名(省略类名);
  3. 只有类的名称(匿名对象);

2.2 生命线

这个不是你手上的那条,是对象的生命线,虚线,和对象的矩形一起,像个棒棒糖似的。

2.3 消息 

这里特意说一下,这些消息的标记,目前不同的版本,不同的工具,甚至团队内部,都有各自的规定。比如同步消息,异步消息,就有多种表示方法。甚至有时,使用半个箭头,这样特殊的模式。本文内容,使用的是UML2.5版本的约定。

1.同步消息(Synchronous Message)

  • 定义:同步消息是一种需要等待接收方处理完成后才能继续的消息。发送方在发送完消息后会等待,直到接收方处理完消息并返回结果。
  • 解释:同步消息类似于函数调用,发送方调用接收方的方法或操作,并等待其执行完成。发送方在等待期间会暂停自己的执行,直到接收方返回结果。
  • 图形表示:同步消息通常使用实线箭头表示,箭头指向接收方对象,并在箭头上标注消息的名称或内容。

2.异步消息(Asynchronous Message)

  • 定义:异步消息是一种发送方发送完消息后不等待接收方处理完成的消息。发送方在发送完消息后会立即继续自己的处理。
  • 解释:异步消息类似于发送事件或信号,发送方不关心接收方何时处理完成。发送方发送消息后可以继续执行其他操作,而不需要等待接收方的响应。
  • 图形表示:异步消息通常使用虚线箭头表示,箭头指向接收方对象,并在箭头上标注消息的名称或内容。

3.返回消息(Return Message)

  • 定义:返回消息是指当一个对象将消息发送给另一个对象后,另一个对象返回的虚线有向边,表示原消息已处理的消息。
  • 解释:返回消息用于表示对同步消息的响应,告诉发送方消息已被成功处理或返回处理结果。它通常与同步消息一起使用,表示消息的完整交互过程。
  • 图形表示:返回消息通常使用虚线箭头表示,箭头指向返回方对象,并在箭头上标注返回结果的名称或内容。

4.创建消息(Create Message)

  • 定义:创建消息是表示对消息传递目标对象的创建。
  • 解释:当某个对象需要创建另一个对象时,会使用创建消息来表示这个创建过程。创建消息可以包含对新对象的初始化和配置信息。
  • 图形表示:创建消息通常使用带有“create”标签的箭头表示,虚线,箭头指向新创建的对象,并在箭头上标注创建操作的名称或内容。

5.销毁消息(Destroy Message)

  • 定义:销毁消息是表示对消息传递目标对象的删除。
  • 解释:当某个对象需要销毁或删除另一个对象时,会使用销毁消息来表示这个销毁过程。销毁消息通知目标对象进行必要的清理和释放资源。
  • 图形表示:销毁消息通常使用带有“destroy”标签的箭头表示,虚线,箭头指向要销毁的对象,并在箭头上标注销毁操作的名称或内容。

6.自返消息(Self-Message)

  • 定义:自返消息是对象向自己发送的消息。它表示对象内部的某种行为或操作,而不是与其他对象的交互。
  • 解释:自返消息用于表示对象内部的状态变化或执行某个操作。它可以是对象调用自己的方法或执行自己的行为,而不涉及与其他对象的通信。
  • 图形表示:自返消息在序列图中通常使用指向对象自身的箭头表示。箭头的起点和终点都在同一个对象的生命线上,并在箭头上标注消息的名称或内容。

7.简单消息(Simple Message)

  • 定义:简单消息是对象之间最基本的通信方式,表示一个对象向另一个对象发送消息或请求。
  • 解释:简单消息用于描述对象之间的交互,它可以是同步消息或异步消息的一种简化表示。简单消息不涉及复杂的控制流或返回值,只是简单地表示一个对象调用另一个对象的方法或操作。
  • 图形表示:简单消息在序列图中使用箭头表示,箭头从发送方对象的生命线指向接收方对象的生命线。箭头上可以标注消息的名称或内容。

简单消息实际就是不标明是同步还是异步消息,只表达表消息这个事实。

以上的约定中,图形也比较好记忆,同步和简单消息,就是实线,虚线不特别标记,就是异步消息,方向是返回,或者标记有创建、销毁的,就是相应的意义。这样也比较简单,不要总是换箭头的模式,一会空心,一会实心,一会菱形,弄个太复杂。

同步消息的典型例子,就是上课铃和下课铃,上课铃打完,就要上课,上课没有结束,下课铃是不可能打的。程序中,这些都要控制。但是需要并发的网络购物等,就不同了。客户下单后,即使没有付款,也不会影响对另一件商品下单。除非是买的火车票,有重复的时段等特殊情况。

2.4 激活

激活表示一个对象执行一个动作所经历的时间段。一般情况下,当一个对象收到其它对象发送的消息时被激活,在激活期内处理该消息,激活结束时应该发出一个消息。在UML中使用处于生命线上的垂直长条矩形来表示。矩形的开始处为对象开始操作动作,底部表示操作动作的结束。

此外,对象的生命线,可能遇到销毁的情况。一般有2种处理方式,一是一个对象给另一个对象发销毁消息,用虚线加销毁标记,另外也可以对象自己销毁,在生命线上打个×,就可以了。

(未完待续)

相关文章:

  • [数据结构]树与二叉树的性质
  • ------- 计算机网络基础
  • 思福迪运维安全管理系统 test_qrcode_b RCE漏洞复现
  • 【FPGA】Verilog 实践:优先级编码器 | Priority encoder
  • 一个实用的Wrapper类,解决mfc使用sqlite3时的中文乱码问题
  • W5500-EVB-Pico评估版介绍
  • 二、C#基础语法( 异常处理)
  • 使用JAVA Zookeeper构建分布式键值存储
  • STM32移植LVGL图形库
  • ❀My排序算法学习之选择排序❀
  • 【Linux】线程池设计/单例模式/STL、智能指针与线程安全/读者写者问题
  • PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装
  • 1、TCP 和 UDP 区别? 2、TCP/IP 协议涉及哪几层架构? 3、描述下 TCP 连接 4 次挥手的过程?为什么要 4 次挥手?
  • Guava的Joiner的日常使用
  • 多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【个人向】《HTTP图解》阅后小结
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Apache的80端口被占用以及访问时报错403
  • C# 免费离线人脸识别 2.0 Demo
  • Javascript 原型链
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • React16时代,该用什么姿势写 React ?
  • SOFAMosn配置模型
  • 初识 beanstalkd
  • 从tcpdump抓包看TCP/IP协议
  • 大主子表关联的性能优化方法
  • 给初学者:JavaScript 中数组操作注意点
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 思维导图—你不知道的JavaScript中卷
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 用mpvue开发微信小程序
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 通过调用文摘列表API获取文摘
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ![CDATA[ ]] 是什么东东
  • # C++之functional库用法整理
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (02)vite环境变量配置
  • (12)Hive调优——count distinct去重优化
  • (C#)一个最简单的链表类
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (三)elasticsearch 源码之启动流程分析
  • (一)基于IDEA的JAVA基础12
  • (原)Matlab的svmtrain和svmclassify
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .jks文件(JAVA KeyStore)
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...