专栏名称: dotNET跨平台
专注于.NET Core的技术传播。在这里你可以谈微软.NET,Mono的跨平台开发技术。在这里可以让你的.NET项目有新的思路,不局限于微软的技术栈,横跨Windows,Linux 主流平台
目录
相关文章推荐
l 看齐 l  ·  刚刚!王曼昱夺冠! ·  9 小时前  
l 看齐 l  ·  刚刚!王曼昱夺冠! ·  9 小时前  
中国基金报  ·  证监会出手,重罚! ·  2 天前  
中国基金报  ·  今夜,大跳水! ·  3 天前  
中国基金报  ·  华为,重磅!“黑科技”来了 ·  3 天前  
51好读  ›  专栏  ›  dotNET跨平台

这是DDD建模最难的部分(其实很简单)

dotNET跨平台  · 公众号  ·  · 2024-08-11 08:00

正文

本文书接上回《 为了落地DDD,我是这样“PUA”大家的

https://mp.weixin.qq.com/s/DjC0FSWY1bgJyLPIND5evA

什么是最重要的事

如果你认真读过前面的文章,那么一定知道我们的核心逻辑: 领域驱动是一种价值观 ,这个价值观是:“领域(边界)”的明确是软件设计掌控复杂度 最重要 的事。

那么整个软件交付过程中,架构师的职责就是持续保持“需求”、“模型”、“代码”三者的边界范围明确且一致。再回过头看整个软件交付存在的意义,就是为了满足需求,因此本质上来说,“需求”的边界就决定了一切,那么结论就不言而喻了:

最重要的事,就是 需求的边界(范围)。

什么叫边界明确

假如说我有两个需求A和B,那么我们建模的时候就有如下几种结果,大家感受一下,通常情况下,自己给出的结果是哪个选项?哪个选项又是最理想的?

我相信大部分人都会认同,其中B和D是符合边界明确、需求与模型边界一致的原则的,而现实的情况大部分结果是A和C,各种各样的“join”充斥着系统的各个角落,一个典型的例子,就是用户-角色系统的设计。

用户-角色系统,通常会有这样几个关键需求:

  1. 创建用户

  2. 创建角色

  3. 为用户设置角色

  4. 查看用户有哪些角色

  5. 查看一个角色包含多少个用户


我们用最传统的设计方法来做,模型大体是这样的:

这样的结果是不是对应到了前面选项A和C比较类似?因为“用户聚合”与“角色聚合”连线的存在,导致需求与模型的边界不一致。

而我们要做的,就是在满足所有需求的同时,消除打破边界的连线。

如何操作

首先我们分析上图,假如我们把下面几个需求先去掉:

  1. 为用户设置角色

  2. 查看用户有哪些角色

  3. 查看一个角色包含多少个用户


那么我们会得到一个符合边界明确原则的设计:

然后我们再思考,下面两个需求,应该哪个聚合负责:

  1. 为用户设置角色

  2. 查看用户有哪些角色


答案很显然是“用户聚合”,那么我们可以得到下面的设计:

这时你会疑问,如果没有“用户聚合”和“角色聚合”的连线,怎么设置用户有哪些角色呢?

问题的关键 ,就在这里,通常我们总是会把“关系表”在图中用一条线来表示,那如果我说,“用户聚合”有一个集合属性,叫做“用户角色”,你会认同吗?如果我们知道用户对象有一个集合属性叫“用户角色”,那么是不是上图就很合理?







请到「今天看啥」查看全文