统一建模语言(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 图形表示方式。
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).部署图
- 部署图用于描述系统中的物理部署结构,包括硬件设备、软件组件和它们之间的关系。部署图显示了系统的物理拓扑结构,有助于理解系统的部署环境和配置方式。
- 理解主要元素符号:
如下所示: