@
yule111222 DDD 的要旨之一是建模人员是 Hands-on modeler 。所以,虽然可以有概念建模和领域建模的阶段,但是这只是建模过程的初始一小段,建模是要在整个软件开发过程中持续进行的(建模的结果绝不仅仅是发现了几个名词,还包括要深刻的建模业务规则,通过引入新的概念来抽象和简化规则)。事实上,如果初始的各种图没有持续更新,很快就会变成没用的或者误导团队的废纸。
如何做好建模呢? DDD 原书提到可以:
- 大声的建模(第 2.2 节):充分利用人类的语言天赋,大声的讨论、交流,最终得到一个统一的大家都理解的语言。“这个过程可以帮我们精练模型”。这是可以用 TDD 来驱动实现 DDD 的支持之一,因为在还没有代码的时候写测试,我们只能利用自己的语言能力去描述解决问题的过程。
- 绑定模型和实现(第 3 章): 在进行 DDD 时,不能将建模过程和实现过程分离,因为实现的一点点改变就意味着模型的改变。如果有人只关注建模而不关注实现,则他的建模没有用处,实际的模型将牢牢掌握在实现这个模型的开发人员手中。所以 DDD 的建模人员需要是 Hands-on modeler 。TDD 其实就是 Hands-on modeler 的武器。
- 通过重构加深理解(第三部分):在已有代码的基础上,从多个方向进行重构,尝试不同的建模想法,创造突破,从而得到更深刻的模型。TDD 产生的测试在重构的过程中为我们保驾护航。
TDD 的价值不只是在于测试覆盖,这只是它的一个副产物而已。TDD 的更大的价值在于可以用于改善设计(也即驱动 DDD ),我的另外几篇文章里面有一些思考:
- 从改善设计的角度理解 TDD:
https://brightliao.com/2019/07/20/tdd-for-improving-design/- 从改善设计的角度理解 TDD ( 2 ):
https://brightliao.com/2019/08/18/tdd-for-improving-design-2/- 好代码的五个特质 - CUPID (基于领域的章节):
https://brightliao.com/2022/05/24/5-properties-of-good-code-cupid/初始阶段进行一定程度的概念建模和领域建模是有用的,但即便在这个过程,TDD 也可以帮助我们提取和改善领域模型,除非我们的目标只是产出一个不知道是不是可以实现的设计文档(而不是一个可运行的 MVP )。从整个开发过程来看,在比初始阶段长的多得多的开发时间里进行建模,TDD 是有很大作用的。