【专业技能】程序员的软件工程素养之画好 UML 时序图
前言
笔者在本科的时候上过软件工程的专业课,也完成过类似的课堂作业,但是工作以后一直没怎么用上。碰巧前段时间有碰到一个复杂系统的部分功能设计,作为设计文档的一部分,时序图也被我拿起来派上用场了。
时序图通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作,同时它解释了一个系统中的不同部件之间,彼此是通过怎样的交互来实现某个功能,、以及特定场景下交互发生的顺序。
一、认识时序图
时序图(Sequence Diagram),又名序列图、循序图,是一种UML交互图。一般的软件开发都是为了支撑某个具体的业务,有时候业务的流程会比较复杂,涉及到多种角色,这时就可以使用时序图来梳理这个业务逻辑。这样会使业务看起来非常清晰,代码写起来也是水到渠成的事情。
1.1时序图元素
一般来说,我们在画时序图时会涉及到以下7种元素:
角色(Actor)
系统角色,可以是人或者其它系统、子系统,以一个小人图标表示。
对象(Object)
位于时序图的顶部,用一个矩形表示,对象的选择一般有以下三种:
- 某个系统或者子系统的名称;
- 涉及到的中间件的名称;
- 涉及到具体的类和对象的名称。
生命线(LifeLine)
时序图中每个对象和底部中心都有一条垂直的虚线,这就是对象的生命线,以一条垂直的虚线表示。
控制焦点(Activation)
控制焦点代表时序图中在对象生命线上某段时期执行的操作,用一个很窄的矩形表示。
消息(Message)
表示对象之间发送的信息,可以分为以下三种类型:
同步消息(Synchronous Message)
消息的发送者把控制传递给消息的接收者,然后停止活动,等待接收者放弃或者返回控制,用来表示同步的意义。用一条实线和实心箭头来表示。
异步消息(Asynchronous Message)
消息发送者把信号传递给接收者,然后继续自己的活动,不等待接收者返回消息或控制,即异步消息的发送者和接收者是互不影响的。用一条实线和大于号表示。
返回消息(Return Message)
返回消息表示调用过程的返回,用虚线和小于号表示。
自关联消息
表示对象内方法的自调用或者调用对象内的另一个方法,用一个半闭合的矩形和下方实心箭头表示。
组合片段
组合片段用来解决交互执行的条件和方式,它允许在时序图中直接表示逻辑组件,用于通过指定条件或子进程的应用区域,为任何生命线的任何部分定义特殊条件和子进程。下面说明几个相对来说比较常见的组合片段:
组合名称 含义说明 ref 引用其它地方定义的组合片段 alt 在一组特定行为中根据条件选择某个交互 opt 表示一个可选的行为 break 提供了和编程语言中与 break 类似的机制 loop 说明交互片段会被重复执行
其中前 6 种是比较常用和重要的元素,最后的组合片段元素相对比较复杂。
1.2怎么使用
下面举一个用户调起支付宝的例子来说明上面提到的元素具体是怎么使用的。
调起支付宝支付时序图
注:调起支付的时序图可能没有全覆盖上面说的元素,下面一节的示例可能更加全面。
二、画好时序图
我本人一般是使用时序图来梳理业务逻辑的,碰上比较复杂的业务,需要几个中间件或者系统参与的时候,时序图能很好地展示各个系统和中间件的调用关系。
2.1一般步骤
为了画好时序图,我自己总结出了以下几个值得注意的步骤:
- 明确业务涉及的对象,一般是某个系统或者中间件,这很重要;
- 每个对象的生命线需要明确各自的控制焦点,即该系统或者中间件按照流程需要做的事情,比如后台一般增删改查、数据库读/写、MQ异步生产/消费等;
- 对象进行自调用时注意与页面的交互,是否涉及状态变更,是否涉及数据的入库和返回展示;
- 注意中间件的使用是异步or同步,异步的话注意与其它系统的关联,同时由于是异步,还可以着重判断一下异步的结果情况后再进行下一步;
- 组合片段的选择性使用,比较多的是 alt 和 opt,看页面是否可以选择性交互,或者看结果是否可以选择性操作。
2.2举个例子
下面我举一个实际项目的业务例子,主要是为系统用户发放获奖证书的流程,涉及到管理后台、消息队列、数据库和APP(即H5页面)这几个对象。流程如下:
- 用户登录后台后新增/编辑获奖证书,选择用户进行发放,并将产生的数据持久化;
- 发放时 MQ 生产者发送异步消息,无论消费是否成功都返回发送成功给前端;
- MQ 消费发送过来的携带用户信息的消息,消费成功后将数据持久化在数据库;
- H5 端经过页面交互后,获取上一步的数据库的数据进行前端展示。
发放获奖证书时序图
2.3推荐工具
Diagrams (原名draw.io)
在线网址:https://app.diagrams.net/
我个人是比较推荐使用 Diagrams (原名draw.io) 的,它是一款免费且开源的专业画图工具。它具有本地存储和离线使用的功能,同时也支持多人协作和多种文件格式的导入导出。
Diagrams 在线
processOn(不推荐)
在线网址:https://www.processon.com/
其实我最开始接触专业 UML 画图的工具是 processOn,功能强大且模板多,最主要是那个时候使用是免费的。但是这两年开始收费了:模板收费就算了,自己画也要收费,我就放弃了。当然,有付费意愿的朋友是可以试试的,应该可以满足你的大部分需求。
processOn
三、其它作用
开发人员掌握画图的技能可以将零散的知识碎片结构化,通过图形来结构化我们的思维模式,这样的好处是可以清晰的认识到自身对事物的理解和掌控程度。
首先,在我们编码之前先做设计图,可以让自己对业务需求有一个较深的理解,避免自己一边写编码一边踩业务需求的坑。
其次,可以降低同事之间的沟通理解成本,看图可能会比看代码更容易理解业务逻辑,也能够让非技术同事明白程序实现的真正逻辑。
最后,程序的设计图,可以存档沉淀为公司宝贵的技术资源,优秀的设计图还可以共享给其他同事学习参考,实现真正的 "共同富裕"。
四、文章小结
到这里关于 UML 时序图的分享就告一段落了,如果文章有错误或不足,还请大家指正。或者大家有什么更好的 idea,也都欢迎在评论区讨论交流。
参考文章
- https://www.cnblogs.com/54chensongxia/p/13236965.html
- https://zhuanlan.zhihu.com/p/342655946?ivk_sa=1024320u&utm_id=0
【专业技能】程序员的软件工程素养之画好 UML 时序图的更多相关文章
- 《程序员的职业素养》【PDF】下载
<程序员的职业素养>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382243 内容介绍 <程序员的职业素养>是编程大 ...
- 《代码整洁之道》&《程序员的职业素养》
这是why技术的第32篇原创文章 春节期间读了两本技术相关的书籍:编程大师Bob大叔的<代码整洁之道>和<代码整洁之道:程序员的职业素养>. <代码整洁之道>出版于 ...
- 做为一个Python程序员的基本素养
今天在学习的过程中,明白了一些不是Python标准所必须要做的事情,二是做为一个合格的Python程序员应该所遵从的一些规范 分享给大家,有不足的地方请大家指正,此下是我学习的一点心得: 1.在给变量 ...
- 程序员/开发人员的真实生活 (Gif 多图)
往工作环境上传东西的时候: 没保存,就关了 IDE 的时候: 凌晨三点调代码的时候: 正则表达式返回了了预期结果的时候: 当老板告诉我,我那一直负责的模块失效了的时候: 刚修复了Bug,我给老板演示的 ...
- 深入理解Fsync----JBD内核调试 专业打杂程序员 @github yy哥
http://hustcat.github.io/ http://www.cnblogs.com/hustcat/p/3283955.html http://blog.sina.com.cn/s/ar ...
- 新时代的coder如何成为专业程序员
在移动互联网"泛滥"的今天,越来越多非专业(这里的非专业指的是非计算机专业毕业的程序员)程序员加入到了IT行业中来了,可能是因为移动互联网的火爆导致程序员容易就业而且工资很高,可能 ...
- 这里有一份Java程序员的珍藏书单,请您注意查收
前言 不要因为迷茫,而停止了脚下前进的路.给大家推荐一份Java程序员必看的书单,豆瓣评分都挺不错的,每一本都值得去读,都值得去收藏,加油呀 本文已经收录到github https://github. ...
- [No000033]码农网-如何锻炼出最牛程序员的编码套路
最近,我大量阅读了Steve Yegge的文章.其中有一篇叫"Practicing Programming"(练习编程),写成于2005年,读后令我惊讶不已: 与你所相信的恰恰相反 ...
- (C#)程序员必读的一些书籍
前言 ·貌似公司里很著名的一句话,在这里套用过来了,WP研发工程师,首先是WPF/SL研发工程师,WPF/SL研发工程师首先是是个C#研发工程师,C#研发工程师首先Windows研发工程师.Windo ...
- 程序员为什么害怕低代码?ZT
转自:https://www.jianshu.com/p/cd89fe94cd30 低代码 是一种近些年兴起的企业软件快速开发技术和工具.借助低代码使用者无需编码即可完成企业应用的常用功能,少量编码扩 ...
随机推荐
- vue动画appear 实现页面刚展示出来的时候,入场效果
<style> /* 给动画添加一组过度效果 */ .v-enter, .v-leave-to { opacity: 0; transform: translateY(80px); } . ...
- 【主流技术】浅析 ElasticSearch7.x 的基本结构及应用(一)
目录 前言 一.概述 1.1基本认识 1.2核心概念 对比关系型数据库 1.3倒排索引 例一: 例二: 1.4了解ELK 二.安装(基于 CentOS) 2.1安装声明 2.2 使用 Docker 安 ...
- 三线表制作(word)
三线表制作 转载:https://blog.csdn.net/zaishuiyifangxym/article/details/81668886
- 手把手教学构建证券知识图谱/知识库(含码源):网页获取信息、设计图谱、Cypher查询、Neo4j关系可视化展示
手把手教学构建证券知识图谱/知识库(含码源):网页获取信息.设计图谱.Cypher查询.Neo4j关系可视化展示 demo展示: 代码结构 stock-knowledge-graph/ ├── __i ...
- C/C++ 反汇编:函数与结构体
反汇编即把目标二进制机器码转为汇编代码的过程,该技术常用于软件破解.外挂技术.病毒分析.逆向工程.软件汉化等领域,学习和理解反汇编对软件调试.系统漏洞挖掘.内核原理及理解高级语言代码都有相当大的帮助, ...
- 《重学Java设计模式》作者开始录视频了!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 1. 前言 哈哈哈,终于对B站下手了! 大家好,我是小傅哥,在紧张.羞涩到适应后,哈哈哈,终于 ...
- InnoDB存储引擎的行级锁
InnoDB存储引擎的行级锁 InnoDB存储引擎和MyISAM的其中有两个很重要的区别:一个是事务,一个就是锁机制不同.事务之前有介绍,有问题的去补课;锁方面的不同是InnoDB引擎既有表锁又有行锁 ...
- 极限挑战:使用 Go 打造百亿级文件系统的实践之旅
JuiceFS 企业版是一款为云环境设计的分布式文件系统,单命名空间内可稳定管理高达百亿级数量的文件. 构建这个大规模.高性能的文件系统面临众多复杂性挑战,其中最为关键的环节之一就是元数据引擎的设计. ...
- 《Learning from Context or Names?An Empirical Study on Neural Relation Extraction》论文阅读笔记
代码 原文地址 预备知识: 1.什么是对比学习? 对比学习是一种机器学习范例,将未标记的数据点相互并列,以教导模型哪些点相似,哪些点不同. 也就是说,顾名思义,样本相互对比,属于同一分布的样本在嵌入空 ...
- 好书推荐之《码出高效》、《阿里巴巴JAVA开发手册》
好评如潮 <阿里巴巴Java开发手册> 简介 <阿里巴巴Java开发手册>的愿景是码出高效,码出质量.它结合作者的开发经验和架构历程,提炼阿里巴巴集团技术团队的集体编程经验和软 ...