程序员必知必会7种UML图(类图、序列图、组件图、部署图、用例图、状态图和活动图)画法盘点

众所周知,软件开发是一个分阶段进行的过程。不同的开发阶段需要使用不同的模型图来描述业务场景和设计思路,在不同的阶段输出不同的设计文档也是必不可少的,例如,在需求分析阶段需要输出领域模型和业务模型,在架构阶段需要输出物理架构设计,在详细设计阶段需要输出数据库设计等。这样做可以更好地实践软件开发,并提高软件开发的实用性。

软件建模与设计过程可以分为三个阶段:需求分析、架构设计和详细设计。在这三个阶段中,大量使用符合 UML 规范的模型图,其中常用的有 7 种,包括类图、序列图、组件图、部署图、用例图、状态图和活动图。

在需求分析阶段,使用用例图和领域模型图描述用户需求和业务场景。在架构设计阶段,使用组件图和部署图描述软件系统的组成部分和部署情况。在详细设计阶段,使用类图、序列图和状态图描述软件系统的实现细节。

下面我们将探讨如何绘制这 7 种模型图,以及如何在不同阶段使用这些模型来生成相应的设计文档。

类图

类图是软件设计中使用最广泛的 UML 图形之一,用来描述类的特性以及类之间的静态关系。在一个类图中,每个类都由三个部分组成:类名、属性列表和方法列表。

除了描述类的基本特征,类图还用来表示类之间的关系,其中包括六种静态关系:

  1. 关联(Association):表示一个类对象与另一个类对象之间的关系,比如订单与客户之间的关系。

  2. 依赖(Dependency):表示一个类对另一个类的使用或调用,比如客户下订单时需要使用订单类。

  3. 组合(Composition):表示一种包含关系,表示一个类对象包含另一个类对象,比如一个订单包含多个商品。

  4. 聚合(Aggregation):也表示一种包含关系,但是聚合关系中包含的类对象可以被多个类共享,比如一个学校包含多个班级。

  5. 继承(Inheritance):表示一个类继承自另一个类,可以从父类中继承属性和方法,并且可以添加新的属性和方法。

  6. 泛化(Generalization):与继承关系相似,但泛化关系可以用来表示更抽象的关系,比如多个类都实现了一个接口。

通过绘制类图,我们可以清晰地描述一个软件系统中的类及其之间的关系,帮助开发人员更好地理解软件系统的结构和功能。

在UML工具中把相关的一组类及其关系用一张图画出来,就是类图。

如上图所示,描述的就是一个典型的责任链模式的实现类图。

类图主要是在 详细设计 阶段画,一旦类图设计完成,开发工程师可以根据类图来实现代码。只要类方法的逻辑不是太复杂,不同工程师实现的代码几乎是一样的,这有利于保证软件的规范和统一性。在实际应用中,通常不需要画出所有类的类图,只需要画出核心、代表性、技术难度较高的类图即可。

除了在详细设计阶段绘制类图外,还可以在需求分析阶段使用类图来表示关键领域模型对象。在这个阶段中,我们不要将注意力集中在属性或行为上,而应该专注于识别领域对象及其之间的关系。因此,可以使用简化的类图来描述,只需要绘制类的名称和它们之间的关系即可。

如上所示描述的是在需求分析阶段挖掘出SIM卡、运营商、手机、手机厂商等模型对象之间的关系。

序列图

类图之外,另一种常用的图形是序列图。

类图描述类之间的静态关系,而序列图用于描述参与者之间的动态调用关系。每个参与者都有一条垂直向下的生命线,该生命线用虚线表示。参与者之间的消息按照从上到下的顺序表示它们的调用顺序关系,这就是序列图这个词的来源。每个生命线都有一个激活条,它是图中的细长矩形条,只有在参与者活动时才是激活的。

通常使用序列图表示对象之间的交互,这些对象可以是类对象,也可以是更大的参与者,如组件、服务器、子系统等。总之,只要涉及到不同参与者之间的交互,都可以使用序列图,比如下面这张图就是业务分析阶段,系统建设后完成后的业务流程。

记住,在软件设计的不同阶段都可以使用序列图。

组件图

组件是比类更大粒度的设计元素,通常一个组件中包含多个类。组件图有时与包图的用途相似,通常用于描述物理组件,如JAR、DLL等。在实践中,我们更多地使用组件图进行模块设计。

组件图描述组件之间的静态关系,主要是依赖关系。如果想要描述组件之间的动态调用关系,可以使用组件序列图,以组件作为参与者,描述组件之间的消息调用关系。

由于组件的粒度较大,通常用于描述和设计软件的模块及其之间的关系。因此,在设计的早期阶段就需要画出组件图,一般用于架构设计阶段。

部署图

部署图描述的是软件系统最终的物理部署情况,包括需要部署的服务器数量、关键组件的部署位置等。它是软件系统最终呈现的物理蓝图,能够让客户、老板和工程师清晰地了解系统的最终运行状态,以及与现有系统和第三方服务器的关系。通过部署图,可以预估服务器和第三方软件的采购成本。

因此,部署图是整个软件设计模型中相当宏观的一种图,需要在设计早期就绘制。各方可以根据部署图讨论是否认可该方案,只有对部署图达成共识,才能继续后面的细节设计。部署图主要用于架构设计阶段,并且与组件图要彼此呼应。

用例图

用例图分为业务用例和系统用例,业务用例图主要体现在 业务分析阶段, 描述一个承建系统的组织对外提供的能力,系统用例体现在需求分析阶段描述系统对外提供的能力。

这张图中,左边是业务用例图,右边是系统用例图。虽然它们的画法相似,但它们本质上有很大的区别,具体可以查看我之前写的这篇文章。

图中的人形元素称为角色,角色可以是人也可以是其他系统。由于系统的功能可能很复杂,用例图可能仅包含其中的一小部分功能,这些功能被画在一个矩形框内,这个矩形框是用例边界。矩形框里面的椭圆表示单个功能,它们可以相互依赖或需要扩展。因为用例图中的功能描述相对简单,所以通常需要配以文字说明以形成需求文档。

状态图

状态图用来展现单个对象生命周期中的状态变迁。

在业务系统中,许多重要的领域对象都有相当复杂的状态变化,比如订单,它们可以有待付款、待审核、待发货、待收货、交易关闭和交易完成等各种状态。

这些状态变化可以在用例图中用文本形式描述,并随着各个用户的不同操作而改变。但是,使用这种方法描述状态时,状态会分散到不同的地方,这样可能会导致开发错误以及产品经理在设计时的困惑。

采用UML状态图可以有效地解决这些问题,因为它可以在一张图表中展示对象的整个生命周期以及各个状态和变迁之间的关系。比如下面的图表展示了一个订单从创建到交易完成的状态变化。

状态图要在需求分析阶段画,描述状态变迁的逻辑关系,在详细设计阶段也要画,这个时候,状态要用枚举值表示,以指导具体的开发。

活动图

活动图常用于描述系统或业务流程中的动态行为。它可以清晰地展现从一个活动到另一个活动的控制流,描绘出系统或业务流程的逻辑和流程,让开发人员更好地了解整个系统的运作方式。

在活动图中,实心圆表示流程的开始,空心圆表示流程的结束,圆角矩形表示活动,菱形表示分支判断。这些符号的使用能够使活动图更加规范化和可读性,有助于提高系统开发的效率和质量。

此外,活动图引入了一个重要的概念——泳道。活动图可以根据活动的范围,将活动根据领域、系统和角色等划分到不同的泳道中,使流程边界更加清晰。

流程图也比较有普适性,可以在需求分析阶段描述业务流程,也可以在架构设计阶段描述子系统和组件的交互,还可以在详细设计阶段描述一个类方法内部的计算流程。

使用合适的 UML 模型构建一个设计文档

UML 模型图本身并不难掌握,但如何在正确的场合下用适当的 UML 模型表达设计意图,形成一套清晰且详细的软件模型,并在团队内外达成共识的设计文档则需要注意。

根据软件设计不同阶段的需要,我们可以使用不同的模型图进行建模。

需求分析阶段,我们可以使用用例图、活动图、时序图和简化的类图进行领域模型抽象和关系描述。

架构设计阶段,通过组件图、组件时序图和部署图描述系统物理蓝图和模块关系。

详细设计阶段,主要侧重于类图和类的时序图,而对于复杂的方法逻辑,可以使用方法的活动图进行描述。

小结

掌握类图、时序图、组件图、部署图、用例图、状态图、活动图这七种UML模型图,根据实际场景,在需求分析、架构设计和详细设计阶段选择并巧妙应用对应的模型图,有助于有效地进行软件建模和系统设计,成为一个掌控大局、指导技术团队的优秀架构师。

要注意模型图的规范和注释,遵循命名规范,对模型元素进行命名,注释模型元素的关系和属性等,简洁明了。此外,UML模型图只是设计文档的一部分,需要与其他文档相结合,如需求文档、设计文档、测试文档等,形成一个完整的设计文档,指导软件开发。

对于画UML的工具,有收费的专业软件设计工具像EA(Enterprise Architect) 、Astah和亿图,以及免费的在线工具比如draw.io,processon等,建议可以根据自身需要选择合适的工具,同时也建议从简单易用的工具入手。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/7876.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023疫情当头,3个月转行软件测试拿下8k+offer,我心满意足了

从2020年的疫情开始,全世界好像按下了暂停键一般,大量新网民涌入互联网。我们的生活方式也随之改变,失业也如洪流般席卷整个世界,宅家的人数在变多,当然大多数人开始寻求新的工作方式,随之进军互联网的人开…

域名过户操作流程及常见问题

模板添加及模板过户操作流程: 一、添加模板操作流程: 1.在业务管理-域名管理-模板管理中找到“添加模板” 2.选择所有者类型(个人或是企业/组织),填写新的域名所有者资料,填写无误后点击“确定”。 目前…

记录分享vscode里面非常好用的两个markdown插件

文章目录Markdown PDFMarkdown All in One效果图Markdown PDF 主要用于将markdown文件转为pdf文件 使用方法 安装此插件编辑区鼠标右键就会出来一个弹框,在弹框里面选择 Markdown All in One 我主要用它来生成文章的目录结构,然后转为pdf文件后,目录结构默认就是pdf文章目录,…

告别至暗时刻,高端与全系列手机市场前景可期

作者|落笔 近年来,智能手机用户换机周期持续拉长,市场出货量逐年走低,IDC数据显示,2022年全年中国智能手机市场出货量约2.86亿台,同比下降13.2%,创有史以来最大降幅,全球智能手机发展已进入成熟…

大厂研发成本大曝光,研发占大头

近日,腾讯发布《2022 年腾讯研发大数据报告》,披露了 2022 年腾讯在研发投入、研发效能、开源协同等方面的重要数据。 《报告》显示,2022 年腾讯内部研发人员占比达到 74%,这意味着,平均每四个腾讯员工中,…

linux 共享内存 shmget

专栏内容:linux下并发编程个人主页:我的主页座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.目录 前言 概述 原理机制 系统命令 接口说明 代码演示 结尾 前言 本专栏主要分享linu…

【深度解刨C语言】内存管理(详)

文章目录前言一.动态内存1.动态内存的用处2.内存的布局简单证明内存布局栈向下生长的证明堆向上增长的证明3.malloc与free进一步理解总结前言 前提: 内存有基本的认识 内存函数基本的了解 如果你对内存与内存函数太不清楚可以看:动态内存管理 目标: 为什么要用动态内存&…

我体验了首个接入GPT-4的代码编辑器,太炸裂了

最近一款名为Cursor的代码编辑器已经传遍了圈内,受到众多编程爱好者的追捧。 它主打的亮点就是,通过 GPT-4 来辅助你编程,完成 AI 智能生成代码、修改 Bug、生成测试等操作。 确实很吸引人,而且貌似也能大大节省人为的重复工作&…

vue尚品汇商城项目-day04【29.加入购物车操作(难点)】

文章目录29.加入购物车操作(难点)29.1加入购物车按钮29.2addCartSuce29.3购物车29.3.1 向服务器发送ajax请求,获取购物车数据29.3.2UUID临时游客身份29.3.3动态展示购物车29.4修改购物车产品的数量(需要发请求:参数理解…

203. 移除链表元素

1、题目 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5]示例 2: 输入&…

File 类的用法和 InputStream, OutputStream,System 类的用法

🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!人生格言:当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔🦾&am…

Typescript学习笔记(一)

什么是TypeScript? TypeScript 是添加了类型系统的 JavaScript,适用于任何规模的项目。 TypeScript 是一门静态类型、弱类型的语言。 安装TypeScript npm install -g typescript编译 tsc hello.tsTypeScript 只会在编译时对类型进行静态检查,如果发…

iOS 内存管理机制与原理

内存分区 内存一般分为五大区:栈区、堆区、常量区、全局区、代码区。如图 1.栈区 是由编译器自动分配并释放的,主要用来存储局部变量、函数的参数等,是一块连续的内存区域,遵循先进后出(FILO)原则。一般在…

WebAssembly 助力云原生:APISIX 如何借助 Wasm 插件实现扩展功能?

本文将介绍 Wasm,以及 Apache APISIX 如何实现 Wasm 功能。 作者朱欣欣,API7.ai 技术工程师 原文链接 什么是 Wasm Wasm 是 WebAssembly 的缩写。WebAssembly/Wasm 是一个基于堆栈的虚拟机设计的指令格式。 在 Wasm 未出现之前,浏览器中只能…

Hadoop(伪分布式)+Spark(local模式)搭建Hadoop和Spark组合环境

一、安装Hadoop环境使用Ubuntu 14.04 64位 作为系统环境(Ubuntu 12.04,Ubuntu16.04 也行,32位、64位均可),请自行安装系统。Hadoop版本: Hadoop 2.7.4创建hadoop用户如果你安装 Ubuntu 的时候不是用的 "hadoop&qu…

研究的艺术 (The craft of research) 读书笔记

前言 如果你对这篇文章感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 对于研究者而言,写作是一件很重要的事,好的写作不仅能让更多人愿意读,获得更大影响力&…

Windows系统配置SSH服务

1.安装OpenSSH 打开【设置】-【应用】 选择【管理可选功能】 点击【添加可选功能】 选择【OpenSSH 服务端】,切记不是【OpenSSH 客户端】(如果安装一个不行,就都安装,我都安装了可以用),然后点击下载即可 …

ERP系统如何让项目管理更轻松?

项目管理是许多企业的首要任务,通常有一个ERP系统来协助他们。然而,一些企业仍然没有意识到,ERP解决方案可以使他们的项目管理更容易。项目管理需要有一个目标,并在你朝着完成项目前进的过程中控制变量,而ERP系统指导你…

成都北大青鸟怎么样?

对于任何一个培训机构的了解大概的流程是:听说名字——网上搜索,可以看到机构官网,也会看到机构广告,当然也会看到各种有好有坏的评论,到这里会对机构形成初印象;然后如果身边有培训出身的小伙伴会去询问对…

【C语言进阶:自定义类型详解】联合(共用体)

本节重点内容: 联合类型的定义联合的特点联合大小的计算⚡联合类型的定义 联合也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。 为了方便大家理解举个例子…
最新文章