# 1. Eric Evans DDD 蓝皮书的实体(Entity)与值对象(Value Object)的核心差异中身份 vs 属性 A 实体必须不可变,值对象可以可变 B 实体靠身份标识区分同一性,值对象靠全部属性值区分同一性 ✓ 正确答案 C 实体和值对象都依赖数据库主键来区分 D 值对象需要有独立的 ID 字段
# 2. Money、Address、DateRange 等典型 Value Object 的实现 A 值对象应提供 setter 便于外部修改 B Money 用 double 存储金额即可满足精度要求 C 值对象必须与数据库表一一对应 D 值对象字段应为 final,通过构造器注入并封装业务操作 ✓ 正确答案
# 3. Value Object 的不可变性(immutability)与"创建-修改"模式(with 方法)中为什么推荐 immutable? A with 方法直接修改当前实例的字段 B 不可变值对象无法被多个聚合安全共享 C with 方法返回包含新字段的新实例,原实例保持不变 ✓ 正确答案 D 不可变对象因为无法修改所以不能用于缓存
# 4. 值对象的相等性(equals/hashCode)设计中基于全部属性 vs 业务标识的取舍,以及金额(浮点陷阱)、带时区时间等易错场景如何正确实现? A equals 与 hashCode 应基于一致的字段集合,且金额用 BigDecimal 比较 ✓ 正确答案 B 金额用 double 存储并直接用 == 比较即可 C 带时区时间直接比较原始字符串即可保证相等 D hashCode 返回任意值不影响 equals 语义
# 5. 同一概念在不同限界上下文中的角色切换中 Address 作为值对象与实体的判定依据及设计影响? A 判定依据是该概念是否需要身份标识与生命周期,不同上下文可不同建模 ✓ 正确答案 B 全系统必须统一使用同一模型 C 值对象一经定义为实体就不能再改 D 只有实体才能被跨上下文共享
# 6. DDD 红皮书(Vaughn Vernon)的聚合(Aggregate)设计原则中通过聚合根(Aggregate Root)维护事务边界 A 聚合根是聚合的唯一入口,聚合内不变量由聚合根维护 ✓ 正确答案 B 一个事务可以修改任意多个聚合 C 外部可以直接修改聚合内任意对象 D 聚合内所有对象都必须是实体
# 7. 聚合根 vs 实体 vs 值对象的协作模式中工厂(Factory)创建复杂聚合 A 复杂聚合由工厂集中组装并保证创建时不变量 ✓ 正确答案 B 聚合根不应提供任何命令方法 C 值对象负责跟踪聚合生命周期 D 外部可直接 new 聚合内部实体并修改
# 8. 聚合的"小聚合"原则(Vernon)中优先使用 ID 引用而非对象引用;大聚合 vs 小聚合在一致性与性能上的取舍? A 聚合越大并发性能越好 B 聚合之间应使用对象引用保证强一致 C 小聚合优先用 ID 引用,跨聚合一致性通过最终一致实现 ✓ 正确答案 D 聚合内所有对象都应通过 ID 引用
# 9. 聚合的不变量(invariant)一致性边界中一个事务只能修改一个聚合 A 一个事务只能修改一个聚合,跨聚合一致性用领域事件实现 ✓ 正确答案 B 一个事务可以修改多个聚合以简化 C 聚合不变量由数据库外键保证 D 聚合之间应共享内部对象
# 10. Domain Event 作为聚合间的最终一致性载体 A 领域事件让发起方和响应方在同一事务内强一致 B 领域事件必须同步等待响应方处理 C 聚合之间应直接调用对方事务 D 聚合通过领域事件单向解耦,实现最终一致 ✓ 正确答案
# 11. 聚合内对象图的「引用深度」治理中超过多少层嵌套应拆分为独立聚合,如何用架构测试检测跨聚合直接修改内部状态的反模式? A 聚合对象图越深越好,代表模型完整 B 聚合根可以任意被外部修改内部对象 C 架构测试只能检测循环依赖,不能约束聚合边界 D 深嵌套应拆分,架构测试可检测跨聚合直接修改内部状态的反模式 ✓ 正确答案
# 12. 值对象的业务不变量封装中 Money 的币种与金额组合、日期区间的包含边界、地址格式校验如何封装为自校验的值对象? A 校验放在 setter 中即可满足不可变性 B 校验逻辑应放在每个调用方各自实现 C 值对象不需要校验,缺省字段即可 D 构造时校验并拒绝非法状态,保证任意合法实例满足不变量 ✓ 正确答案
# 13. 值对象的持久化映射中嵌入式列、JSON 字段与 ORM 的配合,不可变值对象如何重建? A 值对象只能用 JSON 列持久化 B 可嵌入式列或 JSON 字段,不可变值对象通过字段级访问或反序列化器重建 ✓ 正确答案 C 值对象一旦持久化就自动变为可变 D 嵌入式列无法查询值对象字段
# 14. 值对象内禁止持有实体引用中身份泄漏与共享可变状态的危害,替代方案如何设计? A 值对象应持有实体引用以便共享 B 值对象持有实体引用是 DDD 推荐做法 C 实体引用不会影响值对象不可变性 D 值对象持有实体引用会泄漏身份并造成共享可变状态,应改用 ID 或值 ✓ 正确答案
# 15. 聚合内不变量校验的时机(创建时 vs 命令方法内 vs 领域事件后) A 所有校验都必须放在命令方法外 B 创建时和命令方法内应进行主力校验,事件后校验用于跨聚合场景 ✓ 正确答案 C 只在领域事件后校验即可 D 校验时机无关紧要,随意放置
# 16. 聚合的设计中聚合根与边界的一致性? A 聚合根是聚合的唯一入口,外部只能通过它访问聚合内部 ✓ 正确答案 B 聚合外部可以绕过聚合根修改内部对象 C 聚合根可以不属于聚合边界 D 聚合内部对象可以独立被外部修改
# 17. 聚合的持久化中仓储与工作单元? A 应用代码直接操作数据库表持久化聚合 B 一个聚合可以用多个仓储 C 聚合通过仓储持久化,工作单元协调事务内的变更提交 ✓ 正确答案 D 工作单元不属于聚合持久化
# 18. 聚合的一致性与并发中乐观锁? A 乐观锁不加版本号,靠数据库锁 B 悲观锁比乐观锁更适合低冲突场景 C 聚合可以并发修改而不校验 D 乐观锁通过版本号校验,冲突时拒绝更新并让应用层重试 ✓ 正确答案
# 19. 值对象集合的不可变性中返回只读视图或拷贝,防止外部修改破坏不变量? A 应构造时拷贝为不可变集合,getter 返回只读视图或副本 ✓ 正确答案 B 集合可变不影响值对象不变量 C 直接返回内部集合引用即可 D final 集合字段本身就保证内容不可变