关于DDD中Domain的思考
2019独角兽企业重金招聘Python工程师标准>>>
本文既不推销UML,也不推广DDD,更不涉及各种论战。-- 作者
某天又一次打开关于DDD(领域驱动设计)的PDF文档时,自己有了个疑问:什么是领域(Domain)?译文中是这样描述领域:银行业务被银行的内部人员和专家所熟知。他们知道所有的细节、所有的困难、所有可能 出现的问题、所有的业务规则。这些就是我们永远的起始点:领域。如果这就是领域,它似乎不是"起始点",而是“全部”--全部的业务规则、全部的细节、全部可能出现的问题。我的疑问正是始于此:Domain映射到软件,"全部"不就是整个系统?
这里有个概念漏洞,Domain是"全部",但不是全世界的"全部",那它是什么的全部?显然,译文中看到的"银行业务",其对应的Domain也不是指银行业务系统的全部,因此Domain的概念相对清晰--一个有清晰边界、内部的业务、规则、问题、细节都自成一派--你会问我,这是指对象(Object)吧!如果从低层次上讲,两者是有关系的。下一个疑问:Domain和Object有什么不同?
我思考的结果是封装的级别不同:Object封装的目标是调用其方法实现所承诺的功能,但系统中的对象是有依赖的;Domain封装的目标是"全部"都在这里,即不需要依赖其他的Object或者Domain。之所以这么想,主要的依据是从那个常用的例子:机场、航线、飞机,虽然我看的译文中把这三个定义为对象,使用UML画了聚合关系;我更倾向于把它们看成Domain,即我认为机场不会调用飞机的方法(或者人),两者只是相互关注了对方(的事件)。例如,飞机A1和机场B1通过无线电沟通(消息)。Object间的消息一般是带着发送者或者接受者的数据,也就是A1发送的是B1要处理的;而Domain间的消息是否处理,如何处理则是完全由接收者自己处理,发送者也不关心消息的处理。再一个疑问:如何达到"全部"封装?
上面的例子中,我使用了"事件"这个关键字。事件(消息)不是新鲜事物,在面向对象的系统中,其作为异构子系统、系统间异步调用的桥梁,起着重要的作用;所以我认为“事件通知”不是实现Domain的途径,因为它是同步调用的变种:消息的生产者和消费者仍然有业务逻辑上的天然联系。事件除了通知,还有一种模式是监听。这种事件是公共资源,是开放的标准,不论采用广播、总线、管道各种模式,Domain监听自己关注的事件,并对其进行响应,如果产生了新的("开放")事件,则将事件发布回(广播、总线、管道的)'通道'。以机场和飞机为例,机场广播的跑道天气信息,飞机的飞行员如果关心,则通过无线电接听,如果不关心,则完全可以关闭无线电。
以上基本展示了我思考的过程。其间,我回顾了自己使用过的各种(X)O,(X)O包含面向服务(架构)-SO(A),面向方面(编程)-AO(P),面向对象-OO,面向过程-PO。
粗略地得到了下图:
从上图中除了有关于Domain的思考,还想了关于如何更好的使用各种方法论。我有个观点:同步就是两次或者多次异步交互的集成。
画图的过程中,我又有了个疑问:服务间的异步通知类接口,是否是实现Domain的一种形态?通过与分布式服务系统的拆分,我认为:异步通知(接口)是一种补充,而不是Domain间交互的主要方式,它类似“塔台呼叫711,711听到请回答”;如果全程都是这样飞行,塔台需要为每个飞机配置一个导航员,且每个飞机独立使用一个频率,这不是一个好设计,尽管它在航空管制初期可能是可行的。
我的结论是:面向领域设计DDD中的领域是比对象、服务更加高度的封装,领域包含自己的数据、行为、控制等"全部",并对外部事件(或者消息)做出响应,按照自己的规则完成特定的功能。基于这样的特点,Domain间的通讯应该是异步事件监听模式。在Domain内部,可以利用面向对象、服务及各种方法论开发更耦合的功能--这可以解释为什么现在更多的系统是采用的同步调用方式运行。这也是另一个层面的“外松内紧”的耦合。
转载于:https://my.oschina.net/u/1053238/blog/359106
关于DDD中Domain的思考相关推荐
- 阿里技术专家详解 DDD 系列- Domain Primitive
导读:对于一个架构师来说,在软件开发中如何降低系统复杂度是一个永恒的挑战,无论是 94 年 GoF 的 Design Patterns , 99 年的 Martin Fowler 的 Refactor ...
- DDD之Domain Primitive(DP)
前言: DDD是一种架构思想,而不是一套框架. Domain Primitive: 何为DP,他是DDD中的"基础数据结构",就像Java中的int,string一样,是我们学习的 ...
- 深入理解DDD中的聚合
本文来说下领域驱动设计中的聚合 文章目录 概述 聚合解决的核心问题是什么 聚合划分的原则 生命周期一致性 问题域一致性 场景频率一致性 尽量小的聚合 实现方面的考虑 资源库.工厂面向聚合定义 代码结构 ...
- ddd java repository_初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- DDD 中的几个困难问题
领域到底是什么? 对领域这个词的理解就是 DDD 入门的第一个难关.我们有时会被客户问到,领域到底是什么?首先要清晰地知道领域是什么,才能划分核心域.支撑域和通用域.换句话说,构成领域的要素是什么呢? ...
- DDD中的建模方法有哪些
一.背景 在之前的文章中已经介绍了DDD相关的概念模式,DDD相关的业务技术架构,但是我们还没有找到一个核心的抓手去实践DDD.DDD的一个核心本质就是对业务建模,或者领域建模.说的很简单,但是做好确 ...
- DDD中的聚合和UML中的聚合以及组合的关系
UML: 聚合关系:成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在. 如汽车(Car)与引擎(Engine).轮胎(Wheel).车灯(Light)之间的关系为聚合关系,引擎.轮胎.车灯 ...
- java中domain什么意思_java解析URL中domain、端口和协议的两种方法
java解析URL中domain.端口和协议的两种方法 Java代码 收藏代码 @Test public void parseDomain() throws IOException { for (in ...
- ORM中的Model与DDD中的DomainModel
0.引言 在现有的系统开发中,大部分的系统应该都会用到ORM,无论用的是EF还是NHibernate.作为对象和持久化数据的桥梁,ORM确实非常方便,以至于在DDD的时候,我们很自然的将 ORM中的M ...
最新文章
- 怎么恢复手机上的照片呢?
- C语言 线性表的链式存储结构(链表实现)
- XCTF-高手进阶区:lottery
- Flash网站流量统计的方法
- Impala 调用Hbase 报错 LeaseException
- 开源计划——git的学习笔记
- “约女生图书馆一起自习”总结
- Latice CPLD jed转VME文件简介
- python自动化交易通达信_通达信实现自动交易系统
- cpu 调频 温度 ondemand
- HEVC: I帧、P帧及B帧
- 100000+人体验过后都说:这TM绝对是最变态的英语学习方法……
- 以物理弦理论的角度浅理解悖论
- 三星s20Android11怎么退回10,三星已经开始在GALAXY S20+上测试安卓11系统
- xmr monero miner
- 电子科大 数据结构专题
- 1003. Universal Travel Sites (35)解题报告
- 井字棋小游戏c语言简单编码,井字棋小游戏(C语言)
- 综合能源系统优化 数据来源《考虑需求响应的社区综合能源系统两阶段优化调度_刘蓉晖》
- ZXCK在线翻译效果截图
热门文章
- java smack 例子_java+smack+openfire即时通讯Im(四)
- gogs可以自动化部署吗_三千、五千平方的仓库房可以用自动化立体仓库吗?
- java teechart怎么用_TeeChart使用范例
- oracle19c监听服务启动失败,Oracle19c安装(有失败成功记录)
- linux 中w和x 区别,r、w、x权限在文件和目录中的含义有何区别?
- 钉钉 php 推送,微信模板推送,钉钉信息推送
- linux 权限测试,linux下检测root权限的shell脚本
- 筛法求素数c 语言,位筛法求素数,有段代码看不懂,有大佬可以来说一下
- 数据结构之树【完善中】
- 1113: 递归调用的次数统计(函数专题)