开篇词|开篇词 | 领域驱动设计的不确定性
课程背景
在探讨领域驱动战术设计的一些问题时,总会有人纠结:这个领域对象应该定义成实体,还是值对象?领域服务和应用服务的区别是什么?聚合的边界该怎么划分?于是,各种设计问题纷至沓来,问题越辩越糊涂,到了最后,已经脱离了最初探讨问题的场景,变成了“空对空导弹”一阵乱发射,最后蓦然回首,才发现目标已然消失了。
这是不合理的。在软件开发领域,没有什么一劳永逸的实现,也没有什么放之四海而皆准的标准,必须结合具体的业务场景做出合理的决策,无论建模和设计再怎么完美,也需要通过落地的检验才知道好还是坏。任何脱离具体业务场景的问题分析,都是空谈;任何不落地的完美方案,都是浮夸。领域驱动设计没有标准,有的只是持续不断的不确定性。
【开篇词|开篇词 | 领域驱动设计的不确定性】正所谓“以不变应万变”,我们要从实证主义的角度看待领域驱动设计,窃以为,只需守住三项基本原则即可:
- 必须通过领域建模来驱动设计
- 领域专家或业务分析师必须参与到建模活动中
- 设计必须遵循面向对象分析和设计的思想与原则
点击了解《领域驱动设计实践(战术篇)》课程框架
本课程是我计划撰写的领域驱动设计实践系列的第二部分课程,要解决的正是前面所提及的战术层面的设计问题。单以战术设计阶段来看,我个人认为 Eric Evans 做出的贡献并不多。在《领域驱动设计》一书中,他讲到了模型驱动设计与领域建模,却没有深入阐述该如何正确地进行领域建模;他引入的资源库模式和工厂模式,不过是面向对象设计原则的体现;至于模型的演化与重构带来的突破,其实更多是经验之谈,缺乏切实可行的方法。整体而言,Eric Evans 在战术设计要素方面,最为重要的洞见在于:
- 强调了领域建模的重要性,并与面向对象分析和设计的原则结合起来
- 实体与值对象的区分,有利于我们明白模型对象的真相,并能够更好地避免贫血模型
- 聚合提出了有别于模块粒度的边界,有效地保证了业务规则的不变性和数据的一致性
针对一些设计能力不足的开发团队,若希望采用领域驱动设计来改进设计和编码质量,往往会适得其反,做出来的是一锅“夹生饭”。从理想角度讲,决定是否采用领域驱动设计,不在于团队成员的能力高低,而在于业务的复杂度。然而,我们又不得不面对现实,如果团队成员的设计能力差了,是做不好领域驱动设计的。因此,我在本课程中,一方面分享了我的设计体验和方法,以帮助团队成员的成长,另一方面也给出了一个操作性强的设计过程,可以让基础相对薄弱的开发人员能够依样画葫芦,做出还算不错的设计与实现。
这些考虑帮助我确定了本课程的基本思路,即以能学习和模仿的战术设计方法来弥补经验之不足,以设计思想和设计原则作为指导来解决争议之问题,以能够落地的解决方案来体现领域驱动设计之价值。
本课程分为六部分,共 64 篇(含访谈录、开篇词)。
- 第一部分:软件系统中的模型(第 1-1 课 ~ 第 1-15 课)
- 第二部分:领域分析模型(第 2-1 课 ~ 第 2-7 课)
- 第三部分:领域设计模型(第 3-1 课 ~ 第 3-17 课)
- 第四部分:领域实现模型(第 4-1 课 ~ 第 4-6 课)
- 第五部分:融合:战略设计和战术设计(第 5-1 课 ~ 第 5-9 课)
- 第六部分:EAS 系统的战术设计实践(第 6-1 课 ~ 第 6-8 课)
综上,本课程的内容并未完全遵照 Eric Evans 的《领域驱动设计》,不同的部分固然是我的一孔之见,未必正确,也未必遵守 Eric Evans 的设计思想,但我仍然不揣冒昧地进行了分享,不是因为我的无知者无畏,而是我认为针对具有不确定性的领域驱动设计,必须要容得下异见者,方能取得发展和突破。
为什么要学习领域驱动设计
如果你已经能设计出美丽优良的软件架构,如果你只希望脚踏实地做一名高效编码的程序员,如果你是一位注重用户体验的前端设计人员,如果你负责的软件系统并不复杂,那么,你确实不需要学习领域驱动设计!
领域驱动设计当然并非“银弹”,自然也不是解决所有疑难杂症的“灵丹妙药”,请事先降低对领域驱动设计的不合现实的期望。我以中肯地态度总结了领域驱动设计可能会给你带来的收获:
- 领域驱动设计是一套完整而系统的设计方法,它能给你从战略设计到战术设计的规范过程,使得你的设计思路能够更加清晰,设计过程更加规范;
- 领域驱动设计尤其善于处理与领域相关的高复杂度业务的产品研发,通过它可以为你的产品建立一个核心而稳定的领域模型内核,有利于领域知识的传递与传承;
- 领域驱动设计强调团队与领域专家的合作,能够帮助团队建立一个沟通良好的团队组织,构建一致的架构体系;
- 领域驱动设计强调对架构与模型的精心打磨,尤其善于处理系统架构的演进设计;
- 领域驱动设计的思想、原则与模式有助于提高团队成员的面向对象设计能力与架构设计能力;
- 领域驱动设计与微服务架构天生匹配,无论是在新项目中设计微服务架构,还是将系统从单体架构演进到微服务设计,都可以遵循领域驱动设计的架构原则。
没有谁能够做到领域驱动设计的一蹴而就,一门课程也不可能穷尽领域驱动设计的方方面面。从知识的学习到知识的掌握,进而达到能力的提升,需要一个漫长的过程。所谓“理论联系实际”虽然是一句大家耳熟能详的老话,但其中蕴含了颠扑不破的真理。我在进行领域驱动设计培训时,总会有学员希望我能给出数学公式般的设计准则或规范,似乎软件设计就像拼积木一般,只要遵照图示中给出的拼搭过程,不经思考就能拼出期待的模型。——这是不切实际的幻想。
要掌握领域驱动设计,就不要被它给出的概念所迷惑,而要去思索这些概念背后蕴含的原理,多问一些为什么。同时,要学会运用设计原则去解决问题,而非所谓的“设计规范”。我强烈建议读者诸君要学会对设计的本质思考,不要只限于对设计概念的掌握,而要追求对设计原则与方法的融汇贯通。只有如此,才能针对不同的业务场景灵活地运用领域驱动设计,而非像一个牵线木偶般遵照着僵硬的过程进行死板地设计。
分享交流
我们为本课程付费读者创建了微信交流群,以方便更有针对性地讨论课程相关问题。入群方式请到跳转底部链接获取。
阅读文章过程中有任何疑问随时可以跟其他小伙伴讨论,或者直接向作者提问(作者看到后抽空回复)。你的分享不仅帮助他人,更会提升自己。
点击了解《领域驱动设计实践(战术篇)》
推荐阅读
- 人间词话的智慧
- 种树郭橐驼传(文言句式+古今异义+词类活用+通假字)
- GIS跨界融合赋能多领域技术升级,江淮大地新应用成果喜人
- 活学活用
- 闺蜜,太甜蜜的词会带着刺
- 2018-06-13金句系列7(金句结构-改编古现代诗词)
- 《宋词三百首》75
- 躺着中枪
- 七律·游首钢园(新韵)
- 【九洲芳文?诗词48】最高楼?登楼