今天,仔细阅读了园子里面的一个朋友写的《一缕阳光: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)表明,除非有外力施加,物体的运动速度不会改变。根据这定律,假设没有任何外力施加或所施加的外力之和为零,则运动中物体总保持匀速直线运动状态,静止物体总保持静止状态。物体所显示出的维持运动状态不变的这性质称为惯性。所以,这定律又称为惯性定律。物体的惯性与其质量有关。

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

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

相对静止:

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

 

DDD为何叫好不叫座?兼论DCI与业务分析的方法论的更多相关文章

  1. DDD 领域驱动设计-看我如何应对业务需求变化,领域模型调整?

    写在前面 上一篇:DDD 领域驱动设计-看我如何应对业务需求变化,愚蠢的应对? "愚蠢的应对",这个标题是我后来补充上的,博文中除了描述需求变化.愚蠢应对和一些思考,确实没有实质性 ...

  2. DDD 领域驱动设计-看我如何应对业务需求变化,愚蠢的应对?

    写在前面 阅读目录: 具体业务场景 业务需求变化 "愚蠢"的应对 消息列表实现 消息详情页实现 消息发送.回复.销毁等实现 回到原点的一些思考 业务需求变化,领域模型变化了吗? 对 ...

  3. DDD实战进阶第一波(十五):开发一般业务的大健康行业直销系统(总结篇)

    前面我们花了14篇的文章来给大家介绍经典DDD的概念.架构和实践.这篇文章我们来做一个完整的总结,另外生成一个Api接口文档. 一.DDD解决传统的开发的几大问题: 没有描述需求的设计模型:而是直接通 ...

  4. DDD实战进阶第一波(十四):开发一般业务的大健康行业直销系统(订单上下文应用服务用例与接口)

    上一篇文章我们主要讲了订单上下文的领域逻辑,在领域逻辑中完成了订单项的计算逻辑.订单的计算逻辑以及如何生成相应的实体code,这篇文章我们通过 在应用服务中实现一个下单的用例,来将这些领域逻辑以及仓储 ...

  5. DDD实战进阶第一波(十二):开发一般业务的大健康行业直销系统(订单上下文POCO模型)

    在本系列前面的文章中,我们主要讨论了产品上下文与经销商上下文相关的实现,大家对DDD的方法与架构已经有了初步的了解. 但是在这两个界限上下文中,业务逻辑很简单,也没有用到更多的值对象的内容.从这篇文章 ...

  6. DDD 领域驱动设计-看我如何应对业务需求变化?

    tks: http://www.cnblogs.com/xishuai/p/3972802.html

  7. [2018-12-07]用ABP入门DDD

    前言 ABP框架一直以来都是用DDD(领域驱动设计)作为宣传点之一.但是用过ABP的人都知道,ABP并不是一个严格遵循DDD的开发框架,又或者说,它并没有完整实现DDD的所有概念. 但是反过来说,认真 ...

  8. DDD:架构思想的旧瓶新酒

    DDD.DSL 和 DCI DDD 概念最早提出于 2004 年,作为一种软件开发的指导思想,DDD 对软件开发带来了诸多可能与方向,张晓龙认为 DDD 为软件开发带来的好处主要有以下几点: 首先,最 ...

  9. 【系统架构】软件核心复杂性应对之道-领域驱动DDD(Domain-Driven Design)

    前言 领域驱动设计是一个开放的设计方法体系,目的是对软件所涉及到的领域进行建模,以应对系统规模过大时引起的软件复杂性的问题,本文将介绍领域驱动的相关概念. 一.软件复杂度的根源 1.业务复杂度(软件的 ...

随机推荐

  1. angular利用ui-router登录检查

    angular利用ui-router登录检查 SAP都会有这个问题,session过期或者页面被刷新的情况下应该进入登录页. 监听ui-router的satte事件可以实现当state切换的时候检查登 ...

  2. IDE:Eclipse查看接口实现类快捷键

    1.打开接口类 2.双击接口名选中 3.Ctrl+T,打开接口实现类

  3. 快速入门系列--WCF--06并发限流、可靠会话和队列服务

    这部分将介绍一些相对深入的知识点,包括通过并发限流来保证服务的可用性,通过可靠会话机制保证会话信息的可靠性,通过队列服务来解耦客户端和服务端,提高系统的可服务数量并可以起到削峰的作用,最后还会对之前的 ...

  4. ASP.NET MVC中使用FluentValidation验证实体

    1.FluentValidation介绍 FluentValidation是与ASP.NET DataAnnotataion Attribute验证实体不同的数据验证组件,提供了将实体与验证分离开来的 ...

  5. 手动为php安装memcached扩展模块

    最近公司需要新部署几台服务器,主要就是lnmp平台,这几台服务器需要部署公司的系统,由于本屌刚入职时间不长,加上又是新手,所以对公司的架构一头雾水,前前后后折腾了一个月时间,终于磕磕绊绊的将系统服务器 ...

  6. kubernetes

    项目主页:http://kubernetes.io/ docker仅能在单机上部署容器,而kubernetes可以统一管理各类容器,形成集群.Kubernetes作为Docker生态圈中重要一员,是G ...

  7. How does Spring @Transactional Really Work?--转

    原文地址:http://blog.jhades.org/how-does-spring-transactional-really-work/ In this post we will do a dee ...

  8. 基于HTML5的Drag and Drop生成图片Base64信息

    HTML5的Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过Drag ...

  9. 关于Entity Framework中的Attached报错的完美解决方案

    我们在使用Entity Framework进行CRUD时,为了提升查询效率,一般均会启动NoTracking,即不追踪变化,设置代码如下: //这是DB First模式下设置方法: aTestEnti ...

  10. Android开发中遇到的requestFeature() must be called before adding content异常

    缘起 上一篇博文中讲到了几种实现全屏显示Activity内容的方法.然而实际在实现中发现了一些问题,在本篇博文中进行总结下.首先交代一下开发环境,本人使用的是Android Studio 1.5.1, ...