16

对DDD的第一次解读

 3 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzI2MzYwNDEwMw%3D%3D&%3Bmid=2247484272&%3Bidx=1&%3Bsn=c82dcbf0a71c2330329d0815a8e2c847
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

7zEBJ3R.png!web

图来自网络

软件架构的终极目标:最大化程序员的生产力,最小化运营的总成本。

前奏

目前我在看两本书《领域驱动设计精粹》和《实现领域驱动设计》,前一本比较薄,不到150页,后一本就非常厚实了,有500多页,那么读起来可能就会显得有点心理障碍,但如果要想更多了解DDD,还是要以第二本为主,第一本可以作为概要性阅读。

领域驱动设计,类似**驱动,我们也接触过不少,比如测试驱动,敏捷驱动等等。领域驱动设计,这六个字或者在前面再加上业务两字,业务领域驱动设计,最终的目标都是为了设计服务的,那么设计是设计的什么,肯定是应用程序系统架构,那么应用程序系统的架构有什么样的需求呢。

架构有两种需求:功能性需求和非功能性需求

功能性需求就是我们在使用一个系统的时候所接触到的,所用到的诸多功能,比如发布一个商品,展示一个统计报表,做权限的管理和控制等,代表的是一个应用程序系统架构能做什么。

非功能性需求是我们的这个应用程序系统架构是否做到了可监控、可扩展、是否高可用、高性能等,代表的是一个应用程序在运行时的质量。非功能性需求中,还有一个非常重要的点就是:快速安全的交付软件。

那么我们就随着如何快速安全的交付软件说起。 DDD重要的指导思想之一是将业务人员和研发人员拉在了一起。 敏捷开发的周期内,无论需求梳理会、回顾会还是计划会都没有业务人员的影子,总是研发和产品在交流。


在业务建模之后技术人员来考虑如何快速且安全的交付软件产品

随着软件架构的逐渐成熟,在我们已经认识的AKF立方体中,在X轴的服务器水平复制,和Z轴的数据分库分表,这两个方向上我们的技术都已经相对成熟,使得我们在抗住大访问量方面已经不再被动。

但唯独在Y轴这个方向上,业务对应服务的拆分,和应用程序被要求快速的交付,我们始终没有太好的解决方法。

而DDD正是致力于在这个方向上为软件开发人员做指导的 ,利用DDD如何快速的交付软件。

因为这是我的DDD学习笔记第一篇文章,就花费了上面的篇幅来做个浅显的对DDD的理解引入描述。接下来我主要谈一谈DDD学习中的战术设计中的一种:运用领域事件进行战术设计。

事件产生于核心域

领域驱动设计中涵盖的内容基本是两大内容,战略设计和战术设计,领域事件是属于战术设计的范畴内的。

那么是先有的事件还是现有的领域呢,我个人认为在动作发生关系上,是先有的事件,已经存在发生过去一段时间了。

比如我们在利用事件驱动开发的时候,常常借助的中间件就有很多,ActiveMQ、RocketMQ等等。后来我们有了领域的概念认知,那么就开始使用领域的思维来去思考事件:领域事件。

如今借助了领域的概念,我们相当于换了一种思考方式,好比 “横看成岭侧成峰,远近高低各不同”,最终都是山,但 “成峰” 的时候可能更能便于我们理解和认知我们的业务关系,我们就使用 “成峰” 的角度去思考。

假如在一个月前我还没有接触领域事件,上面也说了我们一直在用消息机制(消息中间件)解决问题。那么现在我开始学了领域事件给我带来什么变化或者新的认知呢。

首先,我觉得是统一了语言:领域事件,好比古人一手取了一根木棍,另一只手又取了一根木棍,两只木棍来回摩擦,生出火来。这件事情很伟大,但描述起来就比较费劲, 后面就有人总结说了叫做:钻木取火 ,这样传播起来就方便了,大家一听到钻木取火就知道是什么意思。

领域事件也是如此,因为之前毕竟你已经有了领域上下文的知识。

总结

没有DDD,我们业务中也是已经存在了边界,关系,交互,有了DDD之后,我们是依靠或者借助其帮我们梳理这些业务关系,划清业务边界,形成独立性、自治性、弱耦合的系统。

当我们阅读相关DDD书籍里面描述的对象和实践时候使用的对象,都没有变,那些对象都是一直存在的。但是,我个人认为DDD是一种思考业务问题、架构问题的方式, 学习了DDD知识以后就可以采用“DDD的思维方式”去理解和处理那些我们在工作中已经存在的对象。

但也要明白,它绝不是解决一切问题的银弹。

DDD就是一种工具,好比是一把剑,也可能有另外一种工具XXD,好比是一把刀,至于是剑厉害,还是刀厉害,主要看你使用的熟练程度。

参考书籍 《领域驱动设计精粹》和《实现领域驱动设计》 和《架构整洁之道》


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK