使用DSL实现DDD快速落地

码农沉思录

共 2571字,需浏览 6分钟

 ·

2021-06-13 10:02




开发大型软件最难的部分并不是实现,而是要深刻理解它所服务的现实世界的领域。领域驱动设计(Domain-Driven Design,DDD)是一种处理高度复杂领域的愿景(Vision)和方法,它主张在软件项目中把领域本身作为关注的焦点,维护一个对领域有深度认知的软件模型。


领域驱动设计(DDD),其实就是以领域模型驱动软件设计。要理解 DDD,关键是理解什么是 DDD 所指的领域模型,但在此之前,还是应该先认识一下软件开发的过程。然后,基于此认识重温一下 DDD 在战术以及战略层面的若干关键概念。


2004 年,DDD(领域驱动设计)这一软件开发的方法与愿景经由建模专家 Eric Evans 的经典著作Domain-Driven Design: Tackling Complexity in the Heart of Software 正式面世,当即获得了广泛关注和高度评价。17 年间,网上越来越多关于 DDD的文章和讨论。为什么我们现在还不停地讨论 DDD?为什么DDD仍然如此重要?


在商业组织中,主张“技术为业务服务”的企业总可以在理论上立于不败之地。诚然,DDD主张在软件项目中把领域本身作为关注的焦点(换句话说就是技术人员要懂业务)符合这种思想,但真正难能可贵的是,DDD提供了切实可行的应对软件核心复杂性的方法。


实践证明,DDD 提出的方法不仅行之有效,而且历久弥新。


关于“产业互联网即将进入黄金时代”的说法,大多是众多传统企业希望借力最新的信息化,特别是互联网工具(即所谓“互联网+”),提升内部效率和对外服务的能力。传统产业中的很多领域概念和业务流程并不一定为普通的开发者所熟知——这与“消费互联网”不同,显然人人都是消费者。所以,传统产业的信息化急需可以快速梳理并深刻地认知领域,以及能构建高质量领域模型的技术人才。DDD 可以说是技术人员升职加薪的“神兵利器”。


我在工作中看到的情况是,越来越多的技术人员在自己的求职简历上写上了“熟悉(或精通)DDD”的描述。确实,Eric Evans 的经典著作以抽象、凝练著称,可谓字字珠玑,甚至很多资深技术人员都不能领悟其中玄妙。所以,我也认同掌握 DDD 是一件足以让技术人员引以为傲的事情。


可以说,DDD 是公认的解决软件核心复杂性的“大杀器”。但是,在软件开发中实践 DDD 是需要付出相当大的成本的。也就是说,大家的普遍看法是:实践 DDD 是一个先苦后甜的过程,一个项目要不要采用DDD,最好先看看它值不值得。


但是一个项目值不值得使用 DDD 有时不好判断。大项目往往是由小项目发展而来的,很多从小项目演化而来的大系统最终变成开发团队的噩梦,噩梦的根源几乎无一例外地在于软件的概念完整性遭到了破坏。而DDD正是维护软件概念完整性的良药。如果在项目中实践 DDD 的成本不高,那么即使是小项目,从一开始就使用 DDD 不是一件很美好的事情吗?


在软件开发项目中实践 DDD 到底有何难处?


实践DDD首先需要面对的一个(也许是最大的)难题是:难以描述的领域模型。DDD 想要构建的领域模型是什么?按照 Eric Evans 的观点,领域模型不是一幅具体的图,而是那幅图想要传达的思想;不是一个领域专家头脑中的知识,而是那些经过严格组织并进行选择性抽象的知识。


听起来是不是有点玄奥?系统分析师、产品经理到底要拿出什么样的领域模型才能说“我的工作已经做到位了”?这个模型到底是不是可以实现的?开发人员、测试人员到底有没有理解这个模型?大家的理解是不是一致的?

说到底,一个领域模型要想有用,它必须足够严格。如何使用一种严格的方式描述经过严格组织并进行选择性抽象的知识呢?


问题的答案很自然地指向了 DSL。

其实,Eric Evans 早就意识到了这一点。他曾经在访谈中说:多前沿的话题发生在领域专用语言(DSL)领域,我一直深信 DSL 会是领域驱动设计发展的下一大步。现在,还没有一个工具可以真正给我们想要的东西。但是人们在这一领域比过去做了更多的实验,这使我对未来充满了希望。


可以告诉大家的是:在项目中运用 DDD 可以不像大家想象的那么痛苦,DDD 并不是只适用于大项目,使用 DDD 并不一定需要牺牲敏捷性,一切的关键在于 DSL 的运用。


我和我工作过的团队曾经在多个项目中使用 DSL 实现了 DDD 的真正落地。独乐乐不如众乐乐!现在,我把这些实践经验写在了《深入实践DDD:以DSL驱动复杂软件开发》一书中分享给大家。



《深入实践DDD:以DSL驱动复杂软件开发》


内容简介


本书是目前市场上唯一一本阐述如何通过使用领域专用语言(DSL)实现领域驱动设计(DDD)的图书。


书中首先带领读者重温DDD在战术设计层面及战略设计层面上的部分重要概念,并简要介绍了自DDD社区兴起的一些软件架构模式。


然后阐述如何设计一门DDD原生的DSL,包括这个DSL的规范支持哪些特性、帮助团队如何描述领域模型的方方面面、这些特性的选择基于何种考量等。


在此基础上详细讲解了如何使用技术工具将描述领域模型的DSL文档直接转化为可以工作的软件代码,在这个过程中结合诸多来自商业软件开发工作中的真实案例,展示并分析了大量的关键代码,让读者可以深入地了解制造那些基于DSL的DDD技术工具的秘密。


最后讲述了一些建模案例,并探讨了一些与DDD相关的其他话题,对读者开拓技术思维、更深刻地理解DDD有所助益。


关于作者


杨捷锋,曾就职于南开戈德集团、普天集团、通路快建等公司。曾作为独立技术顾问为海尔集团、沈阳飞机工业集团、上广电NEC、天马微电子等企业提供软件开发与技术咨询服务。目前在一家电商创业公司担任技术负责人。


有多个大型企业应用软件的分析建模经验,以及大型开发框架(ORM、IoC等)的架构经验。多年来一直未脱离软件开发一线工作,对软件系统分析、数据建模、领域驱动设计、项目管理有丰富的经验。





扫码关注【华章计算机】视频号

每天听华章哥讲书


点击阅读全文购买
浏览 5
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报