惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
WordPress大学
WordPress大学
Vercel News
Vercel News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
小众软件
小众软件
L
LangChain Blog
雷峰网
雷峰网
D
DataBreaches.Net
博客园 - 三生石上(FineUI控件)
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tor Project blog
NISL@THU
NISL@THU
Scott Helme
Scott Helme
量子位
S
Security Affairs
T
Threat Research - Cisco Blogs
博客园_首页
云风的 BLOG
云风的 BLOG
D
Docker
AWS News Blog
AWS News Blog
腾讯CDC
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
U
Unit 42
Recent Announcements
Recent Announcements
Apple Machine Learning Research
Apple Machine Learning Research
G
Google Developers Blog
T
The Exploit Database - CXSecurity.com
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
L
LINUX DO - 热门话题
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The Last Watchdog
The Last Watchdog
C
Cybersecurity and Infrastructure Security Agency CISA
IT之家
IT之家
W
WeLiveSecurity
P
Privacy & Cybersecurity Law Blog
F
Full Disclosure
L
Lohrmann on Cybersecurity
The Hacker News
The Hacker News
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Y
Y Combinator Blog
S
Security @ Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
C
Check Point Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
N
News and Events Feed by Topic
PCI Perspectives
PCI Perspectives
I
InfoQ

博客园 - delphi中间件

领域服务与领域事件 业务规则和模型 领域驱动 mqtt即时通讯 ActiveRecord ORM RAD(速成应用开发) unigui插件框架 工厂流水线式自动生产UNIGUI WEB软件 delphi cs\web一种统一的界面风格 - delphi中间件 - 博客园 动态生成unidbgrid 单据工厂 用json元数据填充模板 mormot2 ORM rest vs jsonrpc SSE技术详解:使用 HTTP 做服务端数据推送应用的技术 http持久连接 json-rpc 2.0 MCP服务器 RTTI对性能的影响 频繁地创建和销毁对象 TMultiPartFormData 雪花ID core.binary.pas TJSONToDataSetBridge TIcsMQTTServer 咏南WEB开发框架 unigui ajax交互 UnimList卡片显示 UnimTabPanel tabsheet在下面 unipagecontrol tabsheet在下面 unitreemenu自动显示滚动条 uniimbitbtn手机按钮一些设置
限界上下文与统一语言
delphi中间件 · 2026-07-20 · via 博客园 - delphi中间件

摘要:同样叫"商品",在商品、库存、订单、促销里可能根本不是同一个模型。本章用这个最容易踩坑的例子讲清限界上下文和统一语言:模型必须有边界,语言必须在边界内保持稳定。读完后,你能区分"子域是问题空间,限界上下文是解空间"。

先讲一个真实的困惑:"商品"到底是什么

在"优选门店"里,问不同部门同一个词:"商品"

  • • 商品管理部门说:商品就是 SPU/SKU,有标题、图片、类目、规格、品牌。
  • • 库存部门说:商品就是仓库里那个有数量、有库位的东西,我不关心它图片好不好看。
  • • 订单部门说:商品就是下单那一刻的一个快照——名称、单价、数量,成交后图片改了价格变了都跟这张订单无关。
  • • 促销部门说:商品就是一个能打折、能参加满减的计价单位。

同一个词"商品",在四个部门里指的根本不是同一个东西。

传统做法会怎么干?建一张大而全的 product 表,把所有部门要的字段都塞进去,全公司共用一个 Product 类。结果:

  • • 这个 Product 类有 50 多个字段,库存的同事看不懂一半。
  • • 改商品图片字段,结果订单模块的代码编译不过——因为大家共用一个类。
  • • 谁都能改这个类,谁都不敢改这个类。

这就是没有"限界上下文"的下场。

大白话:限界上下文是什么

限界上下文 = 一个明确的边界,在这个边界内,每个术语只有一个清晰、唯一的含义。

"界"是边界,"限"是限定。它限定了一套领域模型(和它的术语)的适用范围。

回到"商品"的例子:我们划出四个限界上下文,每个上下文里的"商品"是不同的模型

【商品上下文】          【库存上下文】         【订单上下文】          【促销上下文】
 Product               StockItem             OrderItem             PromotionItem
 - 标题/图片/类目        - SKU编号             - 商品名称(快照)        - 计价单位
 - 规格/品牌            - 可用数量             - 成交单价(快照)        - 可打折标记
 - 上架状态             - 库位                - 数量
                       - 锁定数量

每个上下文里的模型,只为自己上下文的职责服务,互不干扰。库存上下文根本没有"图片"这个概念,订单上下文里的价格是下单那一刻"冻结"的快照。

类比:同一个词"苹果",在水果店指水果,在数码店指手机。"水果店"和"数码店"就是两个限界上下文。脱离上下文谈"苹果是什么"没有意义。

原理图:为什么一个大模型会失控

1

新手要记住:重复类名不一定是坏事,共享错误模型才是坏事。 Catalog.Product 和 Order.OrderItem 看似都和商品有关,但它们关心的业务事实不同,就应该分开。

统一语言(Ubiquitous Language)

限界上下文的"边界内",要靠统一语言来保证术语一致。

统一语言 = 在一个限界上下文内,业务人员、产品、开发、测试,以及代码本身,全都用同一套术语,且含义完全一致。

这意味着:

  • • 产品说"冻结优惠券",代码里就该有 coupon.freeze(),而不是 couponMapper.updateStatus(id, 2)
  • • 业务说"订单待支付",代码里订单状态就叫 PENDING_PAYMENT,不是 status = 0
  • • 需求文档、数据库表、Java 类名、方法名,全部对齐同一套词汇

为什么这么做?好处是什么?

  1. 1. 消灭翻译损耗:没有统一语言时,业务说一套、文档写一套、代码又是一套,每次需求都要在三套语言间"翻译",一翻译就丢信息、就出 bug。统一语言让"业务怎么说,代码就怎么写"。
  2. 2. 代码自解释order.cancel()coupon.freeze() 这样的代码,业务人员都能看个大概,新人上手快。
  3. 3. 建模即沟通:开会讨论术语的过程,本身就是在澄清业务规则。很多业务理解上的分歧,会在"这个词到底什么意思"的争论中暴露出来。

对比传统做法的弊端

传统项目里,数据库字段叫 f_statustype1flag,方法叫 doProcess()handle2()。业务语言和代码语言完全是两个世界。三个月后写代码的人自己都忘了 status=2 是什么意思,只能去翻代码、问人,效率极低且极易出错。

限界上下文 vs 子域:到底啥关系

新手最容易混。一句话区分:

子域是"问题空间"的划分(业务上有哪些事要做),限界上下文是"解空间"的划分(软件上怎么建模和切分)。

更白话一点:

子域是业务地图,限界上下文是代码地图。子域告诉你业务有哪些块,限界上下文告诉你这些块在软件里怎么建模、怎么隔离。

比如"优选门店"从业务上看有商品、库存、订单这些子域;但落到代码里,"商品"这个词不能全系统共用一个万能 Product

场景 在这个上下文里,"商品"真正关心什么
商品上下文 标题、图片、类目、规格、上下架状态
库存上下文 SKU、库位、可用库存、锁定库存
订单上下文 下单那一刻的商品名、成交价、购买数量

所以再压缩成一句:子域偏"业务分类",限界上下文偏"模型边界"。

理想情况下,一个子域对应一个限界上下文(一一对应最清晰)。但现实中也可能:

  • • 一个大子域拆成多个上下文;
  • • 历史遗留系统里,一个上下文横跨了多个子域(不理想,但常见)。

对"优选门店",我们采用清晰的一一对应:

子域(业务视角) 限界上下文(软件视角)
订单交易(核心) 订单上下文 Order Context
促销(核心) 促销上下文 Promotion Context
商品(支撑) 商品上下文 Catalog Context
库存(支撑) 库存上下文 Inventory Context
会员(支撑) 会员上下文 Member Context
支付(通用) 支付上下文 Payment Context
配送(支撑) 配送上下文 Delivery Context