领域驱动设计之实体

我是去年来到中软的,在客户驻场开发,到现在差不多一年了,今天我来分享一下去年的所学。

我以前比较喜欢学习,经常自己看网上的资料,从持久化框架、设计模式、微服务体系、服务网格等等,去年换工作来到中软,去到客户驻场开发,上班的第一天,leader就让我跟他交流了几个小时,我也是从那时候开始接触DDD(领域驱动设计)。所以我今天要个大家分享的也是我近一年来,对领域驱动设计一些经验和所得。

什么是领域
所谓领域,即对人、物、动作进行抽象,将相同或者相似的分门别类。简单来说就是,大家都认为,纸的燃烧生成水和二氧化碳的现象是化学领域,飞机机翼能产生升力的现象为物理领域

那么我们从事软件开发,什么才是我们的领域呢?
试想一下,我们身处没有互联网的社会,我们现在要卖火车票,我们应该要做哪些事,有哪些人参与我们这次活动,这次活动我们关注的是那些物品。

现在我们来看一下我们买火车票的过程:

	1.我去到火车站

	2.我将我的出发地、目的地告诉票务员

	3.票务员告诉我,有3个车次

	4.我从中选择第二个车次并告诉票务员

	5.票务员将我选择好车次的价格告诉我

	6.我支付票务员告诉我的金额

	7.票务员将我支付了对应金额的车票交给我

	8.票务员将我消费后的发票交给我

上面的7个流程,从中提出我们的关注点:

	1.谁去买火车票,乘客

	2.谁在卖票,票务员

	3.有哪些物品,不同出发地、不同目的地、不同乘车时间的火车票

    	4.谁去付钱,乘客

	5.谁在收钱,票务员

	6.有哪些物品,支付后的发票

现在我们分离这一个完整活动的关注点,1、2、3、4、7的流程我们关注的是火车票,而5、6、8的流程我们关注的是支付金额,所以横切关注点之后,我们可以分为两个领域,售票领域和支付领域

2.怎么驱动我们的程序设计
活动产生的记录,这是我们追溯领域内的业务主体。
怎么设计我们业务主体,我们需要了解领域知识,抓住领域中的核心关注点
哪些是我们的领域知识,哪些是我们领域中的核心关注点
从售票领域来看,乘客买票,所给出的领域知识有哪些:乘客是谁、从哪里出发、目的地是哪里、什么时候出发、承运商是谁、票务员是谁,这些都是领域知识并且是售票领域中的核心关注点

从支付领域来看,支付火车票的金额,所给出的领域知识有哪些:谁来付钱、付多少钱、付给谁,这些都是支付领域的领域知识和核心关注点。注意这个时候,我们将乘客表示为”谁“,对于支付领域,我并不关心他在售票领域参加买票活动中扮演什么角色,我关心的是支付人是谁,收款人是谁。

我们从售票领域提炼领域知识后,得出我们的模型设计:

	1.火车票的模型中的属性:出发地、目的地、乘客、票价、发车时间、承运商

	2.购票订单的模型中的属性:火车票、订单价格、购票人、售票人

我们从支付领域提炼领域知识,得出我们的模型设计:

	1.支付订单的模型中的属性:付款人、收款人、支付金额

这篇文章主要分析怎么用领域驱动的方式去设计实体,当然还有很多方法也可以实践使用领域知识设计实体。

我们这里主要:

第一个核心思想,分而治之,我们从事复杂领域的工作中,要将相同的相似的进行分类,抽象,并且要自顶向下的抽象,抽象不是水平模型也不是垂直模型,我们使用面对象的语言,不应该是事务脚本,而自顶向下的金字塔模型,位于金字塔顶尖的是我们的聚合根,聚合根聚合一个或者多个职责不同,但抽象层次相同的对象,职责不同是指在同一抽象层次的对象中,我与其他对象的职责不同,所谓单一职责也正是如此。
第二个核心思想,切分关注点,我们了解某一领域或者某一领域的某一部分,要将不重要的,与领域没有太大联系的、或者其他领域的知识忘掉,将我们的关注点集中于某一领域或领域的某一部分,不要带着其他的领域中的知识参与另一领域的设计(当然不是让你把技术、设计经验忘掉),这样设计出来的模型能够更加精准,不会因为其他领域知识设计出具有偏向其他领域的业务模型。

有关更多领域驱动设计,也可以看下张逸在gitchat出的电子书,更多领域驱动设计相关的知识,有空我会多分享一些。:https://gitbook.cn/gitchat/column/5cdab7fb34b6ed1398fd8de7/topic/5cdaba4c34b6ed1398fd8e09

或者看看四色模型: https://www.jianshu.com/p/513b021ad283

你可能感兴趣的:(java,领域驱动,ddd)