爽!字节大佬 DDD(领域驱动设计)巅峰之作,拆解业务代码真好用
前 言
至少 20 年前,一些顶尖的软件设计人员就已经认识到领域建模和设计的重要性,但令人惊讶的是,这么长时间以来几乎没有人写出点儿什么,告诉大家应该做哪些工作或如何去做。尽管这些工作还没有被清楚地表述出来,但一种新的思潮已经形成,它像一股暗流一样在对象社区中涌动,我把这种思潮称为领域驱动设计(domain-driven design)。
过去 10 年中,我在几个业务和技术领域开发了一些复杂的系统。我在设计和开发过程中尝试了一些最佳实践,它们都是面向对象开发高手用过的领先技术。有些项目非常成功,但有几个项目却失败了。成功的项目有一个共同的特征,那就是都有一个丰富的领域模型,这个模型在迭代设计的过程中不断演变,而且成为项目不可分割的一部分。
本书为作出设计决策提供了一个框架,并且为讨论领域设计提供了一个技术词汇库。本书将人们普遍接受的一些最佳实践综合到一起,并融入了我自己的见解和经验。面对复杂领域的软件开发团队可以利用这个框架来系统性地应用领域驱动设计。
![](https://static001.geekbang.org/infoq/e1/e1a899ec5ab15e4e0bd1fc5beafe0606.png)
内 容 提 要
本书是领域驱动设计方面的经典之作,全书围绕着设计和开发实践,结合若干真实的项目案例,向读者阐述如何在真实的软件开发中应用领域驱动设计。书中给出了领域驱动设计的系统化方法,并将人们普遍接受的一些最佳实践综合到一起,融入了作者的见解和经验,展现了一些可扩展的设计最佳实践、已验证过的技术以及便于应对复杂领域的软件项目开发的基本原则。适合各层次的面向对象软件开发人员、系统分析员阅读。
完整内容已上传网盘,有感兴趣需要获取学习的朋友,麻烦帮忙转发下,后台私信【学习】,获取免费下载方式。
本书分为 4 个部分。
第一部分“运用领域模型”
![](https://static001.geekbang.org/infoq/90/90b21ccb159ea48d57f872a2679d8bc5.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
![](https://static001.geekbang.org/infoq/ff/fff35459e654f093e5b66651c70322fb.png)
提出领域驱动开发的基本目标,这些目标是后面几部分中所讨论的的实践的驱动因素。由于软件开发方法有很多,因此第一部分还定义了一些术语,并给出了用领域模型来驱动沟通和设计的总体含义。
![](https://static001.geekbang.org/infoq/f0/f0c6382d3cab101caf9a23bf817aec11.png)
![](https://static001.geekbang.org/infoq/f8/f89f57dc62fa9af611d4225e241db034.png)
![](https://static001.geekbang.org/infoq/7a/7a6c71bb18fb23b12158b787c15b3720.png)
第二部分“模型驱动设计的构造块”
![](https://static001.geekbang.org/infoq/07/07360dcd93ea415701bac7e3059d6f53.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
![](https://static001.geekbang.org/infoq/c9/c9e4c66c7616de28a8991f9132e04a24.png)
将面向对象领域建模中的一些核心的最佳实践提炼为一组基本的构造块。这一部分主要是消除模型与实际运行的软件之间的鸿沟。团队一致使用这些标准模式就可以使设计井然有序,并且使团队成员更容易理解彼此的工作。使用标准模式还可以为公共语言贡献术语,使得所有团队成员可以使用这些术语来讨论模型和设计决策。但这一部分的主旨是讨论一些能够保持模型和实现之间互相协调并提高效率的设计决策。要想达到这种协调,需要密切注意个别元素的一些细节。这种小规模的仔细设计为开发人员提供了一个稳固的基础,在此基础上就可以应用第三部分和第四部分讨论的建模方法了。
![](https://static001.geekbang.org/infoq/26/265ccf6c4f407570b1eb9a5d4b93d10c.png)
![](https://static001.geekbang.org/infoq/34/34b924b4094689d9a20413b9cf022fb6.png)
![](https://static001.geekbang.org/infoq/21/21155cb7d76107cb5b27334ea0a427fc.png)
![](https://static001.geekbang.org/infoq/bf/bf1ebee80c45410b18bd0e3f07ae1fed.png)
第三部分“通过重构来加深理解”
![](https://static001.geekbang.org/infoq/3a/3a74a09ac187b6bea4520474389b0b12.png)
![](https://static001.geekbang.org/infoq/72/7280f6fb85ce21db3fa81231cce311e6.png)
讨论如何将构造块装配为实用的模型,从而实现其价值。这一部分没有直接讨论深奥的设计原则,而是着重强调一个发现过程。有价值的模型不是立即就会出现的,它们需要对领域的深入理解。这种理解是一步一步得到的,首先需要深入研究模型,然后基于最初的(可能是不成熟的)模型实现一个初始设计,再反复改进这个设计。每次团队对领域有了新的理解之后,都需要对模型进行改进,使模型反映出更丰富的知识,而且必须对代码进行重构,以便反映出更深刻的模型,并使应用程序可以充分利用模型的潜力。这种一层一层“剥洋葱”的方法有时会创造一种突破的机会,使我们得到更深刻的模型,同时快速进行一些更深入的设计修改。
![](https://static001.geekbang.org/infoq/85/85eb46e367310f2cfd6d59304684b009.png)
![](https://static001.geekbang.org/infoq/13/1392fe2d3cc2d30901afb7964238eba9.png)
![](https://static001.geekbang.org/infoq/d1/d15bbaebe13856ee0a47def31d5aa315.png)
![](https://static001.geekbang.org/infoq/a7/a75b95fd37b316e572699f3602d83789.png)
![](https://static001.geekbang.org/infoq/56/5652ccc4867b024d08aa03c259eb836d.png)
![](https://static001.geekbang.org/infoq/21/218e6714a1a19fe3b9251fcce4b20a02.png)
第四部分“战略设计”
![](https://static001.geekbang.org/infoq/ae/aeaca0725b3a5945eee6ecf447ea2dbd.png)
![](https://static001.geekbang.org/infoq/e0/e0354791d2e196e1e188e2a080802147.png)
讨论在复杂系统、大型组织以及与外部系统和遗留系统的交互中出现的复杂情况。这一部分探讨了作为一个整体应用于系统的 3 条原则:上下文、提炼和大型结构。战略设计决策通常由团队制定,或者由多个团队共同制定。战略设计可以保证在大型系统或应用程序(它们应用于不断延伸的企业级网络)上以较大规模去实现第一部分提出的目标。
本书通篇讨论使用的例子并不是一些过于简单的“玩具式”问题,而是全部选自实际项目。
![](https://static001.geekbang.org/infoq/f1/f1ce840fd9bf210e214742f77d0b543e.png)
![](https://static001.geekbang.org/infoq/3f/3f4ec2cd234fd21c43f97f363afdec73.png)
![](https://static001.geekbang.org/infoq/09/096acaf20bf5115ffebc203898faa9f2.png)
![](https://static001.geekbang.org/infoq/69/699498cd9a63439e4b48b545516f3f66.png)
文章展示到此结束,对这篇文章感兴趣的朋友, 点击这里 即可获取
评论