大模型应用
在 Rust 中进行领域建模/DDD 设计时:判断实体…
把业务领域概念映射为 Rust 中的实体、值对象、聚合、仓库和领域事件,并用类型系统表达身份、不变量与所有权。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在 Rust 中进行领域建模/DDD 设特定
解决思路
- 先回答核心问题:这个领域概念在领域中的角色是什么?在写代码前判断:它是 Entity(身份重要)还是 Value Object(可互换);必须维护哪些不变量;聚合边界在哪里。
- 将领域概念映射到 Rust 模式:Entity → `struct + Id`,拥有所有权、唯一身份;Value Object → `struct + Clone/Copy`,可共享、不可变;Aggregate Root → `struct owns children`,形成清晰所有权树;Repository → `trait`,抽象持久化;Domain Event → `enum`,捕获状态变化;Service → `impl block / free fn`,无状态操作。
- 创建领域类型前先确定概念的身份:需要唯一身份 → Entity(带 Id 字段);按值可互换 → Value Object(Clone/Copy)。
- 创建领域类型前确定必须维持的不变量:始终有效 → 私有字段 + 经过验证的构造函数;状态转换规则 → type state pattern。
- 创建领域类型前确定数据所有权:单一所有者(父级)→ owned field;共享引用 → `Arc/Rc`;弱引用 → `Weak`。
- 向上追溯到领域约束(Layer 3):例如问“应该如何建模 Transaction?”时,先问该领域规则如何约束交易;检查 `domain-fintech`(审计、精度要求);检查业务相关方(有哪些不变量)。
- 用追溯表回答设计问题:Entity vs Value Object → 查 `domain-*` → 问什么让两个实例“相同”;聚合边界 → 查 `domain-*` → 问什么必须一起保持一致;验证规则 → 查 `domain-*` → 问适用哪些业务规则。
- 向下追溯到实现(Layer 1):建模为 Entity 时,参考 `m01-ownership`(Owned、唯一),参考 `m05-type-driven`(为 Id 用 Newtype);建模为 Value Object 时,参考 `m01-ownership`(Clone/Copy 可用),参考 `m05-type-driven`(在构造时验证);建模为 Aggregate 时,参考 `m01-ownership`(父级拥有子级),参考 `m02-resource`(聚合内共享可考虑 Rc)。
- 按快速参考落地:Value Object → Newtype,例如 `struct Email(String);`;Entity → Struct + ID,例如 `struct User { id: UserId, ... }`;Aggregate → Module boundary,例如 `mod order { ... }`;Repository → Trait,例如 `trait UserRepo { fn find(...) }`;Domain Event → Enum,例如 `enum OrderEvent { Created, ... }`。
- 使用 Value Object 模板:`struct Email(String);` 并实现 `impl Email { pub fn new(s: &str) -> Result<Self, ValidationError> { validate_email(s)?; Ok(Self(s.to_string())) } }`。
- 使用 Entity 模板:`struct UserId(Uuid);`;`struct User { id: UserId, email: Email, // ... other fields }`;为 `User` 实现 `PartialEq`,用 `self.id == other.id` 做身份相等。
- 使用 Aggregate 模板:`mod order { pub struct Order { id: OrderId, items: Vec<OrderItem>, // ... } impl Order { pub fn add_item(&mut self, item: OrderItem) { // Enforce aggregate invariants } } }`。
- 避免常见错误并改用更好做法:Primitive obsession(无类型安全)→ 用 Newtype wrappers;带不变量的 public fields(不变量可被破坏)→ 改为 private + accessor;泄露聚合内部(破坏封装)→ 在 root 上提供方法;用 `String` 表示语义类型(无验证)→ 用经过验证的 newtype。
- 需要关联技能时:类型驱动实现看 `m05-type-driven`;聚合所有权看 `m01-ownership`;领域错误处理看 `m13-domain-error`;特定领域规则看 `domain-*`。
适用边界 · 注意事项
- 不适用于非 Rust 项目;这些模式依赖 Rust 的所有权、Clone/Copy、Arc/Rc、trait 和 enum 等机制。
- 不适用于无需领域建模的简单 CRUD、一次性脚本或没有业务不变量/聚合一致性要求的场景。
- 如果只是数据存取、没有身份、不变量或状态转换规则,不必强行套用 Entity、Value Object、Aggregate 等 DDD 模式。