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

从理论到实践掌握UML

统一建模语言(UML)是软件工程师用来设计软件系统的一种工具,就像是一套图形化的说明书。它让开发团队能够以图形化的方式来理解、设计和开发软件系统,比起用文字来描述,更加直观易懂。本文通过UML实例化的理论和实践相合,以电商系统为例,演示如何将UML实例化应用于实际项目中。无论您是软件工程师、系统分析师还是对软件开发感兴趣的学习者,希望有助于大家深入了解如何将UML应用于解决实际的软件工程问题。

一.UML 基础概念

1.类和对象

理解类和对象的概念是学习面向对象编程(OOP)和面向对象建模(OOM)的基础。

(1).类和对象的概念

类是对具有共同属性和行为的对象进行抽象定义。如商品类可以定义名称、价格、描述等共同属性,以及查看、添加到购物车等共同行为。每个具体的商品实例都是商品类的一个实例,比如一台手机、一本书等。

  • 对象

对象代表了系统中的一个实体,它是属性和行为的结合体。对象不仅包含属性,还包含了可以对这些属性进行操作的行为。举例来说,如果我们考虑一个电商系统,每个具体的商品、用户、订单等都可以作为一个对象。商品的名称、价格、描述等这些就是对象属性,商品可以查看、添加到购物车等这些就是行为。因此,对象实际上是属性和行为的组合,它能够记录操作的结果并且执行特定的行为。

(2).类的属性、方法(行为)

属性是描述对象特征的数据,也称为成员变量或实例变量。它们定义了对象的状态。方法(行为)是对象能够执行的操作,用于改变对象的状态或执行特定的功能。它们定义了对象的行为。如:

  • 用户类

    **属性:**用户类的属性可以包括用户名、密码、邮箱等。

    **方法:**用户类的方法可以包括注册、登录等。

  • 商品类

    **属性:**商品类的属性可以包括商品名称、价格、库存等。

    **方法:**商品类的方法可以包括添加到购物车、购买等。

  • 订单类

    **属性:**订单类的属性可以包括订单号、用户、总量、总价、状态
    等。

    **方法:**订单类的方法可以包括支付、取消、发货等。

2.类之间的关系

(1).关联关系

关联关系描述了两个或多个对象之间的联系。在关联关系中,每个对象都保留自己的生命周期,它们之间的关系可以是一对一、一对多或多对多。关联关系是最常见的关系类型之一。

如在电商系统中,订单类与用户类之间存在关联关系。一个订单被创建时,通常会指定一个用户作为订单的拥有者,因此订单类将会与用户类相关联。

表示元素:箭头连接两个类,箭头上标注的文字描述关联的性质,如 “has-a”、“uses” 等。

(2).聚合关系

聚合关系表示一种整体与部分之间的关系,即一个对象包含另一个对象,但它们之间不是强依赖关系,即便整体对象不存在,部分对象仍然可以存在。聚合关系通常用“整体-部分”的形式来表示。

如在电商系统中,购物车类与商品类之间存在聚合关系。购物车包含了多个商品,但商品可以独立存在,即使购物车被销毁,商品也可以继续存在。

表示元素:一个空心菱形连接到整体类的一端,箭头指向部分类。

(3).组合关系

组合关系是一种更强的聚合关系,表示整体对象拥有部分对象,并且整体对象的生命周期决定了部分对象的生命周期。如果整体对象被销毁,部分对象也会被销毁。组合关系通常用“整体-部分”的形式来表示,并且部分对象的创建和销毁由整体对象管理。

如在电商系统中,订单类与订单项类之间存在组合关系。订单项是订单的一部分,它们只存在于订单的上下文中。如果订单被取消或删除,订单项也会被销毁。

表示元素:一个实心菱形连接到整体类的一端,箭头指向部分类。

(4).依赖关系

依赖关系表示一个类(或模块)在其实现中使用了另一个类(或模块)的功能或服务。在软件设计中,这种依赖通常表现为一个类的方法中使用了另一个类的对象。

如在电商系统中,订单服务类可能需要使用用户服务类来获取用户信息。订单服务在执行订单处理时需要根据用户信息进行一些操作,比如验证用户身份或获取配送地址。因此,订单服务类依赖于用户服务类。

表示元素:通常用箭头从依赖者指向被依赖者。

(5).继承关系(泛化关系)

继承关系(泛化关系)是面向对象设计中的一种关系,用于表示类之间的继承关系。在泛化关系中,一个类(子类)可以继承另一个类(父类)的属性和方法,并且可以在此基础上添加新的属性和方法。

在电商系统中,泛化关系可以用来表示不同类型商品之间的继承关系。例如,有普通商品、电子商品和服装商品等不同类型的商品,它们都具有一些共同的属性和方法,比如商品名称和价格。因此,可以定义一个通用的商品类作为父类,然后具体的商品类型类可以继承这个通用的商品类。

表示元素:通常用一个空心的三角箭头从子类指向父类来表示。

(6).实现关系

实现关系表示一个类实现了一个接口或抽象类,从而承诺要实现接口或抽象类中定义的所有方法。这种关系通常用于定义类与类之间的协议或契约,以确保类能够提供特定的行为。

可以使用实现关系来定义各种服务类与接口之间的关系。例如,可以有一个支付服务接口,定义了各种支付方式应该具有的方法,比如支付、退款等。然后具体的支付服务类可以实现这个接口,以提供不同支付方式的具体实现。

表示元素:通常用一个空心三角箭头从实现类指向接口来表示。

二.UML 建模

1.UML 图形

在 UML 中,有多种图形表示方式用于不同的建模目的。以下是常见的 UML 图形表示方式。

Visio 中可用的 UML 关系图分为两类关系图:行为图和结构图。

2.应用场景

3.UML 工具

(1).绘图工具:掌握使用 UML 绘图工具,如 Visio、Lucidchart、StarUML 等,进行 UML 图的绘制和编辑。本文使用的Microsoft Visio 专业版 2019以例。

(2).启动 Visio。 或者,如果已打开文件,请单击“ 文件 > 新建”。

(3). 转到 “类别 > 软件和数据库 > UML 组件”,就可以根据需要选择要绘制的图型,进行建模。如下图:

三. UML建模实例

1.功能需求描述

实现电商系统的消费者购物功能,需要包括如下内容:

(1). 参与者(消费者):游客、会员;

(2). 活动过程:搜索、添加购物车、下单、付款;

(31). 其中:搜索又可以按价格、品牌等条件进行扩展筛选;付款可以通过支付宝、微信或网上银行等方式。

2.UML建模

根据上述需求,绘制常用的UML图形。

(1).用例图

  • 用于描述系统的功能需求和用户之间的交互。就像是系统的用户手册,如描述了系统的各种功能和用户如何与系统进行交互。在开发项目的早期阶段,使用用例关系图来描述实际活动和动机。 可以在后续阶段优化关系图,以反映用户界面和设计详细信息。
  • 理解主要元素符号:

  • 绘制流程

    明确系统范围。

    有什么角色,角色与角色之间关系

    有什么用例,角色与用例之间关系,用例的子用例及扩展。

如上述要求可以包括搜索商品、添加到购物车、下单、支付等功能,每个功能都是一个用例,用箭头表示用户和系统之间的交互流程。

从用例图中可以非常清晰的看到:

  • 包括了游客、会员两种参与者(消费者);
  • 电商系统的前端选购的四个过程;
  • 按条件进行搜索,这是对搜索功能的扩展,而不同的条件是筛选搜索的泛化;
  • 付款包含了支付宝、微信、银行卡三种方式;

上图清晰并简洁的描述了用户、需求和系统主要功能之间的关系,这便是用例图最大的优点。

(2).活动图

  • 活动图强调了用例中各项活动之间的约束关系及其控制流程,说白了活动图用于展示系统中一个功能(用例)的操作步骤。活动图类似于流程图。 控制流通过完成系统中的操作 (或 活动) 触发。 流可以是顺序流、并发流或分支流,由泳道、分支和联接等形状指示。使用活动图描述如何协调多个活动来提供服务或其他最终结果。 活动图可以显示用例中的事件如何相互关联,或者用例集合如何协调以表示业务工作流。
  • 理解主要元素符号:
  • 绘制流程

    明确该流程要表达怎么样的业务目的?

    该流程有什么角色?

    画出正常情况下的流程,是流程的主干,一般是线性的流程。

    明确主干流程中的角色与活动

    逐步增加分支流程,将关键的流程分支画出,部分异常流程可简单画出并用文字说明

    适当控制活动粒度

    优化流程

如上述需求可以使用活动图进行类似如下的绘图:

从图中可以清晰的看到,用户从登录到购物结束的整个活动过程,并能看到每个活动所对应的对象,这在业务流程梳理环节能带来很大的帮助。

(3).顺序图(序列图)

  • 顺序图通过引入时间的概念,展示了用例中各个对象的行为顺序以及对象之间的消息交互过程,所以顺序图也叫做时序图。
  • 理解主要元素符号:

  • 绘制流程

    针对某一条流程中分析各角色的交互方式时先分析有哪些角色参与这个流程

    分析各角色在这个流程中的职责,各角色的专业特色

    将流程分解为角色与角色之间的交互,想清楚各角色之间的“接口”是怎样的

    用顺序图按照时间顺序将“交互”动作组织起来

    适当控制好粒度,不断优化和重组。有太复杂分支机构的流程不适用。

如上述需求可以使用顺序图进行类似如下的绘图:

从上图可以清晰的看到随着时间变化,用户与用例中其他对象的消息交互顺序,这可以提供了更加简洁有效的沟通方式。

(4).类图

  • 类图是用于描述系统/产品结构化设计的静态图形,显示了类、类的方法、类的接口以及它们之间静态结构和关系。
  • 理解主要元素符号:

  • 绘制流程

    识别类,先记下类的名称

    识别出类的主要属性、操作

    描绘出类之间的关系

    对各类进行分析、抽象、整理

如下所示:

(5).组件图

  • 组件图用于描述系统中的组件及其之间的依赖关系。组件图显示了软件系统的物理组织结构,包括组件、接口、依赖关系等,有助于理解系统的结构和组织。
  • 理解主要元素符号:

如下所示:

(6).部署图

  • 部署图用于描述系统中的物理部署结构,包括硬件设备、软件组件和它们之间的关系。部署图显示了系统的物理拓扑结构,有助于理解系统的部署环境和配置方式。
  • 理解主要元素符号:

如下所示:

相关文章:

从理论到实践掌握UML

统一建模语言(UML)是软件工程师用来设计软件系统的一种工具,就像是一套图形化的说明书。它让开发团队能够以图形化的方式来理解、设计和开发软件系统,比起用文字来描述,更加直观易懂。本文通过UML实例化的理论和实践相…...

LabVIEW Windows与RT系统的比较与选择

LabVIEW是一种系统设计和开发环境,广泛应用于各类工程和科学应用中。LabVIEW Windows和LabVIEW RT(Real-Time)是LabVIEW的两个主要版本,分别适用于不同的应用场景。以下从多个角度详细分析两者的区别,并提供选择建议。…...

docker搭建mongo副本集

1、mongo集群分类 MongoDB集群有4种类型,分别是主从复制、副本集、分片集群和混合集群。 MongoDB的主从复制是指在一个MongoDB集群中,一个节点(主节点)将数据写入并同步到其他节点(从节点)。主从复制提供…...

关于Pytorch转换为MindSpore的一点建议

一、事先准备 必须要对Mindspore有一些了解,因为这个框架确实有些和其它流程不一样的地方,比如算子计算、训练过程中的自动微分,所以这两个课程要好好过一遍,官网介绍文档最好也要过一遍 1、零基础Mindspore:https://…...

JetBrains IDEA 新旧UI切换

JetBrains IDE 新旧UI切换 IntelliJ IDEA 的老 UI 以其经典的布局和稳定的性能,成为了许多开发者的首选。而新 UI 则在此基础上进行了全面的改进,带来了更加现代化、响应式和高效的用户体验。无论是新用户还是老用户,都可以通过了解和适应这…...

iOS KeychainAccess的了解与使用

KeychainAccess 是一个用于 iOS、macOS、tvOS 和 watchOS 上的 Swift 密钥链访问库。它提供了一个简单且安全的 API,用于在设备的密钥链中存储和检索数据。 KeychainAccess 的一些主要特点包括: 简单易用的 API:该库提供了一个直观的 API,可以轻松地将数据存储和检…...

STM32 Customer BootLoader 刷新项目 (二) 方案介绍

STM32 Customer BootLoader 刷新项目 (二) 方案介绍 文章目录 STM32 Customer BootLoader 刷新项目 (二) 方案介绍1. 需求分析2. STM32 Memery介绍3. BootLoader方案介绍4. 支持指令 1. 需求分析 首先在开始编程之前,我们先详细设计一下BootLoder的方案。 本项目做…...

2-14 基于matlab的GA优化算法优化车间调度问题

基于matlab的GA优化算法优化车间调度问题。n个工作在m个台机器上加工。已知每个工作中工序加工顺序、各工序的加工时间以及每个工件所包含的工序,在满足约束条件的前提下,目的是确定机器上各工件顺序,以保证某项性能指标最优。程序功能说明&a…...

Program-of-Thoughts(PoT):结合Python工具和CoT提升大语言模型数学推理能力

Program of Thoughts Prompting:Disentangling Computation from Reasoning for Numerical Reasoning Tasks github:https://github.com/wenhuchen/Program-of-Thoughts 一、动机 数学运算和金融方面都涉及算术推理。先前方法采用监督训练的形式,但这…...

ansible setup模块

用于收集有关目标主机的系统和网络信息,并将这些信息存储为一个facts变量,可以在Playbook的后续任务中使用。setup模块可以用来获取主机的操作系统、软件包、IP地址、内存、磁盘和其他硬件信息。这些信息对编写Playbook和进行条件判断非常有用。当你在Pl…...

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的测试用例执行计划(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 https://app5938.acapp.acwing.com.cn/contest/2/problem/OD…...

NSIS 入门教程 (一)

介绍 大多数应用程序都附带一个安装程序,它将所需的文件复制到正确的文件夹中,创建注册表项,并提供卸载例程以(希望)从计算机中彻底删除应用程序. 有多种解决方案可以为自主开发的应用程序配备安装程序。除了Install …...

cve-2015-3306-proftpd-vulfocus

1.原理 proftp是用于搭建基于ftp协议的应用软件 ProFTPD是ProFTPD团队的一套开源的FTP服务器软件。该软件具有可配置性强、安全、稳定等特点。 ProFTPD 1.3.5中的mod_copy模块允许远程攻击者通过站点cpfr和site cpto命令读取和写入任意文件。任何未经身份验证的客户端都可以…...

超详细!想进华为od的请疯狂看我!

三分钟带你全面了解华为OD 【合同及管理】签约方为科锐国际/外企德科(人力服务公司),劳动合同期为4年,试用期6个月。员工关系合同管理、五险一金、考勤发薪由科锐国际/外企德科负责;定级定薪、员工培训、工作安排、绩…...

MQTT协议与TCP/IP协议在性能上的区别

MQTT协议与TCP/IP协议在性能上的区别主要体现在以下几个方面: 1.协议开销与传输效率: ① MQTT:MQTT协议针对消息传递进行了优化,使用了小型的控制包和变长的包头设计,极大程度地减少了数据传输过程中的冗余和带宽消耗…...

LeetCode 每日一题 2024/6/17-2024/6/23

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 6/17 522. 最长特殊序列 II6/18 2288. 价格减免6/19 2713. 矩阵中严格递增的单元格数6/20 2748. 美丽下标对的数目6/21 LCP 61. 气温变化趋势6/22 2663. 字典序最小的美丽字…...

FlinkCDC pipeline模式 mysql-to-paimon.yaml

flinkcdc 需要引入: source端: flink-cdc-pipeline-connector-mysql-xxx.jar、mysql-connector-java-xxx.jar、 sink端: flink-cdc-pipeline-connector-paimon-xxx.jar flinkcdc官方提供connect包下载地址,pipeline模式提交作业和…...

mysql数据库入门手册

数据库 常见的数据库查看当前用户及其权限创建用户授权用户访问数据库撤销用户权限修改用户密码删除用户增创建一个数据库创建表表中插入数据表中添加字段(三种方式) 删删除表记录删除表字段删除表(三种方式)删除数据库 改修改表名…...

增强大型语言模型(LLM)可访问性:深入探究在单块AMD GPU上通过QLoRA微调Llama 2的过程

Enhancing LLM Accessibility: A Deep Dive into QLoRA Through Fine-tuning Llama 2 on a single AMD GPU — ROCm Blogs 基于之前的博客《使用LoRA微调Llama 2》的内容,我们深入研究了一种称为量化低秩调整(QLoRA)的参数高效微调&#xff0…...

空间复杂度 线性表,顺序表尾插。

各位少年,大家好,我是那一脸阳光,本次分享的主题是时间复杂度和空间复杂度 还有顺序表文章讲解和分享,如有不对可以评论区指导。 时间复杂度例题 // 计算斐波那契递归Fib的时间复杂度? long long Fib(size_t N){if(N…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...