前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

前言:

在战术层面,领域驱动设计要求的分析方法就是以“领域”为中心对业务需求展开分析建模,获得领域分析模型

一、统一语言与领域分析模型

在领域建模阶段,领域模型与统一语言之间是一种相辅相成的关系。

统一语言可以作为领域建模尤其是领域分析建模的依据,建立的领域模型又反过来组成了统一语言。开发人员要学会使用统一语言描述构成领域模型的类、方法甚至领域层的每一行代码,并时刻保证领域模型与统一语言的一致性。

⬤ 统一语言不仅构成了领域模型,还是领域建模过程中无形的最高设计准绳。为了保证分析与设计的质量,我们需要不停地追问以下问题

1、我们设计的模型符合统一语言吗?

2、限界上下文的领域概念遵循统一语言吗?

3、类名与方法名满足统一语言的规范吗?

这就好比你开车到一个陌生的城市。统一语言就是地图导航,不停地发出声音提醒你行进的方向。当你驶入错误的地方时,它也会及时地修正路线,然后给予你正确的提示

二、快速建模法

image-20240910154926970

1、名词建模

识别业务服务规约中的名词。名词代表了候选对象,可将其映射为领域模型对象

名词建模的基础是业务服务规约,建模人员迅速找出规约描述中的名词,在统一语言的指导下将其一一映射为领域模型对象。这些领域模型对象往往最容易识别,以此为基础就可以轻易地获得一个像模像样的领域分析模型。这一成果势必会增加建模人员的建模信心。统一语言的梳理与参考也促进了建模人员对业务的理解。

举例:以电商系统的提交订单业务服务为例,它的规约描述如下。

image-20240910155211440

2、动词建模

识别业务服务规约中的动词。动词代表了候选对象上的候选操作,可将其映射为领域行为,若领域行为产生了过程数据(比如单据或交易记录等),则将该过程数据识别为领域概念

例如,作为咨询师的我在2020年6月6日接受了一个咨询任务,要在次日从成都到北京出差。为此,我需要预订去程机票。以下是我的一系列操作行为。

1、6月6日16时30分,我使用自己的账号名登录到一家旅行网站:登录行为产生了登录请求,它与企业运营和管理无关,无须产生过程数据。

2、6月6日16时32分,我查询了6月7日从成都到北京的航班:查询航班行为获得了航班查询结果,它与企业运营和管理无关,不需要被识别为领域模型对象。

3、6月6日16时40分,我选定了查询结果中的一个去程航班,在输入乘客信息后提交订单,发起支付:提交订单行为生成了机票预订订单,支付行为产生支付凭证,旅行网站会向航空公司预订航班;订单、支付凭证影响到企业的财务和账目,航班预订影响到乘客的权益,直接或间接影响到企业的运营和管理,识别出过程数据Order、Payment和FlightSubscription。

4、6月6日17时,旅行网站通知我订票成功:通知行为会产生订票成功的通知信息,但它与企业运营和管理无关;旅行网站完成订票支付交易,它会影响企业的财务账目,例如对往来账的清算与结算,识别出过程数据Transaction。

5、6月6日18时20分,客户突然调整了咨询任务安排,延期到一个月后执行。我需要取消航班:重新登录网站取消订单,并发起退款请求。订单状态变更影响到乘客和航空公司的权益;退款请求影响到企业的交易账目,直接或间接影响到企业的运营和管理,识别出过程数据Order和RefundRequest。

6、6月6日18时22分,旅行网站管理员审核退票请求,审核通过并发起退款:取消订单的审核记录和退款记录影响到企业的审计与财务账目,直接或间接影响到企业的运营和管理,识别出过程数据Approvement和Refund

7、6月6日18时23分,订单取消成功:订单的状态变更影响到乘客和航空公司的权益,间接影响到企业的运营和管理,识别出过程数据Order。

8、6月7日18时30分,退款成功:退款操作为旅行网站与支付中介之间的一次交易,影响到乘客和企业的权益与财务账目,直接影响到企业的运营和管理,识别出过程数据Transaction。

image-20240910164532212

通过动词寻找时标对象时,可以针对动词对应的领域行为发起与领域专家之间的问答,当然也可以是设计者自己的自问自答。提问的模式如下所示

1、针对动词代表的领域行为,是否需要记录过程数据?

2、如果缺少了过程数据,会否影响运营管理、引起法律纠纷或造成经济损失?”

image-20240910164733383

3、归纳抽象

针对有定语修饰的领域概念进行归纳和抽象

通过名词建模和动词建模快速确定领域分析模型后,为提高模型的质量,可对已有领域概念进行归纳抽象。归纳抽象时,主要针对那些由定语修饰的领域概念。

名词建模直接将业务服务描述中的名词转换为领域模型,其中,可能包含那些有定语修饰的名词,要注意分辨它们是类型的差异,还是值的差异。如果是值的差异,类型就应该相同,应归并为一个领域概念。 例如,收货地址与家庭地址表达了不同的值,但它们其实都是地址 Address 类型;订单状态和商品状态似乎修饰的都是状态,但实际上代表完全不同的值,两个概念不能合并。”

4、确定关系

确定领域概念之间的关系。一旦获得了领域分析模型的领域概念,就可以进一步确定它们之间的关系。

例如,读者( Reader )与作品( Work )之间存在关联关系,表达了一种收藏的概念,故而可以提炼出收藏( Favorite )领域概念。

针对提交订单业务服务,在通过名词建模和动词建模获得的领域概念中,订单( Order )与所购商品( PurchasedProduct)之间存在多对多关系。在二者的关系上,实则需要建立订单项 ( OrderItem ) 概念。一个订单包含多个订单项,一个订单项包含一个所购商品,由此就简化了订单与所购商品之间的关系。同理,购物车( Cart )与商品( Product )之间的关系也可以引入购物车项( CartItem )领域概念。

通过快速建模法为提交订单业务服务获得了下图领域分析模型。”

image-20240910171529824

ContactAuthor