当前位置: 首页 > 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创建用户、切换用户、删除用户

创建用户 # 创建新用户 sudo useradd newuser# 设置新用户的密码 sudo passwd newuser切换用户 # 切换到新用户 su newuser# 验证用户切换 whoami 删除用户 # 删除用户 sudo userdel -r username# 验证用户是否已被删除 grep username /etc/passwd 如果删除用户时提示&…...

BC64 牛牛的快递(c++)

牛牛的快递 题目描述输入描述输出描述示例代码 解题思路例如 题目描述 牛牛正在寄快递,他了解到快递在 1kg 以内的按起步价 20 元计算,超出部分按每 kg 1元计算,不足 1kg 部分按 1kg计算。如果加急的话要额外付五元,请问牛牛总共要…...

离线linux通过USB连接并使用手机网络

离线linux通过USB连接并使用手机网络 引场景 引 离线环境要安装一些软件特别麻烦,要自己去官网下载对应的包,然后上传到服务器上,再解压,编译,执行,配置变量等等,错一步都可能安装失败。有网络…...

I2C总线8位IO扩展器PCF8574

PCF8574用于I2C总线的远程8位I/O扩展器 PCF8574国产有多个厂家有替代产品,图示为其中一款HT8574 1 产品特点 低待机电流消耗:10 uA(最大值) I2C 转并行端口扩展器 漏极开路中断输出 与大多数微控制器兼容 具有大电流驱动能力的闭…...

webClient + fastJSON2 获取json格式的数据,同时解析至java class 并 下划线转驼峰

webClient中 .accept(MediaType.APPLICATION_JSON) 决定返回值是什么格式一般情况可以不写,但这里要获取JSON格式的 .bodyToMono(String.class)指定返回类型 fastJSON2中 Student student JSON.parseObject(result, Student.class, JSONReader.Feature.SupportSm…...

4、SpringMVC 实战小项目【加法计算器、用户登录、留言板、图书管理系统】

SpringMVC 实战小项目 3.1 加法计算器3.1.1 准备⼯作前端 3.1.2 约定前后端交互接⼝需求分析接⼝定义请求参数:响应数据: 3.1.3 服务器代码 3.2 ⽤⼾登录3.2.1 准备⼯作3.2.2 约定前后端交互接⼝3.2.3 实现服务器端代码 3.3 留⾔板实现服务器端代码 3.4 图书管理系统准备后端 3…...

OpenCV--形态学

形态学 形态学图像全局二值化自适应阈值腐蚀操作膨胀开运算闭运算形态学梯度顶帽操作黑帽操作 形态学 从图像中提取对表达和描绘区域形状有意义的图像分量 图像全局二值化 import cv2 import numpy as np """ 图像全局二值化--0与255 二值化的主要目的是通过…...

【LinuxC语言】IP地址相关的函数

文章目录 前言inet_addr()inet_aton()inet_ntoa()示例代码总结前言 在Linux C语言编程中,处理网络通信是一个核心主题,其中涉及到的IP地址相关函数扮演着至关重要的角色。这些函数允许我们在不同的网络层次上操作和管理IP地址,从而实现有效的数据传输和通信控制。本文将介绍…...

QT事件处理系统之五:自定义事件的发送案例 sendEvent和postEvent接口

1、案例 双击窗口,会发送 自定义事件,然后在事件过滤中心进行拦截处理自定义事件。 2、核心代码 /*解释:双击窗口时,将产生双击事件,然后该事件被包裹成一个对象,随后将会被发往event事件中心,然后进行事件的处理(Widget对象);因为m_lineEdit开启了事件过滤机制,所…...

模版与策略模式

一,怎么选择 如果需要固定的执行流程,选模版 如果不需要固定的执行流程,只需要对一个方法做具体抽象,选策略 参考文章: 常用设计模式汇总,告诉你如何学习设计模式 二,常用写法 子类 exten…...