DDD为何叫好不叫座?兼论DCI与业务分析的方法论

     今天,仔细阅读了园子里面的一个朋友写的《一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?》(http://www.cnblogs.com/xishuai/p/3800656.html)这篇博客,觉得这是一篇对DDD的分析总结性质的文章,写得不错,但奇怪的是,居然没有一个人回复,也许是文章太长很少有人赖得着性子看完,但也可能是DDD叫好不叫座的原因,这篇随笔里面也对此进行了分析。不过,我觉得这个问题还有更深层次的原因,今晚跟朋友们探讨了一下,总结后发在这里,希望有更多的朋友能够看到。

 

    文章中说到了领域模型,还说到了领域服务,这让我觉得DDD这个东西有点鸡肋啊,需要领域服务去做协调 ,由此引入了工作单元、事务这些东西 ,甚至还有工作流 。这说明基于DDD设计出来的领域模型功能很弱 ,DDD这种模型是静态的,所以需要领域服务去处理动态的东西 ,这相当于把事物分成了“动”,“静”两个方面去处理。

    但是“动”,“静”却是相对的,因为,按照牛顿运动定律 ,是没有绝对的静的,运动是永恒的。 所以分析出来的这个 “静 ”,没有太大的意义。 因此,这注定 DDD这种建模方式,结果是鸡肋,根本之道,是掌握事物的“动机”。 DDD推广不起来,除了现实原因,跟它鸡肋这个特点不无关系。

    从事物的动机出发,进行建模,需要DCI这样的东西。 DCI是一种切入方式,顾名思义,DCI的意思是数据在上下文中的交互,所以可以作为事物动机的观察切入方式。这说明 ,DCI提供了一种比较有效的途径,但还是没有触及到根本问题。 不过DCI,相对于DDD,也算是一个很大的进步。但是太超前的东西总是很难让人接受,DDD都是叫好不叫做,DCI,接受起来就更困难了。

 
    我们顺着 DCI的切入点,深入的观察事物,分析数据的流入流出 ,进行归纳总结,发现某些事物总是有类似的行为。如果我们对这一类事物取一个名字,那么最合适的名字就是 “角色”,所以我们立马发现,这些数据其实就是角色进行交互的产物。 如果我们再深入的分析角色为何会有这些交互,那么我们已经接近前面说的“动机”了。这就是角色的“心智”。所以,也有人说,DCI,其实就是对角色的心智进行建模。
 
    从角色的动机出发,那么我们就容易明白角色为何具有这些方法了,明白角色之间为何会有这些交互了。 角色进行交互需要一个载体、媒介,这个东西就是场景。角色交互过程的观察维度 ,就是时间 。场景也就是我们说的空间维度,那么我们马上明白,这些事物的产生、发展、变化,其实就是角色在时空中的运动。 而且,这种运动,是永恒不止的。(参照附录牛顿运动定律)
 
    角色的具体扮演者,可以是人,可以是物,还可以是人类社会。人类社会在时空中的运动轨迹,这就是“历史”。如果说角色也是一个维度,那么我们把时间纬度、场景维度联合起来,这就是一个分析事物的方法论,假如我们用这个方法论来分析业务,那就是 《业务分析三维度(角色+场景+时间)理论》。
"三维度理论",场景、时间 这些比较容易理解,但是,"角色"这个东西虽然容易理解但要找到这个角色名字并不容易,要担当这个角色更不容易.我想,"角色"的名字,就像《道德经》所说的:道可道,莫可道;名可名,莫可名。这个“名”可以说出来但又难以说清楚,所以我们在对事物进行分析的时候,找到合适的角色,并不是一件容易的事情,而分析出角色的“动机”,也就是“道”,就更难了!
附录:
牛顿第一运动定律:
牛顿第一运动定律Newton's first law of motion)表明,除非有外力施加,物体的运动速度不会改变。根据这定律,假设没有任何外力施加或所施加的外力之和为零,则运动中物体总保持匀速直线运动状态,静止物体总保持静止状态。物体所显示出的维持运动状态不变的这性质称为惯性。所以,这定律又称为惯性定律。物体的惯性与其质量有关。

为什么说运动是绝对的,静止是相对的?

一个物体的静止是相对于另一个物体的。(也就是所谓的参考系的相对性),牛顿曾说任何物体都是运动的,不存在不运动的东西,从量子力学的的角度也是这么阐释的。 

相对静止:

没有任何方法可以证实一个物体是在绝对静止之中。绝对静止的物体是不存在的。静止只是一个物体对于它周围的另一个参照物保持位置不变,所以也只能是相对运动和相对静止,运动和静止是相对的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css编写规范

一、注释规范 1、文件顶部注释(推荐使用) Css代码 /* * description: 中文说明 * author: name * update: name (2013-04-13 18:32) */ 2、模块注释 模块注释必须单独写在一行 Css代码 /* module: module1 by 张三 */ … /* module: module2 …

ng的link和comepile

angularJs应用启动之前,它们是以HTML文本形式存在文本编辑器当中。应用启动会进行编译和链接,作用域会同HTML元素进行绑定。 在编译的阶段,angularJs会遍历整个的文档并根据JavaScript中指令定义来处理页面上的指令。 如果设置了compile函数&…

php 实现的字典序排列算法,字典序的一个生成算法

字典序的一个生成算法。最近在LeetCode刷题,刷到一个题,链接:https://leetcode-cn.com/problems/permutation-sequence/这个题要求得长度为n的字典序列的第k个排列。我们知道,字典序列是一个长度为n(n>1),元素为1~n…

MarkDown之typora

windows上面非常适合用typora,地址如下: https://typora.io/

BeetleX服务网关流量控制

为了保障后台服务应用更可靠地运行,网关提供了一些基础流量控制功能;通过这一功能可以限制流转到后台应用服务的处理量,从而让服务在可应对的并发范围内更可靠地运作。服务网关提供了流量控制有基础控制、IP、域名和请求路径。基础配置主要包…

【cocos2d-x】2.0升级为3.0一些常见变化纪录

1.去CC之前2.0的CC**,把CC都去掉,基本的元素都是保留的2.0CCSprite CCCallFunc CCNode ..3.0Sprite CallFunc Node ..2.cc***结构体改变2.0 ccp(x,y) ccpAdd(p1,p2)ccpSubccpMultccpLength(p)ccpDot(p1,p2);ccc3()ccc4()ccWHITECCPointZeroCCSizeZer…

如何查看自己的ubutu系统是32位的还是64位的

1.按ctrlshiftt 快捷键,打开终端,输入sudo uname --m ,按下enter2.如果显示i686,你安装了32位操作系统如果显示 x86_64,你安装了64位操作系统3.如果想知道更多信息可以试试如下命令sudo uname --s 显示内核名字ssudo uname --r 显…

Java Web开发——Servlet监听器

一、Servlet监听器的概念 Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。 监听对象: 1、ServletContext&#xff1…

java之MessageDigest简单使用总结

1、说明 MessageDigest是Java自带的类2、简单代码 比如我们需要实现md5,或者sha加密public class MD5AndSHA { public final static String MD5_SHA(String s, String method) { char hexDigits[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f }; try { byte[] str…

通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式...

目录:一、通过Dapr实现一个简单的基于.net的微服务电商系统二、通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解三、通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr四、通过Dapr实现一个简单的基于.net的微服…

简单直接排序

#!/usr/bin/python #encoding:utf-8 #基本思想:#将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行>插入,直至整个序…

php怎么关闭oracle连接,PHP 连接 Oracle

起因由于项目的数据库需要用客户购买的Oracle数据库,所以需要php安装oci扩展。运行环境php : 7.2系统: windows10oracle: 11gR2安装相关环境由于php的oci8扩展还是需要使用到oracle的一些包,所以先下载这一些。下载完成后解压缩这个压缩包,并…

MySQL查询,按拼音首字母排序

MySQL按照汉字的拼音排序按照汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序;如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法&…

Android Studio之debug调试卡在waiting for debugger界面的解决办法

1、问题 Android Studio debug调试项目卡在waiting for debugger界面2、解决办法 一开始从启adb服务adb stop-server adb start-server 发现没什么用,然后呢,估计是很多app再运行,然后我就重启了Android studio,问题就解决了如果要是万一还不…

.NET 深度指南:Colors

作者 | Peter Huber译者 | 王强策划 | 丁晓昀我不知道你们是什么情况,但我自己在过去多年中都因为.NET 色彩(Colors)类中可用的色彩数量有限而头痛不已,为此我试图用 ColorPickers 获得匹配的色…

php 怎么打出来的,word书名号怎么打出来

书名号怎么打出来?书名号相信大家都不会陌生了,正常情况下,我们会将书名、歌曲名、作品名等用书名号框起来,这样就可以让读者一目了然。然而很多用户在编辑Word和Excel文档时,想输入书名号却不知从何下手,这…

Android之用UncaughtExceptionHandler实现保存崩溃日志到sdcard目录下的文件夹

1、异常和UncaughtExceptionHandler的介绍 1)、Java异常处理机制中: 如果抛出的是Exception异常的话,需要有try catch进行处理,属于可以捕获exception。 如果抛出的是RuntimeException异常的话,发生异常之后将由JVM进行处理,属于不可捕获exception。 2)、Java 异常的分类…

http://www.appinn.com/bookmark-manager-chrome/

是有多手贱才装了这个。。弄得我的书签全都木有了。。我去。。终于回来了。。感觉太好了。。转载于:https://www.cnblogs.com/aniy/p/4547709.html

springMVC带文件的表单数据无法绑定到参数中

2019独角兽企业重金招聘Python工程师标准>>> 在一个带enctype"multipart/form-data"属性的表单提交时发现,该表单中包含的其他input无法设置到对应方法参数中。 如下: JSP:带enctype"multipart/form-data"属性…

关于Retinex图像增强算法的一些新学习。

最近再次看了一下IPOL网站,有一篇最近发表的文章,名字就是Multiscale Retinex,感觉自己对这个已经基本了解了,但还是进去看了看,也有一些收获,于是抽空把他们稍微整理了下,原始文章及其配套代码…