UML设计系列(9):开发过程中如何应用UML
传送门
UML设计系列(1):状态机图
UML设计系列(2):类图
UML设计系列(3):时序图
UML设计系列(4):用例图
UML设计系列(5):系统依赖图
UML设计系列(6):活动图
UML设计系列(7):UML设计阶段性总结
UML设计系列(8):数据库关联关系图
我眼中的软件开发流程
对于软件的开发流程,我们一直没怎么触碰,探讨不多。业界的标准开发模式也很成熟,比如你可能听过传统的瀑布、迭代开发模式,随着微服务风靡的敏捷开发模式,以及时下比较为的DevOps等。
这些名词程序员或多或少都听过,甚至项目上都应用过,不过标准的开发模式其实分为4种:瀑布模型、迭代式开发、螺旋开发、敏捷开发,其中螺旋开发可能接触的比较少,而敏捷又比较繁杂。由于今天不是讨论的重点,可自行参考相关资料。
但是从我个人经验来说,不管是哪种开发模式,我觉得在开发过程中应用UML设计都是很有必要的,这里可以提供一些个人的经历供参考。
常用的软件开发流程
早期阶段
在刚工作的那些年,我是在杭州的软件公司做开发,主要是为一些金融机构做系统,既有驻场开发、也有公司saas化的产品。这类项目有一个共通点:属于偏"交付"性质项目,所以对需求管理比较严格(尤其是银行类钱多又强势的甲方),但是对代码设计几乎是没有的。而且这类项目一般有一个权力比较大的项目经理,不仅把控项目进度,还拥有考核权,属于项目经理矩阵的强势一方。他的主要任务是保证系统交付不延期,所以通常都鼓励加班来达成目标。在这种情况下,当时不要说利用UML做系统分析设计,甚至可以说设计也几乎没有,每天几乎就是按照需求不停的写代码,然后产品经理修改需求再改代码,偏向于传统的瀑布模式!
不过当时没有什么经验,加上技术也不熟练觉得可以锻炼技术,这样情况下倒对此也没有多想,顺便收获了一波经验。现在回想起来,如果当年能有这样一个机制要求做好系统设计+评审(或者有这样一个资深的程序员来整体负责),或许当年加的班会不会少一些(至少不会每个资金指令都要重新撸一遍代码)
中期阶段
事情突然有了改变,当从杭州离开回到成都,进入了一家互联网企业(公司总部竟然还是在杭州),UML于我而言,突然变成了不可或缺!这里的开发流程不再是需求来了,埋头苦干就行了,必须要做称为"系分"的设计:
- 不论是项目规模大小,功能简单或复杂都要求写一个系分文档设计
- 要求本系统内尽可能详细,关联系统尽可能全,从全局视角梳理涉及的功能点
- 参与开发人员都要参与,最终汇总评审
在第2点中,编写设计文档的过程中,主要会使用到UML相关的以下几点:
- 使用ER图表示数据库的关联关系
- 使用类图表示对象之间的关联关系;以及模块化的包图
- 使用状态机表示单个对象的生命周期,或某一个操作的业务状态流转
- 使用时序图表示某一个操作的整体流程
- 使用活动图表示某一个操作的详细流程
- 使用依赖图表示系统/组件之间的依赖关系
除此以外,还有从用户角度的用例图来表示系统的功能点与角色的关系,还有系统运维角度的部署图(这里就不贴链接了,现在它还躺在我的草稿箱里面),以及项目管理角度的功能点大图(一般是xmind编写)。
这个过程从入职那一天开始,一直持续到离职。不夸张的说花在UML设计这上面的时间不会比写代码时候少,对于UML的熟悉程度也算比较熟悉了。刚开始肯定是有个适应的过程,工具不熟悉、流程不熟悉,可能画一个流程图所费的时间可能代码都写完了,甚至会在某个时刻感到痛苦。后来类似于自我心里调节,公司相当于发钱让自己学习了,这样还整体学习了一下UML知识体系,收获颇多!其中看过的几本书列举在后面附录了。
现阶段
有一种说法叫"近朱者赤"。虽然离开了老东家,但是对于"系分"和UML设计,还是形成了潜移默化的影响。现在的公司虽然也有自己的研发流程和各种要求,但还是和早期阶段一样,对于系统设计要求并不高。所以难就难在没有外部要求下,如何坚持下去这种研发高标准!好在公司还算有点自由,在后面几年中我始终都沿续了这种步骤,写代码之前做需求、设计分析, 并有幸影响了周围的同事都开始了这种习惯(当有个同事第一次看到这种文档时,直感叹"专业"二字!!!)
假装是一个附录-UML书籍列表
前后七七八八看过几本UML的书,也都是粗略翻翻:
- UML精粹第三版
https://baike.baidu.com/item/UML%E7%B2%BE%E7%B2%B9%EF%BC%9A%E6%A0%87%E5%87%86%E5%AF%B9%E8%B1%A1%E5%BB%BA%E6%A8%A1%E8%AF%AD%E8%A8%80%E7%AE%80%E6%98%8E%E6%8C%87%E5%8D%97%EF%BC%88%E7%AC%AC3%E7%89%88%EF%BC%89/62687193这本书厚,可以做为很好的入门。但是它是大名鼎鼎的Martin Fowler写的,这就值得入手一观了
- [大象-Thinking.in.UML(第二版)].谭云杰
https://baike.baidu.com/item/%E5%A4%A7%E8%B1%A1%EF%BC%9AThinking%20in%20UML%EF%BC%88%E7%AC%AC2%E7%89%88%EF%BC%89/12067378这是一本国人写的优秀的UML书籍,里面除了介绍UML之外,还有系统设计方法与思路。不过比较"大部头",有啰嗦之嫌,说实话我没有看完,建议有兴趣的看看
- UML用户指南(第2版)
https://baike.baidu.com/item/UML%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97%EF%BC%88%E7%AC%AC2%E7%89%88%C2%B7%E4%BF%AE%E8%AE%A2%E7%89%88%EF%BC%89/62641927这本同UML精粹大同小异,可以互为补充,如果看了前面2本,这本选读
看一个简单的案例
俗话说,"纸上得来终觉浅,绝知此事要躬行"。下面就以一个例子来看看,在一个开发过程中到底如何使用UML。在最开始介绍状态机的时候举了一个用户登录的例子,现在就以继续以这个场景为背景,来看看开发的视角该做哪些工作。
用时序图体现整体流程
可以用时序图表现出整体的登录流程,这里直接复用原来的那张图,不再重复画了:
时序虽然说是表现整体流程的,但是要画到什么程度,画多少个并没有具体的规定,可以按照项目大小、功能维度自行斟酌或团队约定。只要能真实的表达它对应的业务操作即可!
用状态机体现状态流转
这里的状态机也直接复用以前的,不过要说明的是这里状态节点比时序图中体现出来的操作更多,因为考虑了新用户注册及注销的情况。此处仅仅是做个示例就不再调整了:
用例图表现用户的操作
这里有2个角色:普通用户、管理员。理论上来说,注册时确认邮件的发送、账户的冻结可能都是自动化的(论证/风控系统识别出高危操作)不需要管理员这个角色手动操作,但这里为了突出用例图的作用,都设计出了对应的手动操作功能!
用ER图体现数据库的关联关系
对于一般的业务来说,关系型数据库是必不可少的,这里这里就假设有几个表(RDS类型不限):t_user用户表、t_send_mail_history邮件发送表,现在用ER图来表示一下这2个表的信息
用类图表示对象之间的关系
系统的设计最终效果还是要通过代码来体现,在UML设计的过程中与代码最息息相关也是最直接的就是类图。这里采用传统的SpringMVC结构来进行分层:
写在最后
没什么多说的,学习一项技术(工具)最好的时候就是当你开始使用的时候,找到一款合适的工具,从一个最简单的场景用UML设计起来吧!
相关文章:

UML设计系列(9):开发过程中如何应用UML
传送门 UML设计系列(1):状态机图 UML设计系列(2):类图 UML设计系列(3):时序图 UML设计系列(4):用例图 UML设计系列(5):系统依赖图 UML设计系列(6):活动图 UML设计系列(7):UML设计阶段性总…...
Linux之安装配置Nginx
Linux系统下安装配置Nginx的详细步骤如下: 一、准备工作 系统环境:确保Linux系统已安装,并且具有网络连接(以便在线安装依赖或下载Nginx)。 安装依赖:Nginx依赖于一些开发库和工具,如gcc、pcr…...
【C++】STL之deque
deque Deque 的底层既不直接依赖 vector 也不依赖 list,而是结合了两者的思想,采用了一种分块(chunk)存储与动态指针数组(map)结合的结构。以下是详细分析: 1. 底层结构设计 Deque 的核心设计…...

模板方法模式:定义算法骨架的设计模式
模板方法模式:定义算法骨架的设计模式 一、模式核心:模板方法定义算法骨架,具体步骤延迟到子类实现 在软件开发中,经常会遇到这样的情况:某个算法的步骤是固定的,但具体步骤的实现可能因不同情况而有所不…...

通付盾入选苏州市网络和数据安全免费体验目录,引领企业安全能力跃升
近日,苏州市网络安全主管部门正式发布《苏州市网络和数据安全免费体验产品和服务目录》,通付盾凭借其在数据安全、区块链、AI领域的创新实践和前沿技术实力,成功入选该目录。 作为苏州市网络安全技术支撑单位,通付盾将通过 “免费…...

【金仓数据库征文】加速数字化转型:金仓数据库在金融与能源领域强势崛起
目录 一、引言 二、金仓数据库(KingbaseES)概述 1. 发展历程与市场地位 2. 核心技术架构 3. 金仓数据库的特点 三、金仓数据库在金融行业的应用 1. 金融行业的挑战与需求 2. 金仓数据库在金融行业的优势 3. 金仓数据库在金融行业的实际应用案例 …...
音频base64
音频 Base64 是一种将二进制音频数据(如 MP3、WAV 等格式)编码为 ASCII 字符串的方法。通过 Base64 编码,音频文件可以转换为纯文本形式,便于在文本协议(如 JSON、XML、HTML 或电子邮件)中传输或存储&#…...
Qt C++/Go/Python 面试题(持续更新)
目录 1、封装、继承、多态是什么? 2、final标识符的作用是什么? 3、介绍一下虚函数 4、介绍一下智能指针 5、介绍一下左值、右值、左值引用、右值引用 6、指针和引用有什么区别? 7、define和const的区别是什么? 8、C程序的…...
VMware 虚拟机镜像资源网站
常见的 VMware 虚拟机镜像资源网站 网站名称链接地址特点OSBoxes.orgOSBoxes - Virtual Machines for VirtualBox & VMware 提供 .vmx .vmdk,适合 VMware 和 VirtualBox,更新频率高,界面清晰LinuxVMImages.comLinux VM Images - Downlo…...

C++智能指针上
一、裸指针 “裸指针”是最基础的,直接存储内存地址的指针类型。特点:①它本身没有自动的内存管理机制:如它不会自动释放内存,也不会检查是否指向有效的内存区域;②直接操作内存地址,不进行任何的边界检查&…...

低代码平台开发串口调试助手
项目介绍 串口调试助手是一款用于串口通信调试的工具,它可以帮助开发人员发送和接收串口数据,主要用于嵌入式开发、工业控制、物联网设备开发等领域。 主要功能包括: 数据收发:可以实时发送和接收串口数据,并显示在界…...

怎么配置一个kubectl客户端访问多个k8s集群
怎么配置一个kubectl客户端访问多个k8s集群 为什么有的客户端用token也访问不了k8s集群,因为有的是把~/.kube/config文件,改为了~/.kube/.config文件,文件设置成隐藏文件了。 按照kubectl的寻找配置的逻辑,kubectl找不到要访问集群…...
C语言分支结构详解
一、引言 在 C 语言中,分支结构是程序控制流的重要组成部分。它允许程序根据不同的条件执行不同的代码块,从而实现更灵活和复杂的逻辑。分支结构使得程序能够根据输入、变量的值或其他条件来做出决策,决定程序的执行路径。 二、if 语句 基…...
Redisson实战:分布式系统中的五大典型应用场景
引言 在分布式系统架构中,数据一致性、高并发控制和资源协调是开发者面临的核心挑战。Redisson作为基于Redis的Java客户端,不仅提供了丰富的分布式对象和服务,还简化了分布式场景下的编程模型。本文将通过实际代码示例,解析Redis…...

12N60-ASEMI无人机专用功率器件12N60
编辑:LL 12N60-ASEMI无人机专用功率器件12N60 型号:12N60 品牌:ASEMI 封装:TO-220F 最大漏源电流:12A 漏源击穿电压:600V 批号:最新 RDS(ON)Max:0.68…...

长城智驾重复造轮子
左手新能源,右手智驾,这是长城当下最在意的两块业务。 从去年8月首款具备高阶智能驾驶功能SUV全新蓝山上市之后,长城在传播端的重点就是围绕智驾、无图方案打造智驾标签。 先是在广州国际车展上,整个展厅只展出全新蓝山…...
云原生之认识DDD
一、DDD是什么? 领域驱动设计(DDD) 做为一种软件工程的方法论,它可以帮助我们设计高质量的软件,或者说任何工程的设计都需要方法论,不论是城市设计、建筑设计、室内设计。 比如没有方法论的情况下楼是可以盖起来的,或许整个楼道和窗户上挂满了电话线、闭路线、电线?下水…...

continue插件实现IDEA接入本地离线部署的deepseek等大模型
文章目录 前言一、IDEA安装continue二、continue部署本地大模型三、continue聊天窗口使用deepseek R1四、continue批量接入硅基流动的模型API 前言 亲爱的家人们,创作很不容易,若对您有帮助的话,请点赞收藏加关注哦,您的关注是我…...
代码随想录算法训练营第一天:数组part1
今日学习的文章链接和视频链接 ● 自己看到题目的第一想法 ● 看完代码随想录之后的想法 ● 自己实现过程中遇到哪些困难 ● 今日收获,记录一下自己的学习时长 状态 思路理解完成 30% 代码debug完成 60% 代码模板总结并抽象出来 100% 题目 704 二分查找 题目链接…...

滚珠螺杆在数控机床中如何降低摩擦系数?
对数控机床这样要求加工精度高而且加工精度能保持长期稳定的设备来说是必须的,而且具有较低的传动阻力也同时为更高速的传动打下基础。使用滚珠螺杆,也是数控机床加工效率高的一个重要原因,为了减少数控机床的滚珠螺杆出现摩擦,可…...

【现代深度学习技术】循环神经网络05:循环神经网络的从零开始实现
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

Python实现技能记录系统
Python实现技能记录系统 来自网络,有改进。 技能记录系统界面如下: 具有保存图片和显示功能——允许用户选择图片保存,选择历史记录时若有图片可预览图片。 这个程序的数据保存在数据库skills2.db中,此数据库由用Python 自带的…...
前端基础之《Vue(10)—过滤器》
一、过滤器 1、作用 用于数据处理。 2、全局过滤器 使用Vue.filter(名称, val>{return newVal})定义。 在任何组件中都可以直接使用。 3、局部过滤器 使用选项,filters: {}定义,只能在当前组件中使用。 4、过滤器在Vue 3.0中已经淘汰了 5、过滤器…...

Linux常见指令介绍下(入门级)
1. head head就和他的名字一样,是显示一个文件头部的内容(会自动排序),默认是打印前10行。 语法:head [参数] [文件] 选项: -n [x] 显示前x行。 2. tail tail 命令从指定点开始将文件写到标准输出.使用t…...

VIC-3D非接触全场应变测量系统用于小尺寸测量之电子元器件篇—研索仪器DIC数字图像相关技术
在5G通信、新能源汽车电子、高密度集成电路快速迭代的今天,电子元件的尺寸及连接工艺已进入亚毫米级竞争阶段,这种小尺寸下的力学性能评估对测量方式的精度有更高的要求,但传统应变测量手段常因空间尺寸限制及分辨率不足难以捕捉真实形变场。…...
字典与集合——测试界的黑话宝典与BUG追捕术
主题:“字典是测试工程师的暗号手册,集合是BUG的照妖镜” 一、今日目标 ✅ 掌握字典的「键值对暗号体系」与集合的「去重妖法」✅ 开发《测试工程师黑话词典》,让新人秒变老司机✅ 统计自动化测试结果中的高频BUG类型(附赠甩锅指…...

下篇:深入剖析 BLE GATT / GAP / SMP 与应用层(约5000字)
引言 在 BLE 协议栈的最上层,GAP 定义设备角色与连接管理,GATT 构建服务与特征,SMP 负责安全保障,应用层则承载具体业务逻辑与 Profile。掌握这一层,可实现安全可靠的设备发现、配对、服务交互和定制化业务。本文将详解 GAP、GATT、SMP 三大模块,并通过示例、PlantUML 时…...
事务详细介绍
一、简介 1、什么是事务 事务是指一组操作,这些操作要么全部成功执行,要么全部不执行,保证数据的完整性和一致性。事务广泛应用于数据库管理系统、分布式系统和企业级应用中; 2、事务的特性 事务具有四个基本特性,…...
PostgreSQL 中的权限视图
PostgreSQL 中的权限视图 PostgreSQL 提供了多个系统视图来查询权限信息,虽然不像 Oracle 的 DBA_SYS_PRIVS 那样集中在一个视图中,但可以通过组合以下视图获取完整的系统权限信息。 一 主要权限相关视图 Oracle 视图PostgreSQL 对应视图描述DBA_SYS_…...
Python-36:饭馆菜品选择问题
问题描述 小C来到了一家饭馆,这里共有 nn 道菜,第 ii 道菜的价格为 a_i。其中一些菜中含有蘑菇,s_i 代表第 ii 道菜是否含有蘑菇。如果 s_i 1,那么第 ii 道菜含有蘑菇,否则没有。 小C希望点 kk 道菜,且希…...