DDD 你是如此纠结!

15-05-19 tecentID68055
    

估计2008年就从Jdon里面看到ddd了, 中间也看过很多DDD方面的帖子。 但是至今还是一知半解。 DDD中文名为“领域驱动设计”。看似简单的6个字,
确让很多人彻夜难眠,纠结无比?
今天又看了一遍:领域驱动设计之我见 http://www.jdon.com/39844/10 大家讨论的很激烈也非常精彩。
但是不得不说,对于我来说益出不大。 为什么这么说? 因为它完全给我一种“百家争鸣”的感觉,每个人写的东西都感觉有道理。导致我甚至分不清好与不好。 这也从侧面反映出DDD是多么的复杂,如此简单的业务,都难以统一大家的思想。更加不用说实际开发项目,实际项目比这可复杂多了,而且那还是团队开发,涉及多人!
帖子中对于 借书 这个业务到底放到哪个对象中? 有人说是reader,有人说是 card。 但是我确觉得这个完全无关紧要,以为我隐隐觉得这2个,实际上都代表了一个真正的领域对象。虽然我也不知道这个领域到底叫什么(好像废话)。

然后我又看了:DDD CQRS和Event Sourcing的案例:足球比赛 http://www.jdon.com/44815 这篇帖子。对于里面的建模,大家好像没有任何异议。 都认为他是对的, 是标准的。 我思考了一下,为啥没有异议? 我认为是这个足球比赛这个案列中他没有 类似于 借书 这样的业务。 而且案例名为“足球比赛” ,大家想当然的就将 比赛 抽象成了一个 类。 这样样就导致 "比赛" 这样一个动作,有了归属。 他直接归属于他自己(因为已经抽象成了类)。实时上我们如果将 足球比赛 案例,称之为球队管理,而比赛只是其中一个业务后? 那么比赛这个动作,归属于谁? 或者说图书管理系统案例中。 我们将它叫做"借书,还书管理"。那么还会有reader,card之争吗?

又比如对于银行转账系统中 a给b转账。 看到很多建模都有一个 转账服务, 里面有装转这个方法。 为啥会有个装转服务, 那是因为 转账这个动作, 放到哪个对象里都有点不合适, 而这个业务其实跟 足球比赛中 ab两队比赛却是如此雷同!

写的很乱,求大神解惑!

    

1
banq
2015-05-20 07:54

楼主恭喜你已经触碰到DDD核心。

luda
2015-05-20 09:10

有一个问题我搞不清楚,这个问题是:整个世界底层的运行景象和运行原理是否真的和计算机底层的运行景象和运行原理是一样的?
如果这个问题的回答最终是“是”的话,就可以像理解现实世界一样去理解计算机世界,像理解计算机世界一样去理解现实世界了。虽然现实世界底层的景象和原理太难描述了,但是计算机世界描述了它。
对现实世界的理解和对计算机世界的理解如果真能打通的话,剩下的就是“从上而下”和“从下而上”了。有时候从现实世界的问题领域出发是从上而下,从计算机的问题领域出发是从下而上,一上一下相遇在中间层组合出一层“体”。
现实的问题世界和计算机的问题世界是互为上下的,比如计算机世界的底层再往下追溯就又跑到了现实物理世界去了。整个世界可能是个环状的东西,对于整体来说无所谓上和下,只是对于局部来说会有上下之分。
我们作为主体,我们是整个世界的局部,对于我们来说位置靠近我们的就是上,位置远离我们的就是下,位置靠近我们的我们处理起来对于我们来说就符合构造定律就节能,位置远离我们的我们处理起来就不节能,但是计算机处理起来可能节能,而计算机能被我们处理,问题要是能被识别为计算机那样的模式,我们就可以像处理了半个多世纪的计算机问题世界那样去处理现实问题世界了,一旦识别出这个分形的模式后结果又变的符合构造定律又节能了。
领域驱动设计大部分时候是从上而下,但如果宇宙真的像计算机世界那样运行的话,由计算机从下而上的去解决问题也可行。
[该贴被luda于2015-05-20 09:27修改过]

brighthas
2015-05-20 21:13

业务对象抽象出来,是ddd核心,名字很重要,代表一个边界。

其他都是落地必须的过程和手段,cqrs是ddd落地框架,这是一个境界问题,多年的沉淀和研究,让人误以为明白的不说明白话。其实不是隐藏,而是真理有时候确实无法说出来。

记得达摩和弟子说:知者不言,言者不知。意思是知道的人,他无法用语言表达境界(真相),所以也就不说了,怕误导,所以都是用隐喻。

ddd伟大之处在于,在更深的境界来说,具有很强的功力,也就是说,可以无限优化,你有多大能力,就能设计出多好的系统核心。

我这么多年的经验告诉我,捷径是没有的,因为功夫多深,是时间和沉淀修出来的。

brighthas
2015-05-20 21:17

下面是我开发的 node/javascript 版 cqrs框架,可以作为参考,javascript所有人都看得懂。结合了 actor / ddd / cqrs ,因为我觉得这三者打散后,从新组合起来的。思想是ddd,采用了cqrs的事件方式,用actor代表聚合根对象。

https://github.com/liangzeng/cqrs

安装方法 npm install cqrs

2Go 1 2 下一页