name: 域分析 description: 在任何代码库中识别子域并建议有界上下文,遵循DDD战略设计。适用于分析领域边界、识别业务子域、评估域内聚性、映射有界上下文,或当用户询问DDD战略设计、域分析或子域分类时使用。 license: MIT metadata: version: “1.0.0” domain: 架构 triggers: DDD,领域驱动设计,子域,有界上下文,战略设计,域分析 role: 架构师 scope: 系统设计 output-format: 架构 related-skills: 架构模式,cqrs实现,事件溯源架构
子域识别与有界上下文分析
这个技能分析代码库,以识别子域(核心、支持、通用)并遵循领域驱动设计战略设计原则建议有界上下文。
何时使用
在以下情况应用此技能:
- 在任何代码库中分析领域边界
- 识别核心、支持和通用子域
- 从问题空间到解决方案空间映射有界上下文
- 评估域内聚性并检测耦合问题
- 规划领域驱动重构
- 理解代码中的业务能力
核心原则
子域分类
核心域:竞争优势,最高业务价值,需要最佳开发人员
- 指标:复杂的业务逻辑,频繁变更,需要领域专家
支持子域:必需但非差异化,业务特定
- 指标:支持核心域,中等复杂度,业务特定规则
通用子域:通用功能,可外包
- 指标:易于理解的问题,低差异化,标准功能
有界上下文
一个明确的语言边界,其中领域术语具有特定、无歧义的含义。
- 主要性质:语言边界,非技术
- 关键规则:在边界内,所有通用语言术语均无歧义
- 目标:理想情况下,将1个子域对齐到1个有界上下文
分析过程
阶段1:提取概念
扫描代码库中的业务概念(非基础设施):
-
实体(具有身份的域模型)
- 模式:
@Entity,class, 域模型 - 重点:业务概念,非技术类
- 模式:
-
服务(业务操作)
- 模式:
*Service,*Manager,*Handler - 重点:业务逻辑,非技术实用程序
- 模式:
-
用例(业务工作流)
- 模式:
*UseCase,*Command,*Handler - 重点:业务流程,非CRUD
- 模式:
-
控制器/解析器(入口点)
- 模式:
*Controller,*Resolver, API端点 - 重点:业务能力,非技术路由
- 模式:
阶段2:按通用语言分组
对于每个概念,确定:
主要语言上下文
- 属于哪种业务词汇?
- 示例:
Subscription,Invoice,Payment→ 计费语言Movie,Video,Episode→ 内容语言User,Authentication→ 身份语言
语言边界
- 术语含义在哪里发生变化?
- 相同术语,不同含义 = 不同有界上下文
- 示例:销售中的“客户”与支持中的“客户”
概念关系
- 哪些概念自然属于一起?
- 哪些共享业务词汇?
- 哪些相互引用?
阶段3:识别子域
子域具有:
- 独特的业务能力
- 独立的业务价值
- 唯一的词汇
- 多个相关实体协同工作
- 一组内聚的业务操作
常见域模式:
- 计费/订阅:支付、发票、计划
- 内容/目录:媒体、产品、库存
- 身份/访问:用户、身份验证、授权
- 分析:指标、仪表板、洞察
- 通知:消息、警报、通信
分类每个子域:
使用此决策树:
它是竞争优势吗?
是 → 核心域
否 → 是否需要业务特定知识?
是 → 支持子域
否 → 通用子域
阶段4:评估内聚性
高内聚指标 ✅
- 概念共享通用语言
- 概念经常一起使用
- 直接业务关系
- 对一个的更改影响组中的其他
- 解决相同的业务问题
低内聚指标 ❌
- 混合了不同的业务词汇
- 概念很少一起使用
- 无直接业务关系
- 更改不影响其他
- 解决不同的业务问题
内聚性得分公式:
得分 = (
语言内聚性 (0-3) + // 共享词汇
使用内聚性 (0-3) + // 一起使用
数据内聚性 (0-2) + // 实体关系
更改内聚性 (0-2) // 一起更改
) / 10
8-10: 高内聚 ✅
5-7: 中等内聚 ⚠️
0-4: 低内聚 ❌
阶段5:检测低内聚问题
规则1:语言不匹配
- 问题:混合了不同的业务词汇
- 示例:同一服务中的
User(身份)和Subscription(计费) - 行动:建议分离到不同的有界上下文
规则2:跨域依赖
- 问题:域之间的紧耦合
- 示例:服务A直接实例化来自域B的实体
- 行动:建议基于接口的集成
规则3:混合职责
- 问题:单个类处理多个业务关注点
- 示例:服务同时处理计费和内容
- 行动:建议按子域拆分
规则4:核心中的通用功能
- 问题:通用功能在核心业务逻辑中
- 示例:计费服务中的邮件发送
- 行动:提取到通用子域
规则5:不清晰的边界
- 问题:无法确定概念属于哪个域
- 示例:与多个域有关联的实体
- 行动:澄清边界,可能需要拆分概念
阶段6:映射有界上下文
对于每个识别的子域,建议有界上下文:
有界上下文特征:
- 名称反映通用语言
- 包含完整的域模型
- 具有明确的集成点
- 清晰的语言边界
集成模式:
- 共享内核:上下文之间共享模型(谨慎使用)
- 客户/供应商:下游依赖于上游
- 顺从者:下游顺从上游
- 反腐败层:上下文之间的翻译层
- 开放主机服务:用于集成的发布接口
- 发布语言:良好记录的集成协议
输出格式
域地图
对于每个域/子域:
## 域:{名称}
**类型**:核心域 | 支持子域 | 通用子域
**通用语言**:{关键业务术语}
**业务能力**:{解决的业务问题}
**关键概念**:
- {概念} (实体|服务|用例) - {简要描述}
**子域**(如果适用):
1. {子域} (核心|支持|通用)
- 概念:{列表}
- 内聚性:{得分}/10
- 依赖:→ {其他域}
**建议有界上下文**:{名称}上下文
- 语言边界:{术语具有特定含义的地方}
- 集成:{如何与其他上下文集成}
**依赖**:
- → {其他域} 通过 {接口/API}
- ← {其他域} 通过 {接口/API}
**内聚性得分**:{得分}/10
内聚性矩阵
## 跨域内聚性
| 域A | 域B | 内聚性 | 问题 | 推荐 |
| -------- | -------- | -------- | ------------------ | ----------------------- |
| 计费 | 身份 | 2/10 | ❌ 直接耦合 | 使用接口 |
| 内容 | 计费 | 6/10 | ⚠️ 使用跟踪 | 基于事件的集成 |
低内聚性报告
## 检测到的问题
### 优先级:高
**问题**:{描述}
- **位置**:{文件/类/方法}
- **问题**:{错误之处}
- **概念**:{涉及的概念}
- **内聚性**:{得分}/10
- **推荐**:{建议修复}
### 优先级:中等
{类似格式}
有界上下文地图
## 建议有界上下文
### {上下文名称}上下文
**包含子域**:
- {子域1} (核心)
- {子域2} (支持)
**通用语言**:
- 术语:在此上下文中的定义
**集成要求**:
- 从消费:{其他上下文} 通过 {模式}
- 发布到:{其他上下文} 通过 {模式}
**实现说明**:
- 分离持久性
- 独立部署
- 明确的API边界
最佳实践
要做 ✅
- 聚焦业务语言,而非代码结构
- 让通用语言指导边界
- 客观测量内聚性
- 识别清晰的集成点
- 分类每个子域(核心/支持/通用)
- 首先寻找语言边界
不要 ❌
- 不要按技术层分组
- 不要强制单一全局模型
- 不要忽视语言差异
- 不要直接耦合域
- 不要通过架构创建上下文
- 不要消除所有依赖(有些是必要的)
分析清单
对于每个概念:
- [ ] 属于哪种业务语言?
- [ ] 是哪个域/子域的一部分?
- [ ] 是核心、支持还是通用?
- [ ] 与哪些其他概念相关?
- [ ] 依赖是否在相同域内?
- [ ] 有任何语言不匹配吗?
对于每个域:
- [ ] 通用语言是什么?
- [ ] 关键概念是什么?
- [ ] 子域是什么?
- [ ] 哪个是核心域?
- [ ] 跨域依赖是什么?
- [ ] 内部内聚性高吗?
- [ ] 边界清晰吗?
对于内聚性分析:
- [ ] 计算内聚性得分
- [ ] 识别低内聚区域
- [ ] 映射跨域依赖
- [ ] 标记语言不匹配
- [ ] 注意紧耦合
- [ ] 建议边界澄清
快速参考
子域决策树
分析业务能力
└─ 是竞争优势吗?
├─ 是 → 核心域
└─ 否 → 是否需要业务特定知识?
├─ 是 → 支持子域
└─ 否 → 通用子域
内聚性快速检查
相同词汇? → 高语言内聚性
一起使用? → 高使用内聚性
直接关系? → 高数据内聚性
一起更改? → 高更改内聚性
全部高 → 强子域候选
混合高/低 → 检查边界
全部低 → 可能分组错误
有界上下文信号
清晰边界迹象:
✅ 独特的通用语言
✅ 概念含义无歧义
✅ 不同上下文中有不同含义
✅ 清晰的集成点
不清晰边界迹象:
❌ 所有地方相同术语有相同含义
❌ 概念在系统中相同使用
❌ 无清晰语言差异
❌ 到处紧耦合
要避免的反模式
大泥球
- 一切相互连接
- 无清晰边界
- 混合词汇
- 预防:明确的有界上下文
全包容模型
- 整个业务的单一模型
- 不可能的全局定义
- 导致冲突
- 预防:接受多个上下文
混合语言概念
- 同一上下文中的不同词汇
- 示例:用户/权限与论坛/帖子
- 预防:保持语言关联
注意事项
- 这是战略分析,非战术实现
- 关注存在哪些域,而非如何实现
- 某些跨域依赖是正常的
- 低内聚性不一定意味着“坏”,它意味着“需要关注”
- 通用子域自然具有较低内聚性
- 尽可能与领域专家验证
验证标准
良好的域识别具有:
- ✅ 具有独特通用语言的清晰边界
- ✅ 域内高内部内聚性
- ✅ 明确的跨域依赖
- ✅ 与能力业务对齐
- ✅ 针对问题的可操作推荐