关于后端:DDD小传领域驱动设计为什么这么火

52次阅读

共计 4932 个字符,预计需要花费 13 分钟才能阅读完成。

你好,我是钟敬。

明天咱们正式开始学习畛域驱动设计(DDD)。

尽管 DDD 在这几年越来越风行,然而对于它的一些根本问题,业界依然有很多不同认识。

有人说,DDD 是划时代的翻新;但也有人说,DDD 只是新瓶装旧酒,毫无新意;有人认为,DDD 仅仅是为了开发微服务;也有人认为,DDD 只是一种面向对象编程的办法;还有人认为,DDD 只是多数高手的专利。

这些认识都是全面的,阐明还有不少人并没有真正了解 DDD 的基本概念。对基本概念不足理解,必然会影响对 DDD 的了解和学习。

所以,这节课咱们先聊聊 DDD 是什么,DDD 的起源,DDD 解决了什么问题以及 DDD 在这几年流行起来的起因。理解了这些,置信你对下面的问题就会有一个正确的意识,也会为后续的学习打下基础。

DDD 说的是什么?

2003 年,Eric Evans 写了《畛域驱动设计:软件外围复杂性应答之道》一书,正式提出了这种办法。畛域驱动设计的英文是 Domain-Driven Design,所以简称 DDD。上面就是这本书的中英文封面:

依照作者本人的说法,“DDD 是一种开发简单软件的办法”。

为了把意思说得更透彻,我把作者的原话做一个扩大:“DDD 是一种开发 简单 软件的 系统化 方法学 思维”。咱们上面掰一下这句话。

首先,到底 什么是方法学?

方法学的英文名是 methodology。这么说吧,如果你 Java 代码写得特地溜,那么能够说你把握了面向对象的 编程办法 ;如果你还很相熟面向对象的设计准则,把握很多设计模式,那能够说你懂面向对象的 设计办法 ;如果你能为业务概念构建畛域模型,那么你就懂了面向对象的 分析方法。面向对象的剖析、设计、编码三种办法死记硬背,成为一个有机的整体,这个叫面向对象的 方法学

咱们发现,很多小伙伴都能熟练掌握编程办法,其中一些小伙伴,能把握设计办法,但把握分析方法的,就很少了。而分析方法,或者说领域建模的办法,正是 DDD 的重点。对于什么是领域建模,咱们在前面的课程中还会具体讲。

方才说,DDD 是 系统化 的方法学。那么 什么是系统化呢

咱们用数学举个例子。现代数学家祖冲之花了一辈子工夫,用“割圆术”把圆周率算到小数点后 7 位,在过后曾经是世界领先了。而当初的大学生,只有把握了微积分,用一天的工夫算进去的圆周率,就比祖冲之一辈子算进去的还准。

那么是不是能够说,当初轻易一个大学生,智商都比祖冲之高呢?这可不见得。之所以咱们算得比祖冲之准,是因为前辈们总结了微积分这套办法,咱们站在了伟人的肩膀上能力做到。微积分,就是解决高等数学问题的系统化的办法。

所以,系统化办法的作用在于,提供了一套绝对容易的步骤,可能使咱们这些中等智商的人,也能做到原来高智商的人才能做到的事件,从而让你可能省出工夫和脑力,来摸索更简单的问题。在软件开发畛域,DDD 就是这样一套系统化的方法学。

不过,据说有人问过 Evans 自己:“DDD 是一种方法学吗?”Evans 说,DDD 不只是一种方法学,更重要的是背地的一套开发软件的思维和哲学。那么,DDD 中又蕴含着哪些思维和哲学呢?

演绎一下,大略有构建常识、分而治之、抓大放小、对立语言、抽象化、可视化、合作以及演进等等。但凡说到思维,都是一些大词儿,听起来都对,然而感觉如同没什么用,要害是不晓得怎么落地。

而 DDD 恰好是通过总结了一套系统化的方法学,可能把这些大词落地。具体做法,咱们会在后续的课程中解说。

DDD 的起源

为了让你进一步了解 DDD 的含意,咱们再理解一下 DDD 的起源。

依照作者在原书中的说法,DDD 是来自面向对象的方法学和麻利软件开发。DDD 对它们进行了总结和提炼,使之更容易学习和实际。

业界有一句话“DDD 就是 OO Done right”。OO 就是面向对象,也就是说把面向对象做对了,就是 DDD。也能够反过来说,面向对象原本就是“畛域驱动”的。

不过,面向对象方法学从 80 年代衰亡,到了 2000 年前后曾经走向成熟。那么问题就来了:既然有了面向对象,咱们为什么还要提 DDD 呢?这是因为传统的面向对象方法学依然存在一些问题。

传统面向对象方法学的问题

晚期面向对象的胜利,次要是在几个特定的畛域,比方计算机语言、图形用户界面、办公自动化软件等等,但在企业应用方面还没有取得成功。所谓企业应用,包含像银行的贷款零碎、保险公司的理赔零碎、电信公司的计费零碎等等。

那个时候的面向对象方法学还不能很好地利用于企业应用,大体上有以下几个起因。

第一个起因是,很多开发人员走了一条只重技术不重业务的弯路。企业应用是用来解决业务问题的,所以咱们应该首先把业务钻研分明,再通过技术手段来实现。但很多开发人员把次要精力放到技术的钻研上,比方语言、框架、工具等等。认为把技术学会了,天然就能把零碎开发好。

重技术、不重业务的思维造成了业务和技术人员之间难以相互理解,技术人员难以真正满足业务需要,如果连需要的方向都搞错了,那么技术再熟练也会背道而驰。这样的弯路走了十几年,晚期面向对象方法学的大好形势也就云消雾散了。

第二个起因是,围绕业务进行开发的办法自身就不好学。面向对象方法学次要是围绕领域建模发展的。领域建模这个货色,看老师傅做的时候如同挺简略,老手一下来,怎么做都不对。

这是因为,领域建模是一种“手艺”。但凡手艺,都不是看看书、学学实践就能把握的,而是要通过实际中的磨炼。很多小伙伴听了 DDD 的课,也看了 DDD 的书,然而没法在实践中真正解决简单的问题,就是因为没把握这门手艺。

第三个起因是,晚期面向对象方法学次要思考的是建模技术,很少思考合作问题。历史上很多平凡的软件开始时都是集体作品,比方 UNIX 和 C 语言。作者在一开始是写给本人用的,所以并不存在合作问题。然而企业应用则不同,少数都是团队作战。即便只有一线开发人员,也免不了和需求方打交道。所以合作变得很重要。

最初一个起因是难以适应变动。企业应用的需要往往变动频繁,很多变动根本无法意料。传统的面向对象方法学也很少探讨怎么应答变动的需要。

DDD 的解决之道

能够说,DDD 正是为了解决下面这些问题而提出的。首先你从“畛域驱动设计”这个名字就可以看进去。“畛域”指的就是软件系统要解决的业务问题,也能够叫“业务畛域”。用畛域来驱动设计,就是说要从业务登程进行零碎的设计。强调这个准则,就是心愿把开发者从只重技术的弯路上拉回来。

要搞清业务,就要学会领域建模。后面也说了,这并不好学,那怎么办?DDD 采纳了“模式”的办法。

咱们都晓得,老专家做事比老手做得好,阐明专家心里肯定有些老手不晓得的货色。这些货色以前不容易讲清楚,起初有人把专家心里的这些高招都进行了系统化的梳理,每一条都是解决特定难题的通用的解决方案,这就是所谓“模式”。

计算机界最有名的是设计模式,起初又有剖析模式、架构模式等等。读这些讲模式的书,就如同同时有好几个巨匠在给你讲课一样。通过学习模式,原来不容易把握的货色就变得绝对容易了。

Eric Evans 正是对面向对象方法学和麻利软件开发办法进行了提炼,总结出了一套围绕领域建模进行软件开发的模式,一共有四十多个。这些模式成为《畛域驱动设计》这本书的主体。

除了模式,书里还有一套相干的准则和实际。其中最根底的模式包含:模型驱动设计,实体、值对象等等。这些在后续的课程中,咱们都会讲清楚。

另一方面,畛域驱动设计十分强调业务人员和技术人员要一起合作进行领域建模,在这个过程中提炼畛域常识。和合作密切相关的模式有通用语言、模型驱动设计、限界上下文等等。实际上,这几个模式贯通了整个 DDD。

此外,DDD 提出了所谓“柔性设计”的概念,使得模型和零碎能够随着需要的变动而演进。什么意思呢?书里打了一个比如:这就好比一副新的皮手套,开始时整副手套都很生硬;戴得久了,关节处就会天然变得柔软,而其余局部还是比拟硬的。

同样,在软件设计中,也不是一开始就把所有中央都设计得很灵便,而是先进行“足够的”和“整洁的”设计。

随着业务变动,将变动频繁的局部重构得越来越灵便,而不常变动的局部则放弃不变。也就是说,模型中的哪些局部须要设计得灵便,是天然演进造成的,这样就防止了“适度设计”。这个过程就是柔性设计。而这个重构的过程,也是一直加深畛域常识了解的过程。

对于合作和演进,正是 DDD 的起源之一,麻利软件开发所解决的重点问题。

从“寂静”到“爆火”

看到这里,你是不是感觉 DDD 还不错呀?不过,《畛域驱动设计》这本书其实是 2003 年写的,到当初将近 20 年了。直到最近几年,才真正开始遍及起来。

你可能会问了,既然 DDD 这么好,为什么之前不火,当初才火起来呢?

其实,在 DDD 刚呈现的时候,很多企业软件还不太简单。一些简单的软件,变动也不像当初这样频繁。甚至还有一些企业,罗唆每隔四五年把原来的零碎颠覆重建一次。

另一方面,过后一些新兴的产业,例如互联网,还处在跑马圈地、横蛮成长的阶段。这时关注的是零碎疾速上线,抢占市场,至于软件品质好不好,容不容易保护,临时不是思考的重点。

在这种状况下,DDD 就成了一种“屠龙术”。杀龙是一项比拟艰难的技术,然而就算学会了,全世界也找不到几条龙,所以屠龙术就显得没有什么用途。DDD 就面临着这样的难堪,或者说,从整个业界来看,必要性还不够强。

另一方面,DDD 遍及的一些前提条件也还没筹备好。

首先是麻利软件开发刚刚呈现不久,还不遍及。如果没有迭代开发、继续重构、测试驱动、继续集成等麻利实际的反对,构建良好的畛域模型并在代码上落地是很艰难的。

其次是配套的开发框架还不成熟。那时 J2EE 还被认为是企业应用事实上的规范,而基于这种框架开发程序,是很难和 DDD 的畛域模型相衔接的。2004 年,Spring 公布了 1.0 版,从技术上根本解决了 EJB 的问题,实践上能够比拟好地反对 DDD。然而 Spring 的真正遍及,还要假以时日。

那么 DDD 为什么在这几年又火起来了呢?

首先是,数字化时代的到来,使 DDD 变得十分有必要。

数字化时代,技术逐步成为企业外围竞争力的次要因素,无论业务还是零碎都变得更加简单。因而,如何将业务和技术融为一体,就成了很多企业的次要问题,而这正是 DDD 的次要劣势。

行业竞争的加剧也要求零碎具备更好的用户体验、更高的品质、更快地满足变动的需要。这些问题很难解决,必须引入系统化的办法。再说了,云计算、微服务等新技术架构的产生,也须要方法学的反对。能够说,“恶龙”曾经遍地都是,“屠龙术”终于有了用武之地。

第二,DDD 遍及的路线曾经铺好,这项技术逐步变得可行。

当初,麻利软件开发曾经遍及。迭代、演进、合作等思维曾经深入人心。DevOps 技术利用得也日益宽泛。而且 Spring boot 等轻量级框架曾经失去宽泛应用。这些框架反对了畛域模型与具体技术的关注点拆散,使开发人员从技术细节中解放出来,将更多的精力投入到畛域逻辑自身的剖析和设计。

再者,相干的架构实际也曾经钻研得比拟透彻,像整洁架构、事件驱动架构以及 CQRS 等等,都无力地反对了 DDD 的落地施行。DDD 自身也在不断完善,比方补充了像畛域事件等新的模式,呈现了事件风暴等新的实际。

能够说是天时地利人和皆备,DDD 终于咸鱼翻身、星火燎原了。

总结

好,当初咱们来总结一下。

明天咱们介绍了 DDD 的概念、内容,以及近年来衰亡的起因。总的来说,DDD 是一种开发 简单 软件的 系统化 方法学 思维。

DDD 建设在面向对象方法学和麻利软件开发办法之上,一方面保留了面向对象的精髓,另一方面又补救了晚期办法的有余。

DDD 从面向对象和麻利中提炼出了一套准则、模式和实际,使面向对象方法学在企业应用中更加容易学习和把握。

DDD 的外围是领域建模。畛域模型是稀释的畛域常识。此外,DDD 还器重业务与技术人员的沟通,以及如何应答变动。

最初,我想说,数字化时代为软件开发带来了新的挑战。如何实现业技交融,如何应答复杂多变的需要,如何避免架构和代码的腐化等问题,须要新的解决办法。而 DDD 正是适应了时代的要求,才日益遍及起来。

思考题

上面有两道思考题:

1. 有人说 DDD 的目标就是为了开发微服务,你批准这种说法吗,为什么?

2. 有人说 DDD 是翻新,有人说不是,你的认识是怎么的呢?

欢送在评论区分享你的想法。下一节课,咱们将从实战中领会 DDD 的魅力,开启第一个迭代。

正文完
 0