de_DEen_USes_ESfa_IRfr_FRid_IDjapl_PLpt_PTru_RUvizh_CNzh_TW

使用 PlantUML 和 VPasCode 将 UML 用例图作为代码

UML 用例图展示了系统提供的内容以及与之交互的对象(人或事物)。在“图即代码”的工作流中,图的源文件是纯文本:编辑文本、渲染图表,并将源文件与项目文档一同保存。

展示 PlantUML 工作流的图表:编辑源代码、为在线商店渲染 UML 用例图,并使用 VPasCode 将两者并排进行文档记录。

PlantUML 支持用例图。Visual Paradigm 的 VPasCode 编辑器提供 PlantUML 编辑器和预览功能,并具备 AI 辅助的图表生成与编辑特性。

1. 用例图传达的内容

用例图侧重于系统范围和用户目标而非工作流的逐步操作细节。图表通常包含:

UML 用例图符号参考,展示系统边界、参与者、用例、关联以及包含、扩展和泛化等关系。

  • 系统边界:一个矩形框,用于命名被建模的系统。

  • 参与者:系统外部的角色,与系统进行交互。参与者可以是人、组织、设备或外部系统。

  • 用例:系统提供的一种能力或目标,通常以椭圆形表示,并用动词短语命名,例如“下订单”。

  • 关联:一条表示参与者参与某个用例的连线。

  • 用例关系:包含、扩展和泛化。

参与者代表角色,而非具体个人。如果外部支付服务与所建模的系统进行交互,它也可以被视为一个参与者。

用例图有助于明确系统范围、与利益相关者讨论需求、识别外部依赖,并为开发和测试提供统一的概览。当需要详细信息(如前置条件、主要步骤、备选流程和结果)时,应将用例图与书面用例描述配合使用。

2. 关系一览

UML 用例关系图,通过示例和方向箭头说明关联、包含、扩展和泛化。

  • 参与者与用例的关联:一条表示交互的普通连线。

  • <<包含>>:包含用例始终使用被包含的行为。虚线箭头指向从包含用例指向被包含用例。例如,下订单可能始终包含支付授权。

  • <<扩展>>:扩展用例在特定条件下为基本用例添加行为。虚线箭头指向从扩展用例到基础用例。例如,应用促销可能会扩展下单操作。

  • 泛化:专用参与者或用例继承自更通用的元素。带空心三角形的实线指向通用元素.

一个有用的区分:include 表示必需行为;extend 表示条件性附加行为。

3. PlantUML 基础

PlantUML 图表以@startuml开始,以@enduml声明参与者使用actor,声明用例使用usecase,声明系统边界使用rectangle。别名使元素在关系中的引用更加便捷。

VPasCode 界面显示在线商店用例图的 PlantUML 代码及其渲染输出,展示客户与系统边界的交互。

@startuml
left to right direction

actor Customer

rectangle "Online Store" {
  usecase "Browse products" as Browse
  usecase "Place order" as Place
}

Customer --> Browse
Customer --> Place
@enduml

从左到右方向指示 PlantUML 将图表水平布局。随着图表的变化,PlantUML 可能会调整精确的布局。

4. 示例:基本在线商店

VPasCode 界面显示一个 UML 用例图,其中客户参与者与下订单、应用促销和授权支付用例进行交互。

@startuml
left to right direction

actor Customer
actor Administrator as Admin

rectangle "Online Store" {
  usecase "Browse products" as Browse
  usecase "Place order" as Place
  usecase "Track shipment" as Track
  usecase "Manage catalog" as Manage
}

Customer --> Browse
Customer --> Place
Customer --> Track
Admin --> Manage
@enduml

客户可以浏览商品、下单并跟踪发货。管理员负责管理商品目录。该图表有意省略了订单处理内部的步骤。

5. 示例:include 和 extend

假设下单总是需要支付授权,而应用促销则是可选且有条件的。

VPasCode 界面显示 PlantUML 代码及生成的 UML 图,展示“下订单”用例包含“授权支付”并扩展“应用促销”。

@startuml
left to right direction

actor Customer

rectangle "Online Store" {
  usecase "Place order" as Place
  usecase "Authorize payment" as Payment
  usecase "Apply promotion" as Promotion
}

Customer --> Place

Place ..> Payment : <<include>>
Promotion ..> Place : <<extend>>
@enduml

该Place ..> Payment箭头表示“下单”包含必需的支付行为。该Promotion ..> Place箭头表示当满足条件时,“应用促销”扩展了“下单”。

在用例描述或注释中记录该条件——例如,“客户输入有效的促销代码”。

6. 示例:参与者泛化与外部系统

专用参与者从更通用的参与者继承交互。当外部服务与系统交互时,它们也可以作为参与者。

VPasCode 界面显示 PlantUML 代码及生成的 UML 图,展示注册用户泛化为用户,且支付网关与在线商店进行交互。

@startuml
left to right direction

actor "User" as User
actor "Registered customer" as Customer
actor "Payment gateway" as Gateway

Customer --|> User

rectangle "Online Store" {
  usecase "Browse products" as Browse
  usecase "Place order" as Place
  usecase "Process payment" as Pay
}

User --> Browse
Customer --> Place
Place ..> Pay : <<include>>
Gateway --> Pay
@enduml

“已注册客户”是“用户”的特化版本,并继承通用用户交互。支付网关位于在线商店边界之外,但参与支付用例。

7. 示例:用例泛化

泛化可用于表示更广泛用例的特化版本。空心三角形指向通用用例。

VPasCode 界面显示 PlantUML 代码及生成的 UML 图,展示客户参与者带有指向“支付”用例的泛化箭头。

@startuml
left to right direction

actor Customer

rectangle "Payment System" {
  usecase "Make payment" as Payment
  usecase "Pay by card" as Card
  usecase "Pay by bank transfer" as Transfer
}

Customer --> Card
Customer --> Transfer

Card --|> Payment
Transfer --|> Payment
@enduml

当特化用例共享一个通用目标但存在实质性差异时使用此方法。如果变体仅仅是条件步骤,则<<扩展>>关系或书面用例描述可能更清晰。

8. 在 VPasCode 中工作

一个实用的工作流程:

工作流图展示在 VPasCode 中创建 PlantUML 用例图的七个步骤,包括定义范围、编写代码以及与利益相关者进行验证。

  1. 定义范围。确定系统边界、参与者角色以及每个角色希望实现的目标。

  2. 创建草稿。直接编写 PlantUML,或要求 AI 助手生成用例图。

  3. 审查代码并预览。确认参与者位于系统边界之外,用例位于边界之内,且箭头指向正确方向。

  4. 优化模型。替换模糊的名称,移除实现细节,仅在关系反映真实需求时添加。

  5. 请求针对性的 AI 编辑。例如:“添加一个外部支付网关参与者,并使用包含关系展示所需的支付交互。其余部分保持不变。”

  6. 与利益相关者进行验证。检查图表是否反映了系统的实际范围和用户目标。

  7. 保存源代码。保留.puml将文本与项目文档一起保存,或纳入版本控制系统。在需要时导出图像以用于文档或演示文稿。

AI 辅助示例提示

为在线商店创建 PlantUML 格式的 UML 用例图。包含系统边界、客户和管理员角色,以及浏览商品、下订单、跟踪发货和管理目录等目标。将支付授权显示为下订单所必需的包含行为。将应用促销显示为下订单的条件扩展行为。仅返回有效的 PlantUML 源代码。

将 AI 生成的代码视为初稿。在使用前,请审查角色、边界、关系及业务假设。

9. 常见陷阱

信息图说明 UML 用例图中的六个常见陷阱,包括不正确的参与者定义、命名和关系箭头。

  • 将内部组件建模为角色:角色应为与主题交互的外部角色或系统。

  • 将用例命名为实现任务:优先使用“跟踪发货”而非“调用跟踪 API”。”

  • 使用<<include>>来表示可选行为:Include 表示基本用例所必需的行为。

  • 反转关系箭头:Include 指向被包含的用例;extend 指向基本用例。

  • 在一个图表中堆砌过多细节:使用高层级图表表示范围,然后使用单独的图表或文本描述详细场景。

  • 假设渲染成功即意味着模型正确:PlantUML 可能渲染出仍未能准确反映需求的图表。

10. 审查清单

在分享图表前,请确认:

用例图审查清单列出八个验证点,并附带一个示例图,展示客户与在线购物系统的交互。

  • 系统边界清晰。

  • 每个角色均为外部角色并代表一种职能。

  • 用例名称描述了有意义的目标。

  • 角色关联反映了实际交互。

  • Include 关系是必需的;extend 关系是条件性的或有其他合理依据的。

  • 泛化箭头指向通用角色或用例。

  • 图表在其预期尺寸下保持可读性。

  • 由人工智能生成的假设已与熟悉需求的人员进行了审查。