DDD学习与感悟——总是觉得自己在CRUD怎么办?
一、DDD是什么?
DDD全名叫做Domins drives Design;范畴驱动规划。再说的浅显一点便是:经过范畴建模的办法来完成软件规划。
问题来了:什么是软件规划?为什么要进行软件规划?
软件开发最首要的意图便是:处理一个问题(事务)而发生的一个交给物(体系)。而软件规划旨在高效的完成杂乱项目软件。也便是说软件规划是从事务到体系之间的桥梁。
而DDD则是在杂乱事务场景下一种更高效更合理的软件规划思维办法和办法论。
二、曾经的软件规划思维是什么?
绝大部分从事软件开发的人,不管是在校园仍是刚开端作业,都是从ER图开端。即直接经过事务规划数据库模型和数据相关联系。这种思维根深柢固的印在了这些人的脑筋里(包含我自己)。因而在软件规划进程中习惯性的直接将事务转化为数据模型,面向数据开发。也便是咱们所说的CRUD。咱们有时分也会看到一些博客看到或许听到一些搭档在说:这个事务有什么难的,不便是CRUD么?
不可否认的是,在软件生命周期初期,经过CRUD这种办法咱们能够快速的完成事务规矩,交给项目。可是一个体系的生命周期是很长的而且保护阶段的生命周期占绝大部分份额。 跟着事务的开展,事务规矩越来越杂乱,经过CRUD这种粗犷办法,让工程代码越来越杂乱,一般一个办法或许会呈现几百乃至上千行代码,各种胶水代码和事务逻辑混合在一同,导致很难了解。
这种体系交接给另一个同学或许新进来的同学后,或许需求花费很长的时刻才干了解这个办法,原因便是由于这种胶水代码淹没了事务中心规矩。所以在实践场景中,咱们常常会听到,上一个开发是SB,或许自嘲自己是在屎山上面持续堆屎。
三、DDD思维下的软件规划
DDD的思维是依据范畴模型来完成软件规划。那么,什么是范畴模型?范畴模型怎样得来呢?
DDD思维,将软件的杂乱程度提早到了规划阶段。依据DDD思维,咱们的规划办法彻底变了。
共同言语
首要,将事务方、范畴专家以及相关的产研人员都靠拢在一同,一同探讨出事务场景和要处理的问题,共同言语。来保证一切人关于事务的了解都是共同的。
这儿的共同言语不是指某种详细的技能言语,而是一种事务规矩言语。一切人有必要要能够了解这种共同言语。
战略规划
其次,咱们依据待处理的问题空间,进行战略规划。所谓的战略规划便是依据问题空间在微观层面辨认出限界上下文。比方说一个电商事务,咱们需求交给一个电商体系,依据电商事务的特色,需求区分出用户、产品、订单、仓储等限界上下文,每一个限界上下文都是一个独立的事务单元,具有完好的事务规矩。
辨认范畴模型
然后,再分别针对上下文内的事务范畴进行建模,得到范畴模型。在DDD思维中,范畴模型中一般包含实体、值方针、作业、范畴服务等概念。咱们能够经过“作业风暴”的办法来辨认出这些概念。
留意,“作业风暴”和“脑筋风暴”是有差异的。“脑筋风暴”的首要意图是经过发散思维进行立异,而“作业风暴”是DDD中的概念,其首要意图是一切人一同依据共同言语和事务规矩辨认出作业。再依据作业辨认出实体、值方针、范畴服务、指令、事务流等范畴模型中的概念。
所谓作业指的是现已发生了的作业。比方用户下了一个订单、用户撤销了订单、用户付出了订单等
依据作业,咱们能够辨认出实体,比方上面这个比如中的订单实体,以及指令:撤销、付出、下单等。
程序规划
辨认出范畴模型之后,咱们就能够依据范畴模型来辅导咱们进行程序规划了。这儿的程序规划包含事务架构、数据架构、中心事务流程、体系架构、布置架构等。需求留意的是,在进行程序规划时,咱们仍然要遵从DDD中的规划规范。不然很简单走偏方向。
编写代码
有了完好的程序规划之后,咱们就能够进行实践的工程建立以及代码编写了。
这个阶段需求留意的是,咱们需求遵从DDD思维中的架构规划和代码规划。实践上这个阶段也是十分困难的。由于依据DDD思维下的工程架构和咱们传统的工程架构不相同。
依据DDD思维下,编码进程中咱们常常会遇到的一个问题是:这个代码应该放在哪里适宜。
工程结构
在DDD中,规范的工程结构分为4层。用户接口层、应用层、范畴层和基础设施层。
DDD中,构建软件结构思维有六边形架构、CQRS架构等,它们是一种思维,是从逻辑层面临工程结构进行区分,而咱们熟知的SOA架构以及微服务架构是从物理逻辑层面临工程结构进行区分,它们有着实质的差异,可是方针都是相同的:构建可保护、可扩展、可测验的软件体系。
代码编写
在DDD中,最为杂乱的便是范畴层,一切的事务逻辑和规矩都在这儿完成。因而咱们常常会遇到一个问题便是代码应该放在哪里。
在详细落地进程中会遇到这些问题,处理这些问题没有银弹,由于不同的事务有不同的处理办法,这个时分咱们需求与范畴专家们评论,得出咱们都满足的处理计划。
代码重构
没有不变的事务。因而咱们需求结合事务的开展而不断迭代更新咱们的范畴模型,经过重构的办法来发掘隐形概念,再依据这些隐形概念去不断的调整咱们的战略规划以及范畴模型。使得整个软件体系的开展也是螺旋式迭代更新的进程。
经过以上的介绍,咱们完成DDD的进程如下:
四、总结
经过关于DDD的了解,其实不难发现,程序员的作业重心变了,程序员其实不是在编写代码,而是在不断的探索事务范畴常识,尤其是杂乱事务。
所以假如总是觉得自己在CRUD,有或许不是你做的事务没价值,而是自己关于事务的了解还不行深;假如总是沉迷于代码编写,或许你的开展空间就会受限了。
作者:京东科技 孙拂晓
来历:京东云开发者社区 转载请注明来历