从理论到实践掌握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).部署图

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

如下所示:

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

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

相关文章

【漏洞复现】蓝凌EIS api.aspx 任意文件上传漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

指针的深入理解(3)(包括数组名的理解、一维数组传参的本质以及指针数组的相关知识及使用)

文章目录 1 数组名的理解2 使用指针访问数组3 一维数组传参的本质4 指针数组5 指针数组的使用 1 数组名的理解 当我们运行以下代码&#xff1a; #include <stdio.h> int main() {int arr[10] { 0 };printf("%p\n", &arr[0]);printf("%p\n", a…

矩阵中严格递增的单元格数

class Solution { public:int maxIncreasingCells(vector<vector<int>>& mat) {int m mat.size(), n mat[0].size();// 开辟用来记录每个值对应的位置&#xff08;i,j&#xff09;map<int, vector<pair<int, int>>> mp;vector<int> …

收银系统源码-千呼新零售2.0【线下促销】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

文件重命名 一键批量重命名10万+文件 简单效率高!

单个文件重命名大家应该都会操作&#xff0c;但是有一些人由于工作的场景等的情况&#xff0c;需要做大量的文件重命名&#xff0c;比如影楼、电商、仓库管理、图片处理等各种行业&#xff0c;都经常需要把一批文件&#xff0c;按一定的格式和规律给文件重命名。 一、批量文件重…

创建Docker容器与外部机通信(独立IP的方式)

需求&#xff1a;希望外部可以直接通过不同IP地址访问宿主机上的Docker容器&#xff0c;而不需要端口映射&#xff08;同一个IP不同的端口与外部通讯&#xff09;&#xff0c;这通常涉及到在宿主机的网络层面进行更高级的配置&#xff0c;比如使用IP伪装&#xff08;IP masquer…

HTML李峋同款跳动的爱心代码(双爱心版)

目录 写在前面 跳动的爱心 完整代码 代码分析 系列推荐 最后想说 写在前面 在浩瀚的网络世界中&#xff0c;总有一些小惊喜能触动我们的心弦。今天&#xff0c;就让我们用HTML语言&#xff0c;探索既神秘又浪漫的李峋同款跳动的爱心代码吧。 首先&#xff0c;让我们一起…

Linux系统编程——进程信号

目录 一&#xff0c;信号预备 1.1 生活中的信号 1.2 技术应用中的信号 1.3 signal函数捕捉信号 1.3 信号的发送与记录 1.4 信号的常见处理方式 二&#xff0c;信号的产生 2.1 核心转储 2.1.1 环境配置 2.1.2 利用core文件进行调试 2.1.3 core dump标志 2.2 通过系统…

【C语言】解决C语言报错:Null Pointer Dereference

文章目录 简介什么是Null Pointer DereferenceNull Pointer Dereference的常见原因如何检测和调试Null Pointer Dereference解决Null Pointer Dereference的最佳实践详细实例解析示例1&#xff1a;未初始化的指针示例2&#xff1a;释放内存后未将指针置为NULL示例3&#xff1a;…

STM32HAL库--NVIC和EXTI

1. 外部中断实验 1.1 NVIC和EXTI简介 1.1.1 NVIC简介 NVIC 即嵌套向量中断控制器&#xff0c;全称 Nested vectored interrupt controller。是ARM Cortex-M处理器中用于管理中断的重要组件。负责处理中断请求&#xff0c;分配优先级&#xff0c;并协调中断的触发和响应。 它是…

【会议征稿,IEEE出版】第四届电气工程与机电一体化技术国际学术会议(ICEEMT 2024,7月5-7)

第四届电气工程与机电一体化技术国际学术会议&#xff08;ICEEMT 2024&#xff09;定于2024年7月5-7日在浙江省杭州市隆重举行 。会议主要围绕“电气工程”、“机电一体化” 等研究领域展开讨论&#xff0c;旨在为电气工程、机电一体化等领域的专家学者、工程技术人员、技术研发…

STM32项目分享:智慧农业(机智云)系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.c…

如何灵活运用keil工具进行问题分析(2)— 定位FreeRTOS的栈溢出导致hardfault问题

前言 &#xff08;1&#xff09;如果有嵌入式企业需要招聘湖南区域日常实习生&#xff0c;任何区域的暑假Linux驱动实习岗位&#xff0c;可C站直接私聊&#xff0c;或者邮件&#xff1a;zhangyixu02gmail.com&#xff0c;此消息至2025年1月1日前均有效 &#xff08;2&#xff0…

【会议征稿,JPCS出版】第四届测量控制与仪器仪表国际学术会议(MCAI 2024,7月19-21)

随着各行各业向智能化、自动化、信息化方向发展&#xff0c;对于精密测量与控制的需求日益增加。同时该专业人才在科学研究、制造业、互联网等领域就业前景也非常广阔。测控技术与仪器是现代工程与科技的重要领域之一&#xff0c;为各行各业提供精准、可靠的测量、控制和检测手…

LuckySheet导入报错file.match is not a function解决方法

最近在研究有什么类Excel的表格库。目前看到的话就是luckysheet和univer。 univer是luckysheet的升级版&#xff0c;问题是开源版没有提供导入导出功能。 在尝试luckysheet的导入功能的时候&#xff0c;会发现官方demo是没有报错的。而在自己的项目里就会有报错 导入呢是官方提…

jsp运行提示_jsp.java某行存在错误问题的解决

jsp运行提示XXX_jsp.java某行存在错误问题的解决 在编译运行jsp文件时&#xff0c;出现类似如下提示&#xff1a; 49行发生错误&#xff0c;要注意&#xff1a; 这里所指的49行并非jsp文件的第49行&#xff0c;而是编译后的jsp.java文件的第49行。 因此&#xff1a;解决问题…

FreeRTOS,使用SDIO外设会进入Hard FaultHandler

解决方法&#xff1a; 1.读写函数中&#xff0c;要使能所有中断。 2.读写缓冲数组为全局变量 3.任务堆栈开辟的大点

process is not defined

最近在开发项目中莫名遇到这个问题&#xff0c;网上查阅很多资料&#xff0c;上面的解决办法都不管用。最后在node_modules中找到path-browserify模块&#xff0c;修改index.js文件&#xff1a; 将process.cwd()注释&#xff0c;改为cwd __dirname,然后重启项目就好了。

教育与学习助手:Kompas AI革新学习体验

一、引言 在个性化学习需求日益增长的今天&#xff0c;教育领域正经历着一场技术革命。Kompas AI&#xff0c;作为一款先进的人工智能助手&#xff0c;正以其独特的功能和应用&#xff0c;为学习者提供个性化的学习支持&#xff0c;满足不同背景和需求的学生。 二、功能介绍 Ko…

kotlin区间

1、创建 fun main() {// 全闭区间val intRange 1..3 // int 区间val charRange a..c // 字符区间// 打印println(intRange.joinToString()) // 1,2,3println(charRange.joinToString()) // a,b,c// 左闭右开区间val intRangeExclusive 1 until 3// 倒叙全闭区间val intDown…