乐于分享
好东西不私藏

领域驱动设计-软件核心复杂性应对之道(13)_通过重构得到更深层的理解

领域驱动设计-软件核心复杂性应对之道(13)_通过重构得到更深层的理解
本章的核心观点是:真正的模型深度并非一蹴而就,而是通过持续的、有意识的“知识消化”和“重构”过程逐步获得的。 这个过程超越了传统的代码重构,它要求团队不仅关注代码的可读性,更关注模型是否真正捕捉到了领域的深层含义。

核心梳理

1. 重构的两个层次

  • 传统代码重构:专注于改进代码结构、消除重复、提高可读性,不改变软件的外部行为。这是日常的、基础性的工作。
  • 为实现深层模型而重构:在深入理解领域的基础上进行,旨在改进领域模型本身,使其更准确地反映业务概念和规则。这通常需要一系列的代码重构作为支撑,但其目标是为了获得更深层的模型。

2. 重构的三大关注点

以领域为本:重构的驱动力应该来自对领域的深入理解,而不是纯粹的技术“优雅”。当代码可以工作但领域专家感到“不对”时,就是重构的信号。
用一种不同的方式看事物:重构提供了机会去发现新的、更深刻的概念。例如,将一个“计算利息”的服务重构为"Accrual Schedule"和"Accrual"对象,这不仅仅是代码的改变,更是认知的升级。
始终坚持与领域专家对话:这是获取知识、验证模型、发现重构机会的最重要渠道。专家的语言是你发现模型缺陷的“放大镜”。

3. 重构的时机与动机

  • 设计没有表达出团队对领域的最新理解:即使代码简洁,但模型语言与专家不一致时。
  • 重要的概念被隐藏在设计中了:复杂的逻辑、重复的模式,常常暗示着缺失的显式概念。
  • 发现了一个能令某个重要的设计部分变得更灵活的机会:重构不仅可以改善当下,更可以为未来铺路。

4. 探索团队

  • 重构不是单打独斗,特别是在寻求深层模型时。建议组织小型的探索团队(4-5人,包括开发人员和领域专家),通过短时间(半小时到一小时半)的头脑风暴,使用白板和UBIQUITOUS LANGUAGE,快速验证模型假设。这种团队是自组织的,任务完成后随即解散。

5. 危机就是机遇

  • 深层模型往往不是在平静中出现的,而是在危机中。当你发现一个“无论如何都解决不了的Bug”或一个“看似简单却描述不清的概念”时,这很可能是一个信号:你站在了突破(第8章)的边缘。这正是重构、深化模型的绝佳时机。

项目使用时的指导原则

基于以上核心思想,在项目中应用“通过重构得到更深层理解”时,可以遵循以下原则:

1. 将“重构”明确区分为两个层次:代码层和模型层 👥

原则:团队要意识到,重构不只是给变量改名、提取方法。最富价值的是以改进模型为目标的重构,它需要更多思考和更深入的讨论。
行动:
区分动机:在规划要重构的任务时,要清楚说明:这次重构是“为了简化代码”还是“为了深化模型”。后者的优先级通常更高。
评估影响:模型级别的重构通常影响范围更大,需要与领域专家紧密合作。在计划时,要为这类重构预留足够的时间和资源。
建立标准:代码评审时,不仅要评审技术实现,更要评审模型概念是否准确、统一。例如,“这个 "Order" 对象的 "status" 属性是否真的正确反映了业务中的订单状态?”

2. 建立“探索团队”的组织形式,促进知识交流 🤝

原则:深层理解源于智力碰撞。定期组织跨角色的、短时间的头脑风暴,是加速知识消化的高效方式。
行动:
白板时间:每周或每两周安排一次“探索会议”,由开发人员、架构师和领域专家轮流发起,讨论当前最棘手或最模糊的模型问题。
强调“自主”和“短时”:这种会议不应是正式的、冗长的。最佳实践是:一个4-5人的小团队,在一个半小时内,专注于一个具体的概念模块。如果讨论陷入僵局,先暂停,下次再继续。
形成“实践社区”:鼓励团队成员在日常工作中随时进行类似的非正式讨论。“走道里的白板”和“饮水机旁的对话”往往能诞生最好的想法。

3. 识别“重构的信号”:当“危机”和“机会”降临时 ⚠️

原则:不要只习惯于“稳定的”重构。要培养识别潜在突破的能力。能引发深层重构的信号往往令人不安,但这正是进步的前兆。
行动:
跟踪“未解决”问题:建立一个列表,记录那些“反复出现”、“尝试多次但无法优雅解决”的技术或模型问题。
专家话语“检波”:当领域专家用一种与代码中不同的语言描述问题时,竖起你的耳朵。例如,专家说“这是一个关于**‘责任传递’**的过程”,而你的代码中只有"Ship"和"Container"对象,这就是一个巨大的重构信号。
模拟“突击检查”:定期问自己:“如果现在必须用现有模型对新成员解释清楚这个核心业务,我能做到吗?”如果答案是否定的,这立刻表明需要进行模型重构。

4. 重构的黄金法则:小步快跑,持续集成 🏃

原则:即使是为了突破而进行的大规模模型修改,也应分解为一系列小的、可验证的步骤。每次前进一小步,并确保系统“始终是绿色的”(即依然能正常运行和通过测试)。
行动:
拥抱自动化测试:没有测试作为安全网,模型重构是天方夜谭。确保你的核心领域逻辑有充足的单元测试覆盖。
增量式修改:如果发现需要彻底重构一个聚合,不要一次重写所有代码。可以先提取一个接口,或者引入一个辅助的“翻译”类,逐步迁移客户端。
定期反省:每周回顾一下,在过去的一周里,你的模型是否变得更“深”了?你学到了什么领域知识,并将其融入了模型?

5. 学习用“新模式”替换“旧模式”,接受不完美 🔄

原则:重构得到的“更深层模型”可能不是最终的、完美的。它应该比之前的更好,更贴近业务。 “足够好”的模型比“完美但永远实现不了”的模型有价值得多。
行动:
验证:用新的模型和语言,和领域专家一起“走查”一个新的或旧的业务场景。如果走查过程流畅自然,那模型就是“足够好”的。
记录演进:不要删除旧模型的所有痕迹。可以在文档或代码注释中简要记录一下重构的动机和旧模型的问题,以便未来的团队理解设计决策的历史。
避免“完美主义”:持续重构。一旦当前的模型能够清晰、准确地表达领域知识,并支持了当前的需求,就继续前进。新的理解将在后续的开发中自然涌现。
总结: 在项目中运用“通过重构得到更深层理解”的理念,核心是将重构视为持续学习、深刻理解领域的过程。其指导原则是:区分代码层与模型层的重构;建立自组织的探索团队;将“危机”视为深化模型的机会;坚持小步快跑和自动化测试;并接受“足够好”是比“完美”更务实的目标。