DDD 战术模式与领域驱动设计(聚合/界限上下文/Repository)

共 30 题
#

1. 为何两个上下文间不应直接共享数据库(应为防腐层)

A 界限上下文共享数据库不影响独立演化
B 共享数据库让上下文模型更清晰
C 防腐层直接暴露对方数据库
D 两个上下文不应直接共享数据库,应通过防腐层转换模型 ✓ 正确答案
#

2. 共享内核(Shared Kernel)的风险与适用限制

A 共享内核适用于所有上下文
B 共享内核共享整个数据库
C 共享内核不会产生耦合
D 共享内核共享部分领域模型,但带来耦合,仅适用于小且稳定的协作场景 ✓ 正确答案
#

3. 如何避免"贫血模型",把行为放回实体而非仅 getter/setter

A 贫血模型实体内部包含所有业务行为
B 贫血模型实体只有 getter/setter,业务逻辑散在 Service;应把行为放回实体 ✓ 正确答案
C 实体只做数据存储,行为都在 Service 是 DDD 推荐
D 避免贫血模型就是让实体只有字段
#

4. 实体(Entity)与值对象(Value Object)在身份与可变性上的区别

A 实体的身份 ID 贯穿生命周期且可变,值对象无身份、不可变、按值比较 ✓ 正确答案
B 值对象有身份且可变
C 实体按属性值比较相等
D 值对象创建后可以修改
#

5. Specification 模式如何把查询/业务规则对象化并可组合

A Specification 与业务规则无关
B 规范只能判断单个条件,无法组合
C 规范必须硬编码在查询中
D Specification 把业务规则对象化,并支持 and/or/not 组合 ✓ 正确答案
#

6. 值对象的不可变性如何简化并发与缓存

A 不可变值对象天然线程安全,可安全共享与缓存 ✓ 正确答案
B 不可变值对象需要加锁才能并发访问
C 不可变对象可以随意修改
D 不可变对象不能放入缓存
#

7. 工厂(Factory)与构造函数在复杂聚合创建中的职责

A 构造函数负责复杂聚合的组装与校验
B 复杂聚合的创建用工厂负责组装、校验与 ID 生成,构造函数用于简单对象 ✓ 正确答案
C 工厂只创建简单对象
D 聚合创建不需要校验不变式
#

8. 上下文映射(Context Map)的合作关系(ACL/OHS/PL)类型

A 上下文映射描述类与类的关系
B ACL 用于共享数据库
C ACL 隔离转换上游模型,OHS 开放服务,PL 发布共享语言 ✓ 正确答案
D OHS 是让下游直接访问上游数据库
#

9. 为何"大聚合"会损害性能,应让聚合尽量小且内聚

A 聚合是事务边界,大聚合加载多、锁竞争严重,应尽量小且内聚 ✓ 正确答案
B 聚合越大越能保证一致性
C 聚合越大性能越好
D 聚合间应直接引用对象而非 ID
#

10. 为何把领域模型与框架注解(如 JPA @Entity)解耦更利于测试

A 领域模型与框架耦合利于测试
B 领域模型必须使用 JPA 注解
C 测试领域逻辑必须启动 Spring 容器
D 领域模型不依赖 JPA 注解,测试无需数据库与容器,可快速单测 ✓ 正确答案
#

11. 为何跨聚合的引用应通过 ID 而非对象引用以保持边界

A 聚合边界与引用方式无关
B 跨聚合应直接对象引用,方便访问
C 跨聚合对象引用利于事务一致性
D 跨聚合应通过 ID 引用而非对象引用,保持聚合边界与自治 ✓ 正确答案
#

12. 应用服务(Application Service)与领域服务的分层职责

A 应用服务包含业务规则
B 应用服务编排用例并管事务,领域服务承载跨聚合的领域业务规则 ✓ 正确答案
C 领域服务处理事务与 IO
D 两者职责相同
#

13. 聚合(Aggregate)与聚合根(Aggregate Root)的一致性边界

A 聚合根不是聚合的一部分
B 外部可直接访问聚合内任意对象
C 聚合之间是强一致
D 聚合是事务一致性边界,聚合根是唯一入口,外部只能通过聚合根访问 ✓ 正确答案
#

14. 领域事件在上下文间通过消息总线传播的最终一致

A 领域事件通过消息总线异步传播到其他上下文,实现最终一致 ✓ 正确答案
B 领域事件要求跨上下文强一致
C 领域事件是同步调用的
D 事件消费无需幂等
#

15. 领域服务(Domain Service)何时该承载不属于实体的逻辑

A 领域服务承载跨聚合/跨实体、无单一归属的领域业务逻辑 ✓ 正确答案
B 领域服务承载用例编排与事务
C 所有业务逻辑都应放领域服务
D 领域服务处理 IO 与数据库
#

16. 传统分层架构(接口/应用/领域/基础设施)的依赖方向

A 传统分层上层依赖下层,但领域层应通过依赖倒置不依赖基础设施 ✓ 正确答案
B 领域层依赖基础设施是推荐做法
C 依赖方向自下而上
D 基础设施层依赖领域层
#

17. 依赖倒置(DIP)如何使领域层不依赖具体数据库/框架

A 依赖倒置就是上层依赖下层
B 领域层直接依赖具体数据库驱动
C 领域层定义接口,基础设施实现接口并由 DI 注入,领域层不依赖具体数据库 ✓ 正确答案
D 领域层必须使用 JPA 注解
#

18. 六边形(端口与适配器)如何反转依赖让领域居核心

A 六边形架构不反转依赖
B 领域直接依赖数据库适配器
C 适配器位于六边形中心
D 领域只依赖端口接口,适配器实现端口,领域居核心且不依赖外部 ✓ 正确答案
#

19. 如何识别"伪 DDD",仅分层命名却仍是事务脚本

A 伪 DDD 的实体包含丰富业务行为
B 伪 DDD 只有分层命名,实体贫血、业务逻辑在 Service 中,仍是事务脚本 ✓ 正确答案
C 只要分层就一定是 DDD
D 伪 DDD 业务规则在聚合内
#

20. CQRS 与 DDD 的契合中写侧聚合+读侧专门模型

A 读侧也走聚合
B 读写侧共用同一模型
C 写侧用聚合承载业务逻辑,读侧用专门读模型,通过事件连接 ✓ 正确答案
D CQRS 与 DDD 无关
#

21. Clean Architecture 同心圆与 DDD 层的对应关系

A Clean 的实体/用例对应 DDD 领域层和应用层,框架对应基础设施层 ✓ 正确答案
B Clean 的依赖方向由内向外
C 框架层是核心
D 两者分层完全无关
#

22. Repository 如何为聚合提供"集合式"持久化抽象

A Repository 暴露数据库表结构
B Repository 让领域层直接依赖 SQL
C Repository 以单个字段为粒度操作
D Repository 为聚合提供集合式持久化抽象,屏蔽 SQL/ORM 细节 ✓ 正确答案
#

23. Repository 的实现如何在事件溯源下变为事件存储

A Repository 的 save 变为追加事件,findById 变为重放事件重建聚合 ✓ 正确答案
B Repository 直接更新状态行
C Repository 接口需要改变
D 事件溯源下 Repository 不保存任何数据
#

24. 为何 Repository 不应泄露 ORM/SQL 细节给领域层

A Repository 接口只暴露领域语义,封装 ORM/SQL,避免领域层耦合持久化 ✓ 正确答案
B Repository 接口应暴露 SQL 条件
C Repository 让领域层依赖 EntityManager
D Repository 泄露 ORM 细节利于测试
#

25. 在一个组织中推行 DDD 时最常见的组织/沟通障碍

A 主要障碍是组织沟通:通用语言、专家参与、边界划分与团队协作 ✓ 正确答案
B 障碍主要是技术实现难度
C 领域专家无需参与建模
D 通用语言与建模无关
#

26. 在微服务中每个服务是否都应有独立领域模型与边界

A 每个小功能都应该拆成一个服务
B 所有服务共享同一领域模型
C 服务边界与业务无关
D 每个服务应有独立领域模型与数据边界,但按业务子域划分,不强行细拆 ✓ 正确答案
#

27. 如何用不变式(invariant)定义在聚合内必须始终成立规则

A 不变式可以在变更后临时违反
B 不变式是聚合内必须始终成立的规则,通过聚合根方法在变更时校验 ✓ 正确答案
C 不变式由 Service 层任意修改
D 不变式与聚合边界无关
#

28. 如何用事件风暴(Event Storming)快速梳理领域模型

A 事件风暴只关注技术实现
B 事件风暴以领域事件为主线,协作梳理业务并识别聚合与界限上下文 ✓ 正确答案
C 事件风暴是单人工写代码
D 事件风暴不涉及领域事件
#

29. 界限上下文(Bounded Context)如何划分自治的领域边界

A 所有上下文共享同一模型
B 界限上下文按业务子域与通用语言划分,每个上下文自治、独立模型与数据库 ✓ 正确答案
C 界限上下文与业务无关
D 上下文之间可任意共享数据库
#

30. 领域事件(Domain Event)如何在聚合内显式表达状态变化

A 领域事件不需要记录状态变化
B 领域事件是聚合内部私有状态
C 领域事件在聚合状态变化时显式创建,记录事实并触发副作用 ✓ 正确答案
D 聚合状态变化不发布事件