DDD系列-领域建模
为什么要建模
不管你有没有想过这问题,领域模型一直都在,与是否发现它无关。假设我们去专卖店买手机,买完手机之后留下了自己的名字和电话号码,并且店员用一张单子做记录。
什么人需要查看这个单子呢?店员A需要查看,店员B也需要查看,老板也需要查看单子计算今天的销售额。而且大家的关注点不一样,店员要求名字和电话号码对上就行,可是老板却需要售卖金额。这个时候大家都要看的情况下,必须保持格式统一,否则就乱套,要不是少记电话号码,就是少记金额。这个时候老板和店员其实默默的形成了一个心智模型。订单=名字+电话号码+商品+金额
下面是店家和老板达成约定的订单:
名字 | 电话号码 | 商品 | 金额 |
张三 | 13249383944 | iPhone13 | ¥9000 |
李四 | 18393843432 | 小米9 | ¥2100 |
假设手机卖出去之后,客户需要维修手机,于是客户来到店里询问店员,店员查核查了订单记录,然后引导用户到维修部。维修部发现手机过了保修期,所以他写了一个维修单让顾客去缴费。这个时候是维修员和收银员达成的心智模型。维修单=名字+电话号码+商品+维修费用
维修人员和收营员约定的维修单:
名字 | 电话号码 | 商品 | 维修费用 |
张三 | 13249383944 | iPhone13 | ¥500 |
王五 | 13637673434 | ViVo 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
No Leanote account? Sign up now.