DDD系列-领域建模
2022-11-04 16:31:33    10    0    0
weibo-007

DDD系列-领域建模

为什么要建模

不管你有没有想过这问题,领域模型一直都在,与是否发现它无关。假设我们去专卖店买手机,买完手机之后留下了自己的名字和电话号码,并且店员用一张单子做记录。

 

什么人需要查看这个单子呢?店员A需要查看,店员B也需要查看,老板也需要查看单子计算今天的销售额。而且大家的关注点不一样,店员要求名字和电话号码对上就行,可是老板却需要售卖金额。这个时候大家都要看的情况下,必须保持格式统一,否则就乱套,要不是少记电话号码,就是少记金额。这个时候老板和店员其实默默的形成了一个心智模型。订单=名字+电话号码+商品+金额

下面是店家和老板达成约定的订单:

名字电话号码商品金额
张三13249383944iPhone13¥9000
李四18393843432小米9¥2100

 

假设手机卖出去之后,客户需要维修手机,于是客户来到店里询问店员,店员查核查了订单记录,然后引导用户到维修部。维修部发现手机过了保修期,所以他写了一个维修单让顾客去缴费。这个时候是维修员和收银员达成的心智模型维修单=名字+电话号码+商品+维修费用

维修人员和收营员约定的维修单:

名字电话号码商品维修费用
张三13249383944
iPhone13
¥500
王五13637673434ViVo C9¥600


这里对应一下有的公司的现状:这一点并不陌生,如果我们将时间拉回到10几年前,我们眼中的领域模型其实说白了就是数据库设计。这种开发方式是基于数据模型的,我还记得很经典的一句话:只要数据库定了,对应的业务逻辑就定下来了。这个时期面对需求的时候,表现就是开发人员一开始就围绕数据库进行设计

 

但是,这个时候他们一定要接受抱怨并且开始动脑筋,抱怨就是:

1)维修人员抱怨为什么用户下单的时候有的信息,在维修的时候还需要再抄一遍

2)收营员开始抱怨,这个用户维修单上的信息和订单上的信息不一致,总是搞错,每次都需要重新核对

这时候你会发现用户信息到处都有,需要做一个客户模型,客户信息独立于订单和维修单,并且你可能也发现,用户拿身份证核对就好了,所有部门共享客户模型。

这时候你又在思考,好像维修单里面的大部分信息在订单里面都有,能不是直接复用订单数据呢,于是你可能做一个订单模型。用订单ID去和其他服务关联。

 

所以,及时你没有使用任何的建模概念和工具,有的时候其实你已经在做这一类的事情了。但是你的目标和建模的目标是一致的,建模的作用

1)把心智模型提取出来,显性化,让不同的人对业务的理解达成一致

2)要归类复用,避免重复的工作,让人可以关注更高层面的事务

 

值得一提的是,刚才我们并没有表明我们是从事软件开发的,我们仅仅是行业中普普通通的一员,所以理论派有三个观点

1)建模是普遍存在的,即使一个企业不开发软件,也具备其业务模型

2)所有同行企业,其业务模型必定有非常大的共性和内在的规律性

3)由行业内的各个企业的业务模型再向上抽象出整个行业的业务模型,这个模型称之为“领域模型” 

 

再回到我们的正文,如果我们是软件开发人员,我们会发现,其实我们做的是把领域模型可视化出来了,并不是创造了一个领域模型。

什么是领域模型

领域模型是一种概念模型,问题领域的概念的表示。

通俗地讲,领域模型首先要看我们解决的问题在哪个领域,比如你是财务的,监管的,保险的等等。然后确定这个领域内有哪些概念,比如财政支出,骗保等等,然后把概念之间的关系表述出来。这就是领域模型。

如果熟悉UML的同学,也可以把领域模型简化成:没有定义操作的类图。

如何表示领域模型:概念类,概念类之间的关系,概念类的属性。

下面是一个掷骰子游戏的简单模型(看这个模型必须基本知道掷骰子游戏的基本玩法,否则这个模型是失败的)

领域模型案例

大富翁游戏建模

大富翁游戏概述

这是简易版本的大富翁游戏,由2-8名参与者组成一局游戏,每一个参与者在格子盘上投掷二次骰子,然后相加的点数就是前进的步数,最后第一个达到终点的人胜利。

为了增加游戏的乐趣,我们会在中间设定一些陷阱格子,如果到达陷阱格子,将困在这个格子里,错失一轮游戏(这里暂时不考虑这些复杂场景)。

游戏用例

1)开始一局大富翁游戏,设置参与玩家,由2-8玩家组成

2)游戏开始,每个玩家出现的地图起点

3)随机一个玩家作为第一个掷骰子的玩家,然后这个玩家投掷两次骰子,显示两次骰子点数只和

4)这名玩家按照点数只和前进相应的格子数,达到地图上的另一个点

5)其他玩家依次进行3-4步骤

6)最后第一个达到终点的玩家胜利

领域模型 

游戏建模型,下面这张就是简易版的大富翁游戏模型,这里需要注意的是,尽量让模型中的语言和用例中的语言保持一致

(模型的建立灵感来源用例,并且这个模型需要PM,领域专家,开发人员达成一致)

 

参考资料:

https://www.zhihu.com/question/25089273

https://www.bilibili.com/video/BV164411b7HX?p=1

 

Pre: GO语言基础-数据竞争

Next: GO监控方案-prometheus

10
Sign in to leave a comment.
No Leanote account? Sign up now.
0 comments
Table of content