描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121348525
Vernon将指导你掌握每一项为了构建更好的软件所必须的核心DDD技术。你将学会如何使用强大的限界上下文模式来分离领域模型、如何在明确的边界内发展通用语言,以及如何帮助领域专家和开发者紧密协作来创造这种语言。他还展示了如何借助子域来处理遗留系统,以及如何利用各种团队关系和技术机制来集成多个限界上下文。
本书内容包括:
√ DDD可以为你或者你的组织做些什么,以及它为什么如此重要
√ DDD战略设计的基石:限界上下文和通用语言
√ 使用子域进行战略设计
√ 上下文映射:帮助团队更具策略性地进行协作并集成软件
√ 使用聚合和领域事件进行战术设计
√ 使用项目加速和管理工具来建立并维护团队的节奏
第1章 DDD对我而言 1
DDD很难掌握吗 2
优秀设计、糟糕设计和有效设计 3
战略设计 8
战术设计 9
学习过程与知识提炼 10
让我们开始吧! 11
第2章 运用限界上下文与通用语言进行战略设计 13
领域专家和业务驱动 20
案例分析 24
战略设计是必要的根基 28
在质疑中统一 32
发展通用语言 38
应用场景 42
如何持续 45
架构 46
本章小结 50
第3章 运用子域进行战略设计 51
什么是子域 52
子域类型 53
应对复杂性 54
本章小结 56
第4章 运用上下文映射进行战略设计 57
映射的种类 60
合作关系 60
共享内核 61
客户—供应商 62
跟随者 63
防腐层 64
开放主机服务 65
已发布语言 65
各行其道 66
大泥球 67
善用上下文映射 69
基于SOAP的RPC 70
RESTful HTTP 72
消息机制 74
上下文映射示例 79
本章小结 83
第5章 运用聚合进行战术设计 85
为什么使用它 86
聚合的经验法则 91
规则一:在聚合边界内保护业务规则不变性 92
规则二:聚合要设计得小巧 93
规则三:只能通过标识符引用其他聚合 95
规则四:利用终一致性更新其他聚合 96
建立聚合模型 99
慎重选择抽象级别 104
大小适中的聚合 106
可测试的单元 108
本章小结 108
第6章 运用领域事件进行战术设计 111
设计、实现并运用领域事件 113
事件溯源 119
本章小结 121
第7章 加速和管理工具 123
事件风暴 124
其他工具 134
在敏捷项目中管理DDD 135
运用SWOT分析法 137
建模Spike和建模债务 139
任务识别与工作量估算 140
限制建模时间 143
如何实施 144
和领域专家打交道 145
本章小结 147
参考文献 148
2003年,Eric Evans的《领域驱动设计》出版,次总结了这种软件设计和建模方法。这种方法让团队在质疑中发展出对复杂问题的统一认识,再利用战略设计和战术设计的各种手段,如同庖丁解牛般地分解并映射成各种构造块,后信手拈来地运用各种设计模式将这些构造块一一化解。领域驱动设计在国外的技术社区一直是受到热捧、不断演化的软件设计方法。在Eric的著作面世十年之后,另一位DDD社区的领军人物Vaughn Vernon撰写了《实现领域驱动设计》。在这本著作中,Vaughn用一个连贯完整的实例,将领域驱动设计的所有概念和模式串连在一起,并将这些内容落地到了实例的代码之中。另外,他还在这部著作中总结了这十年来DDD社区涌现的一些新的架构风格和模式,如事件溯源和CQRS、REST风格的架构、事件驱动的架构、六边形架构,等等。
但这十几年间,在国内技术社区,领域驱动设计却像被遗忘在角落的宝藏等待着人们去发掘。当越来越复杂的业务场景开始频繁涌现,当工程实践和基础设施发展成熟,我们重新将视线汇聚在如何达成有效设计、将复杂的业务分而治之,我们发现这种设计方法仿佛早就看透了一切。当宝藏上的灰尘被拂去,领域驱动设计再次发出璀璨夺目的光芒,为我们指明应对软件系统复杂性的前进方向。
重新焕发青春活力的领域驱动设计得到了许多新的团队和架构师的青睐。他们首先就会去阅读这两部略微晦涩的著作,期望能快速地学习和掌握这种方法,但很快就会发现这并不轻松。首先,这两部著作要求读者具备一定的软件开发技术背景。在领域驱动设计的实践中,业务领域的专家在团队中扮演关键角色,他们往往没有软件开发的技术背景。两位软件巨匠在著作中详细阐述技术概念和实现代码时并没有照顾他们的感受。其次,这两部著作缺少对实际项目建模过程的描写。我们读到的内容多是概念的阐述和与之对应的实例及代码,对于建模实操的过程和工具着墨不多。而这些Magic Move却是很多团队实施领域驱动设计时迫切需要指导的关键步骤。后,两部著作的内容包罗万象,读者容易被繁杂的知识淹没。两部著作中的一些概念和模式(如值对象、实体、工厂和仓储)早已深入人心。而另一部分模式和架构(如事件溯源和CQRS)则要求架构经验尚浅的读者通过项目实践或扩展阅读才能深入理解。
作为《实现领域驱动设计》一书的作者,Vaughn也意识到了这些问题,因此编写了这本“精粹版”。他将领域驱动设计的知识进行了提炼,保留了子域、限界上下文、上下文映射、聚合、领域事件这些核心概念,分别用一个章节进行了阐述。在后一章,作者将他过去在一些团队中实践领域驱动设计时行之有效的具体操作方法(如风靡DDD社区的事件风暴工作坊)和工具进行了总结。本书的内容更侧重于高层次的战略设计,关于战术设计的内容偏少,尤其是代码在内容中的比重极低,完全不影响非技术背景的读者阅读。如果你想开始在团队中尝试领域驱动设计,对于团队(包括业务领域的专家)来说,本书的内容可以作为指导手册,让他们快速地进入状态,达到可以参与事件风暴工作坊的要求。我们建议读者们在阅读本书之后亲自组织并实施一次事件风暴工作坊,这是作者推荐的融合视觉、听觉和触觉三种学习方式的“知识获取”实践,是威力无穷的领域建模形式。在开发团队完成建模并终需要落实到代码时,读者可以将本书作为“武林秘籍”的目录,结合前两部著作和本书参考文献中引用的其他专著一起阅读。
本书中,作者毫不掩饰地表达了对一些架构模式和具体实践的偏好。这些特色鲜明的观点之中,有些符合社区的普遍认知,如事件驱动的响应式架构、单元测试、事件风暴;有些却是对争议性话题的个人理解,如作者对于建模设计的工作量估算的看法。我们要牢记一点,没有“银弹”可以精确地匹配我们的产品和团队,或者完美地解决我们要面对的问题。任何工具和实践都有约束条件。读者们在采用这些工具和实践时,不妨仔细思考作者运用它们的上下文及其体现出的原则,结合自己的实际情况对工具和实践进行持续改进,避免出现教条主义错误。
我和同事笪磊结对完成了对本书的翻译。我们一人擅长技术,一人则擅长管理,翻译的过程也是我们默契配合、实践“发展通用语言”的“知识获取”过程。我们也将个人对关键内容的理解补充记录在译注中。我们力求翻译内容的准确和译注的质量,但受限于个人经验和知识水平,难免出现偏差甚至错误,还请各位读者斧正。
本书翻译工作于2017年末启动,两个月后初稿完成并进入了审校阶段。这期间正值农历戊戌年春节,我们的投入离不开家人们的理解和支持,谢谢她们。我们还要感谢提出宝贵意见的审校者:肖然、刘传湘、王威、朱傲、黄雨清、王林波。他们过去几年都活跃在国内DDD社区,也帮助过许多团队运用领域驱动设计方法和事件风暴工作坊来实施架构设计和系统改造。他们过硬的理论知识和丰富的实践经验让本书的翻译增色不少。后,我们还要感谢专业和严谨的编辑张春雨和刘佳禾,本书也凝聚着你们的心血。
覃宇
2018年7月
序
为什么建模是一件既有趣又回报诸多的事情?从孩童时起,我就喜欢上了构建模型。那时我搭建多的是汽车和飞机。当时我并不知道乐高玩具的存在。不过,从我的儿子很小的时候起,乐高就一直伴随着他的成长。用这些乐高积木构思和搭建模型是如此令人着迷。构建一个基础模型非常简单,几乎可以无止境地发挥想象力。
你也许也会联想到某些新潮的建筑模型。
模型在我们生活中无处不在。如果你喜欢玩桌游,你正是在使用模型。这里的模型可能是房产和业主,或是岛屿和幸存者,抑或是领地和建设活动,等等。同样,视频游戏也藏匿了多个模型。这些模型也许塑造了一个奇幻世界,那里充满了奇特的人物,他们扮演着梦幻般的角色。而扑克牌或者与之相关的游戏则是体现着竞技的模型。模型就是生活的一部分。人们总是在使用模型,虽然往往并不会承认。
为何如此?因为人人皆有各自的学习方式。虽然学习方式有很多种,但讨论多的三种方式是听觉、视觉和触觉。听觉学习者通过声音和聆听来学习。视觉学习者通过阅读和浏览影像来学习。触觉学习者通过触摸的行为来学习。有趣的是,每个人都会热衷于某种学习方式,以至于有时会在其他学习方式上遇到麻烦。例如,触觉学习者能记住他们所做过的事情,但可能会忘记过程中所听见的内容。建模的过程主要会涉及视觉和触觉的刺激,因此你可能会认为视觉和触觉学习者比听觉学习者更具有优势。然而,事实并非总是如此,尤其当一组建模者在构建的过程中使用有声沟通时。换句话说,模型的构建过程应该适用于大多数人的学习方式。
从建模中学习的能力是人类与生俱来的,为何不利用它去构建已经给生活带来巨大帮助和影响的软件模型呢?事实上,软件模型需要人类去实现,也应该由人类去完成。我认为,人类本应该是优秀的软件模型构建者。
我强烈期望能够帮助你使用好的建模工具来实现软件。这些工具已被打包成“领域驱动设计”工具箱,或称之为“DDD”工具箱。该工具箱实际上是一套模式,在Eric Evans所著的《领域驱动设计:软件核心复杂性应对之道》[DDD]一书中首次提出。我期望将DDD带给每一个人。如果必须表达我的观点,我想说的是,让我把DDD介绍给大家吧!DDD也本该如此,它是面向模型设计的人们用于构建卓越软件模型的工具箱。本书中,我会尽可能地简化DDD的学习和使用,并将其带给每一位读者。
对于听觉学习者而言,DDD通过团队的沟通来构建基于通用语言的开发模型,并以此创造学习的契机。对于视觉和触觉学习者来说,在团队进行战略和战术建模时使用DDD,其过程高度视觉化并非常注重实操。绘制上下文映射图 并使用事件风暴构建业务流程时尤为如此。因此,我相信DDD可以帮助到每一位期待通过模型构建来学习并且希望获得伟大成就的人。
本书所面向的读者
本书适用于对快速学习DDD核心概念和主要工具感兴趣的人。主要的读者是软件架构师和开发者,他们将在项目中实践DDD。通常,软件开发者会很快发现DDD的美妙之处,并被其强大的工具深深地吸引。尽管如此,本书也可以帮助高管、领域专家、经理人、业务分析师、信息架构师和测试人员理解这一主题。并非只有那些从事信息技术(IT)行业和研发(R&D)行业的从业者才能从书中获益。
如果你是一位顾问,并且正在推荐你的客户使用DDD,那么请将本书提供给主要负责人,这会帮他们快速地理解DDD。如果你团队中的初级、中级甚至资深开发人员需要尽快在项目上采用DDD,但对其并不熟悉,请让他们阅读此书。本书至少可以让所有的项目负责人和开发人员熟悉DDD词汇表,并了解即将使用的主要工具,这将使他们能在项目推进过程中不断地分享一些有意义的内容。
无论你处于什么样的经验水平或担任什么样的职务,请阅读本书并在项目中实践DDD。之后再重读此书,看看你从项目中学到了什么,以及将来如何进一步改进。
本书的内容
第1章解释了DDD能为你和你所在的组织带来什么,并详尽地说明了你将学到什么,以及DDD为何如此重要。
第2章介绍了DDD的战略设计,并教授了DDD的重要概念:限界上下文与通用语言。第3章解释了子域,以及在新应用建模时如何使用子域应对新应用与现有遗留系统集成的复杂性。第4章教授了团队在战略层面上的各种协作方式,以及软件的集成方式,即所谓的上下文映射。
第5章将注意力转移到了使用聚合进行战术建模中。领域事件是一个与聚合共同使用的重要而又强大的战术建模工具,它是第6章的主题——运用领域事件进行战术设计。
后,第7章会着重介绍一些加速设计和管理项目的工具,它们可以帮助团队建立并保持研发节奏。以上的两个话题很少在其他DDD书籍中讨论,但确实是那些决心将DDD付诸实践的人所迫切需要的。
行文惯例
请在阅读中注意几点行文惯例。所有讨论的DDD工具都会用楷体字表示。例如,你将会看到以楷体印刷的限界上下文和领域事件。另外所有的源代码将会用等宽字体印刷。本书正文章节中出现在方括号内的首字母缩写代表相关的书籍和文献,它们都列在本书末尾的参考文献中。
评论
还没有评论。