关于DDD中Domain的思考

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

本文既不推销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。

粗略地得到了下图:

100930_Uu2E_1053238.png

从上图中除了有关于Domain的思考,还想了关于如何更好的使用各种方法论。我有个观点:同步就是两次或者多次异步交互的集成。

    画图的过程中,我又有了个疑问:服务间的异步通知类接口,是否是实现Domain的一种形态?通过与分布式服务系统的拆分,我认为:异步通知(接口)是一种补充,而不是Domain间交互的主要方式,它类似“塔台呼叫711,711听到请回答”;如果全程都是这样飞行,塔台需要为每个飞机配置一个导航员,且每个飞机独立使用一个频率,这不是一个好设计,尽管它在航空管制初期可能是可行的。

    我的结论是:面向领域设计DDD中的领域是比对象、服务更加高度的封装,领域包含自己的数据、行为、控制等"全部",并对外部事件(或者消息)做出响应,按照自己的规则完成特定的功能。基于这样的特点,Domain间的通讯应该是异步事件监听模式。在Domain内部,可以利用面向对象、服务及各种方法论开发更耦合的功能--这可以解释为什么现在更多的系统是采用的同步调用方式运行。这也是另一个层面的“外松内紧”的耦合。


转载于:https://my.oschina.net/u/1053238/blog/359106

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

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

相关文章

Oracle plsql 计算日期间工作日天数

declarev_fdate date : to_date(2013-10-4,yyyy-mm-dd);v_ldate date : to_date(2013-10-22,yyyy-mm-dd);v_interval_a number;v_interval_b number;v_interval_all number;begin--先算整周有几周,然后乘一周五天工作日v_interval_a : floor((v_ldate - v_fdate)/7)…

MySQL 性能优化 分布式

MySQL 性能指标都有哪些?如何得到这些指标? MySQL 的性能指标如下: ① TPS(Transaction Per Second) 每秒事务数,即数据库每秒执行的事务数。 MySQL 本身没有直接提供 TPS 参数值,如果我们想要获得 TPS 的值,只有我们自己计算了,可以根据 MySQL 数据库提供的状态变…

Java Collections CheckedCollection()方法与示例

集合类的checkedCollection()方法 (Collections Class checkedCollection() method) checkedCollection() Method is available in java.lang package. DrawnCollection()方法在java.lang包中可用。 checkedCollection() Method is used to return the typesafe view of the gi…

算法设计TSP问题动态规划

#include <iostream> #include <cmath> using namespace std; //集合虚拟化用000 、001 、010 、011 、100 、101 、110 、111分别表示{} 、{1}&#xff08;V[2^(1-1)]&#xff09; 、{2}&#xff08;V[2^(2-1)]&#xff09; 、{1,2}&#xff08;V[2^(1-1)2^(2-1)]…

Oracle 练习题 20131021 for 循环练习

--Oracle 练习题 20131021 for 循环练习--1、用for循环实现一个倒置的乘法表。beginfor i in reverse 1 .. 9 loopfor j in reverse 1 .. i loopdbms_output.put(i || x || j || || i * j || );end loop;dbms_output.put_line();end loop;end;--2、打印1-100之间所有的素数。…

字符串使用与内部实现原理

Redis 发展到现在已经有 9 种数据类型了&#xff0c;其中最基础、最常用的数据类型有 5 种&#xff0c;它们分别是&#xff1a;字符串类型、列表类型、哈希表类型、集合类型、有序集合类型&#xff0c;而在这 5 种数据类型中最常用的是字符串类型&#xff0c;所以本文我们先从字…

Lisp-Stat翻译 —— 第九章 统计绘图窗体

2019独角兽企业重金招聘Python工程师标准>>> 第九章 统计绘图窗体 除了前几章略述的绘图窗体原型提供的基本绘图工具之外&#xff0c;Lisp-Stat里的统计绘图还需要用来管理数据和将那些数据转换成屏幕上的图形的工具集。这些工具由绘图原型graph-proto提供。更多的…

Java ClassLoader getSystemResource()方法与示例

ClassLoader类getSystemResource()方法 (ClassLoader Class getSystemResource() method) getSystemResource() method is available in java.lang package. getSystemResource()方法在java.lang包中可用。 getSystemResource() method is used to find the system resource of…

操作系统(王道笔记第三章内存)

第三章内存3.1_1内存的基础知识&#xff08;1&#xff09;什么是内存&#xff1a;略&#xff08;2&#xff09;进程运行的基本原理①从写程序到程序运行②链接③装入3.1_2内存管理的概念&#xff08;1&#xff09;内存管理管哪几个方面&#xff08;2&#xff09;内存保护①上下…

按钮button加超链接

突然想做一个普通按钮&#xff0c;然后让按钮超链接到别的页面&#xff0c;不知道怎么搞&#xff0c;不过还是在百度找到了。1.如果让本页转向新的页面则用&#xff1a;<input typebutton οnclick"window.location.href(连接)"> 2.如果需要打开一个新的页面进…

Redis 快速搭建与使用

Redis 是由 C 语言开发的开源内存数据存储器&#xff0c;经常被用作数据库、缓存以及消息队列等。 Redis 因为其强大的功能和简洁的设计&#xff0c;深受广大开发者和公司的喜爱&#xff0c;几乎占领了内存数据库市场的所有份额。 1 Redis 特性 Redis 有很多优秀的特性&#…

如何计算Python中列表项的出现次数?

The python count() method counts the number of occurrences of an element in the list and returns it. python count()方法对列表中某个元素的出现次数进行计数并返回它。 Syntax: 句法&#xff1a; list.count(x)The count() method takes a single argument, x, whose…

网页自动关闭的代码

<script language"javascript">window.openernull; window.open(, _self, );//模拟自己打开自己window.close();//再关闭就没有对话框了</script>--------------------------以下是过多少秒自动关闭网页,弹窗<html><head><title>JS定时…

hibernate annotation注解方式来处理映射关系

2019独角兽企业重金招聘Python工程师标准>>> 在hibernate中&#xff0c;通常配置对象关系映射关系有两种&#xff0c;一种是基于xml的方式&#xff0c;另一种是基于annotation的注解方式&#xff0c;熟话说&#xff0c;萝卜青菜&#xff0c;可有所爱&#xff0c;每个…

操作系统Ubuntu(实验一二)

摘录&#xff1a;https://www.cnblogs.com/penglang14/p/10632360.html 实验一二1.1_小技巧1.2_ls查看目录命令1.3_cd切换目录命令1.4_查看文件内容命令(1)cat filename(2)more filename(3)head [-n] filename([]表示此内容可有可无)&#xff08;4&#xff09;wc命令确定行数、…

Redis 是如何执行的?

在以往的面试中&#xff0c;当问到一些面试者&#xff1a;Redis 是如何执行的&#xff1f;收到的答案往往是&#xff1a;客户端发命令给服务器端&#xff0c;服务端收到执行之后再返回给客户端。然而对于执行细节却「避而不谈」 &#xff0c;当继续追问服务器端是如何执行的&am…

java 枚举迭代_Java中的枚举和迭代器之间的区别

java 枚举迭代Java中的枚举与迭代器 (Enumeration vs Iterator in Java) Here, we will see how Enumeration differs from Iterator? 在这里&#xff0c;我们将看到Enumeration与Iterator有何不同&#xff1f; 1)枚举 (1) Enumeration) Enumeration is an interface which i…

ORA-14551: 无法在查询中执行 DML 操作

最近在调试一个带DML操作的函数时&#xff0c;一直不成功&#xff0c;在PL/SQL中测试时没问题&#xff0c;通过SQL语句调用函数时就不行了&#xff0c;刚开始一直没找到原因&#xff0c;后来无意间把 函数中捕获异常的代码注释掉&#xff0c;终于通过SQL调试时&#xff0c;弹出…

第五章I/O管理

I/O章节5.1.1I/O分类&#xff08;1&#xff09;按使用特性分&#xff08;2&#xff09;I/O设备按传输速率分类&#xff08;3&#xff09;I/O设备按信息交换的单位分5.1.2I/O控制器5.1.3I/O控制方式&#xff08;1&#xff09;程序直接控制方式&#xff08;轮询&#xff09;&…

阿里巴巴分布式服务框架 Dubbo

1.Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架&#xff0c;每天为2000 个服务提供3,000,000,000 次访问量支持&#xff0c;并被广泛应用于阿里巴巴集团的各成员站点。Dubbo自2011年开源后&#xff0c;已被许多非阿里系公司使用。 2.入门文档 http://alibaba.github.io/d…