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

别再傻傻分不清了!用例图中的‘包含’和‘扩展’关系,用这个外卖点餐例子一下就懂了

外卖点餐中的UML用例图用包含和扩展关系拆解用户旅程每次打开外卖App时那些看似简单的点击操作背后其实隐藏着精密的系统设计逻辑。对于刚接触UML的开发者来说理解用例图中的包含include和扩展extend关系常常令人头疼——它们看起来相似却承担着完全不同的设计意图。今天我们就用最熟悉的外卖点餐场景带你直观感受这两种关系的本质区别。想象你正饿着肚子准备点一份披萨。从打开App到完成支付这个过程中哪些操作是必须执行的规定动作哪些又是锦上添花的可选步骤答案就藏在包含与扩展的设计哲学里。包含关系像餐厅的进门步骤——不完成就无法进行后续操作而扩展关系则像服务员递来的优惠券——用不用随你但用了会有额外收益。1. 基础用例拆解外卖点餐的核心流程1.1 用户必须完成的规定动作在任何外卖系统中都存在一组用户必须执行的基础操作我们称之为基础用例。以下单购买披萨为例startuml left to right direction actor 用户 as User usecase 浏览菜单 as Browse usecase 加入购物车 as AddToCart usecase 支付订单 as Pay usecase 登录系统 as Login User -- Browse User -- AddToCart User -- Pay Login |-- Browse Login |-- AddToCart Login |-- Pay enduml在这个流程中浏览菜单、加入购物车和支付订单构成了完整的主流程但所有这些操作都有一个共同前提用户必须登录系统这就是典型的包含关系——登录是被多个用例共享的必要前置条件。在UML中我们用虚线箭头加include表示主用例 --| 被包含用例 : include1.2 为什么需要提取公共行为想象如果每个用例都单独实现登录功能修改登录逻辑时需要同步更新所有相关用例可能出现不同用例间登录体验不一致的情况系统难以维护存在安全风险通过提取登录这个公共行为我们实现了代码复用一处修改全局生效体验统一所有功能入口的认证方式保持一致安全可控集中管理敏感操作2. 包含关系像餐厅门禁的必要步骤2.1 外卖场景中的包含实例继续我们的披萨点餐例子除了登录之外系统中还存在其他包含关系主用例被包含用例必要性说明支付订单选择支付方式不选支付方式无法完成交易提交评价选择评分星级无评分的评价没有意义申请退款填写退款原因平台要求必须说明原因这些关系的共同特点是缺少被包含用例主用例就无法完成其业务目标。就像不选支付方式就无法完成支付不登录就无法使用任何功能。2.2 技术实现要点在代码层面包含关系通常表现为public class OrderService { public void placeOrder(User user, Order order) { // 必须执行的包含用例 authService.login(user); cartService.addItem(order); paymentService.process(order); } }开发时需要特别注意被包含用例应该是原子操作不可再分割主用例必须等待被包含用例执行完成任何一方的失败都会导致整个流程中断3. 扩展关系像优惠券的可选福利3.1 什么时候使用扩展回到外卖场景考虑以下情况支付时可能使用优惠券下单后可能参与分享得积分活动评价时可能上传食物照片这些可能就是扩展关系的典型特征——它们不是必须的但在特定条件下会增强主用例的价值。用UML表示主用例 |-- 扩展用例 : extend3.2 优惠券使用的扩展案例让我们详细分析使用优惠券这个扩展startuml left to right direction actor 用户 as User usecase 支付订单 as Pay usecase 使用优惠券 as Coupon User -- Pay Coupon . Pay : extend note on link : 当用户选择使用优惠券时 enduml关键区别点没有优惠券也能完成支付基础流程使用优惠券需要满足条件如金额达标、未过期等优惠券逻辑变更不会影响基础支付流程3.3 扩展关系的技术实现与包含不同扩展通常采用策略模式实现class PaymentService: def __init__(self, strategy: PaymentStrategy None): self._strategy strategy or DefaultPayment() def apply_coupon(self, coupon: Coupon): if coupon.is_valid(): self._strategy CouponPayment(coupon) def process(self, order): return self._strategy.execute(order)这种实现的优势在于主流程代码保持简洁可以动态添加或移除扩展功能各扩展点互不影响4. 对比总结如何正确选择关系类型4.1 决策流程图遇到新功能时可以用这个流程判断关系类型是否必须执行 ├─ 是 → 包含关系 └─ 否 → 是否在特定条件下增强主用例 ├─ 是 → 扩展关系 └─ 否 → 可能是普通关联4.2 对比表格两种关系的核心区别维度包含(include)扩展(extend)必要性必须执行可选执行执行时机主用例执行前/中满足条件时触发箭头方向指向被包含用例指向主用例代码表现方法直接调用条件判断或策略模式修改影响影响所有相关主用例通常只影响自身业务示例登录、选择地址优惠券、分享活动4.3 常见误区和纠正初学者常犯的错误包括混淆方向记住箭头总是指向被使用的用例包含主用例 → 被包含用例扩展扩展用例 → 主用例过度使用扩展不是所有可选操作都需要扩展关系只有那些增强主用例的行为才适用遗漏条件扩展关系必须注明触发条件在UML图中用注释说明如当订单金额30元时5. 进阶应用复杂场景下的关系组合实际项目中常常需要组合使用多种关系。以外卖平台的团购订单为例startuml left to right direction actor 用户 as User usecase 发起团购 as GroupBuy usecase 参团 as Join usecase 支付定金 as Deposit usecase 支付尾款 as FinalPay usecase 使用优惠券 as Coupon usecase 邀请好友 as Invite User -- GroupBuy User -- Join Deposit |-- GroupBuy : include FinalPay |-- GroupBuy : include Coupon . FinalPay : extend Invite . GroupBuy : extend enduml这个例子展示了包含关系团购必须包含定金和尾款支付扩展关系尾款支付时可选择使用优惠券另一个扩展发起团购时可以邀请好友这种组合能够清晰表达复杂业务中的必要与可选路径。在设计时建议先用简单用例描述核心流程再逐步添加扩展点最后验证所有可能的路径组合6. 实操建议从外卖案例到你的项目理解了外卖案例后如何将这些知识应用到自己的项目中以下是三个实用技巧技巧一用业务流程验证用例关系画出用户完成目标的完整步骤标记哪些步骤是不可跳过的包含识别哪些步骤是情境性的扩展技巧二使用如果没有测试对疑似包含关系假设去掉该用例主用例是否还能完成对疑似扩展关系去掉后主用例功能是否完整只是少了增强技巧三分层设计用例第一层核心业务流程全部包含关系第二层增值功能扩展关系第三层异常处理扩展或单独用例在实际项目评审中我经常看到团队因为关系定义不清导致的重复开发。比如把本应是扩展的优惠券逻辑硬编码到支付流程中结果每次营销活动都要修改核心代码。正确的做法应该是保持支付流程稳定通过扩展点灵活接入各种促销策略。

相关文章:

别再傻傻分不清了!用例图中的‘包含’和‘扩展’关系,用这个外卖点餐例子一下就懂了

外卖点餐中的UML用例图:用"包含"和"扩展"关系拆解用户旅程 每次打开外卖App时,那些看似简单的点击操作背后,其实隐藏着精密的系统设计逻辑。对于刚接触UML的开发者来说,理解用例图中的"包含"&#…...

FineBI连接MySQL实战:手把手教你从零搭建第一个学生数据分析看板

FineBI连接MySQL实战:从零构建学生数据分析看板 当教务系统的学生信息沉睡在MySQL数据库中时,FineBI能像魔法师一样将它们唤醒为生动的可视化图表。我曾为某高校搭建第一个招生分析看板时,仅用三小时就让校领导看到了历年录取数据的立体画像—…...

LuatOS扩展库API——【airlbs 】airlbs 定位服务

LuatOS 是物联网终端开发的常用工具,为轻量级嵌入式 Lua 脚本运行框架兼实时系统,基于 Lua 5.3 深度优化,适配 4G-Cat.1、MCU 等物联网终端硬件。其以 Lua 脚本开发,采用协程多任务架构,配套完善开发资源,含…...

别再拍脑袋立项了!手把手教你用华为IPD的Charter任务书,搞定产品从0到1的商业论证

从直觉到论证:中小企业如何用轻量级Charter打造产品商业闭环 深夜的创业咖啡馆里,几个技术出身的创始人正为下一个产品方向争论不休。"这个功能绝对能引爆市场!"CTO激动地敲着桌子,"我见过三家竞品都没做好这个点。…...

OpenClaw备份方案:GLM-4.7-Flash自动化任务配置保存与恢复

OpenClaw备份方案:GLM-4.7-Flash自动化任务配置保存与恢复 1. 为什么需要备份OpenClaw配置 上周我的开发机突然遭遇硬盘故障,导致所有OpenClaw配置丢失。当时正在运行的三个自动化流程全部中断,包括每天凌晨自动执行的日报生成和每周五的代…...

单片机Shell开发避坑指南:从Putty特殊字符处理到内存安全的7个实战经验

单片机Shell开发避坑指南:从Putty特殊字符处理到内存安全的7个实战经验 当你在深夜调试单片机Shell时,突然发现退格键会导致整个系统崩溃,或者用户输入超长字符串后设备莫名其妙重启——这些看似简单的交互问题,往往成为项目交付前…...

XZ1851输入电压6-40V 输出电流2.5A 输出电压ADJ(小于39V)

产品概述 XZ1851 是一款内置功率 MOSFET的单片降压型开关模式转换器。 XZ1851在 6-40V 宽输入电源范围内实现2.5 A最大输出电流,并且具有出色的线电压和负载调整率。 XZ1851 采用 PWM 电流模工作模式,环路易于稳定并提供快速的瞬态响应。 XZ1851 外部提供…...

CCS12.3.0保姆级教程:手把手教你为AWR6843AOP毫米波雷达新建工程(附完整配置参数)

CCS12.3.0零基础实战指南:AWR6843AOP毫米波雷达工程搭建全解析 第一次打开Code Composer Studio 12.3.0时,满屏的选项和参数确实容易让人望而生畏。特别是当你要为TI的AWR6843AOP毫米波雷达创建新工程时,那些关于Cortex R、DSP C67XX、mss/ds…...

AXI非对齐访问实战指南:从WSTRB信号到DMA数据搬运的避坑细节

AXI非对齐访问实战指南:从WSTRB信号到DMA数据搬运的避坑细节 在FPGA与ASIC设计中,AXI总线作为AMBA协议族的核心成员,其非对齐访问特性常被开发者视为"双刃剑"。当处理摄像头YUV数据、音频采样流或网络封包等非规整数据时&#xff0…...

TikTok爆火:C语言代码让电脑无硬件发无线电,靠谱吗?

一、刷爆TikTok的技术神操作,无硬件也能发无线电? 在2026年3月17日这天,有一条C语言创意短视频火爆了TikTok,在当日,它获得了10万以上的播放量,还有5万以上个点赞之举,成功登上了当日C语言创意应…...

C语言文件操作实战:用fread和fwrite处理二进制数据的5个常见场景

C语言文件操作实战:用fread和fwrite处理二进制数据的5个常见场景 在嵌入式系统开发、游戏编程和工业控制等领域,二进制文件操作往往是数据持久化的核心手段。与文本文件相比,二进制格式能更精确地保存内存数据布局,避免字符编码转…...

开源STK插件模块大全:提升你的空天地一体化仿真效率

开源STK插件模块大全:提升空天地一体化仿真效率的实战指南 如果你已经熟悉STK的基础操作,却还在为复杂的星座仿真流程和有限的分析功能而头疼,那么开源插件模块将成为你的效率倍增器。本文将带你深入探索那些被专业用户私藏的工具箱&#xff…...

从像素到对象:如何用HANet和SNUNet搞定遥感影像中的‘小目标’与‘不平衡’难题?

从像素到对象:HANet与SNUNet在遥感影像小目标检测中的实战解析 当洪水退去后的灾损评估卫星图上,那些被冲毁的农舍屋顶往往只占据几个像素;在城市违建监测中,新增的违章建筑可能只是高分辨率影像中的微小色块。这些"小目标&q…...

自动驾驶轨迹预测新思路:VectorNet如何用矢量编码替代传统栅格化方法?

自动驾驶轨迹预测的矢量革命:VectorNet如何重构环境编码范式 在自动驾驶系统的决策闭环中,轨迹预测模块犹如驾驶员的预判能力,其准确性直接关系到行车安全与舒适性。传统基于卷积神经网络(CNN)的预测方法存在一个根本性…...

当服务器内存足够大时:为什么我建议你在CentOS 8上彻底禁用Swap?

大内存时代:CentOS 8禁用Swap的云原生性能优化实践 在云计算与容器化技术席卷全球的今天,服务器硬件配置正经历着革命性变化。128GB、256GB甚至TB级内存已成为现代服务器的标配,而传统Linux内存管理机制中的Swap分区在这种新硬件环境下是否还…...

PostgreSQL开机启动踩坑实录:从‘服务不存在’到‘权限拒绝’的完整排错指南

PostgreSQL开机启动故障排查实战指南:从日志分析到权限修复 当你满怀期待地在服务器上执行systemctl start postgresql命令,却看到刺眼的红色报错信息时,那种挫败感我深有体会。作为一款强大的开源数据库,PostgreSQL在Linux系统上…...

ADRV9009+ZCU102实战:从HDL工程构建到no-OS移植的5个关键步骤

ADRV9009ZCU102全流程开发指南:从HDL工程构建到no-OS移植的深度实践 在射频系统开发领域,ADRV9009作为一款高性能射频收发器,与Xilinx ZCU102开发板的组合已成为许多硬件工程师的首选方案。本文将深入剖析五个关键环节的技术细节,…...

TWS耳机充电仓硬件设计全解析:从Type-C接口到NTC保护的7大核心模块

TWS耳机充电仓硬件设计全解析:从Type-C接口到NTC保护的7大核心模块 当你在咖啡馆掏出AirPods时,可能不会想到那个小巧的充电仓里藏着多少精密电路。作为硬件工程师,我们眼中的充电仓不是简单的塑料盒子,而是一个由七大核心模块组成…...

DeerFlow资源优化实践:控制Python执行环境内存占用方法

DeerFlow资源优化实践:控制Python执行环境内存占用方法 1. 认识DeerFlow:您的智能研究助手 DeerFlow是一个基于LangStack技术框架开发的深度研究开源项目,它就像是您的个人研究团队,能够帮您完成各种复杂的调研任务。这个工具整…...

LeetCode 3548. 等和矩阵分割2 详细题解(前缀和+二分+连通性分析)

LeetCode 3548. 等和矩阵分割2 详细题解(前缀和二分连通性分析) 🏷️ 标签:前缀和、二分查找、连通性、哈希表、矩阵、周赛难题 📊 难度:中等 | 📝 题目编号:3548 | 🗂️…...

Windows系统下安装与配置FreeSWITCH完整指南

本文提供在 Windows 系统上安装 FreeSWITCH 的完整步骤,涵盖下载、安装、配置、启动测试,以及可能遇到问题的解决方案,帮助你顺利完成开发环境的搭建。 一、环境准备与下载 1.1 系统要求 项目要求操作系统Windows 7/8/10/11,Wi…...

2026最权威AI论文平台榜单:这些被高校和导师悄悄推荐的工具你还没用?

AI论文平台正成为学术研究的重要助力工具,其在提升写作效率、确保内容合规性方面展现出显著价值。依托权威检测机构、高校实测数据及用户真实反馈,2026年最值得信赖的AI论文平台已逐渐浮出水面,它们不仅功能全面,更深度适配中文论…...

CST、Sspp与色散曲线的关联

CST cst Sspp 色散曲线在电磁仿真领域摸爬滚打过的工程师,对色散曲线这个磨人的小妖精应该都不陌生。今天咱们就来聊聊怎么用CST Studio Suite里的本征模求解器(Eigenmode Solver)提取波导结构的色散曲线,手把手带你从懵逼到上手…...

从抓包到反编译:wx小程序逆向实战全记录(含云函数分析)

从抓包到反编译:小程序逆向工程深度解析与技术实践 在移动互联网时代,小程序以其轻量化和便捷性迅速占领市场,而作为开发者,理解小程序背后的运行机制不仅能提升开发能力,更能帮助进行安全审计和性能优化。本文将带您深…...

如何高效使用英雄联盟智能助手:5分钟快速上手指南

如何高效使用英雄联盟智能助手:5分钟快速上手指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否经常因为错过…...

探索视频采集技术:OBS Studio实现高效直播录制的创新方法

探索视频采集技术:OBS Studio实现高效直播录制的创新方法 【免费下载链接】obs-studio OBS Studio - 用于直播和屏幕录制的免费开源软件。 项目地址: https://gitcode.com/GitHub_Trending/ob/obs-studio 在当今内容创作领域,视频采集技术是直播与…...

SenseVoice-small保姆级教程:Mac/Windows本地快速启动WebUI步骤

SenseVoice-small保姆级教程:Mac/Windows本地快速启动WebUI步骤 你是不是也遇到过这样的场景?开完会想整理录音,发现要上传到云端才能转文字,担心隐私泄露;或者想给视频加字幕,但手动打字太费时间&#xf…...

OpenClaw版本升级:GLM-4.7-Flash环境无缝迁移指南

OpenClaw版本升级:GLM-4.7-Flash环境无缝迁移指南 1. 为什么需要升级? 上周我在本地开发环境遇到一个棘手问题:OpenClaw的旧版本无法正确解析GLM-4.7-Flash模型返回的JSON响应。经过排查发现是框架对数组嵌套结构的处理存在兼容性问题。这促…...

OpenClaw + 搜索与资讯:让 AI 帮你「刷」信息,告别信息焦虑

你每天花多少时间刷信息流?30分钟?1小时?今天这篇文章,帮你把这段时间降为零。 01 信息过载是现代人的标配焦虑 早上醒来第一件事是什么?很多人已经条件反射地拿起手机,打开微信公众号、知乎、微博、Twitt…...

深度解析:Umi-OCR Rapid版本HTTP服务参数配置的3个关键步骤

深度解析:Umi-OCR Rapid版本HTTP服务参数配置的3个关键步骤 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件,适用于Windows系统,支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode.com…...