最重要的一句话

DDD的所有有相关理论中,只有一句是至关重要的,但是也是最容易被忽略和最难做到的,抛弃传统的设计方式(思路)的思想,这句话起了决定性的作用,但是99%的人都忽略了或者在开始无法正视或理解。

为什么说这句话是最重要的一句话,因为他是设计真正转变的出发点。

基于具体的语义环境

首先,DDD的重点在于领域这个东西,领域的确定必须要基于一定的环境的,简单理解就是 必须同时具备主谓宾,比如:小明关爱小花;对于这句话的理解其实存在歧义,如果没有具体的语义环境下可能有以下两种理解方式:

  1).小明 关爱(关系爱护)小花

  2).小明关 爱 小花

  。。。其他你可能想到的语义。如果不确定具体的语义环境 那么就无法确定限界上下文,间接的就是无法确定聚合如何创建,因为没有这个具体的语义环境就无法确定的限界上下文就无法决定如何确定聚合跟,谁是主(聚合跟)谁是次(实体),谁又是用作点缀、修饰用的(ValueObject).

示例参考

再换一个示例:组织架构,这个几乎所有的管理系统可能都会涉及,尤其是OA之类的管理系统

  不合理的方式:按照以往的凡是去设就是,根据组织架构的相关业务(逻辑),你肯定噼里啪啦的设计出来了几张表,Role,RoleClaim,User,UserClaim,UserDetail,LoginLog,Department,...然后就相关也业务开发了,,,但是,你觉得这个和DDD有啥关系,没一毛钱关系,你还是依旧的沉浸在以往的条件反应式的思想中,长期以往的思维方式已经让你机械化的知道需要这么做,那么如果不从DDD的角度,你这么做是完全Oj8K的,是的,你做的完全没问题。但是从DDD角度是完全大错特错的, 如果你有读过 实现领域驱动设计 ,你可能会记得还有一句话就是 以用户(使用者)的思想去思考,而不是继续使用开发者个思维角度去思考,也是因为这个原因。

  正确的做法是:首先确定你当前要实现的业务功能,以此确定边界,比如,我们打算开发的内容是,用户角色管理,那么这里就突出了两个对象一个动作,1)用户;2)角色) 3)和一个动作管理,这就确定了我们的上下文对象 可以确定为 UserRoleDbContext(一般的命名会直接明了的凸显出具体的语义含义),

那么这时候猜到了思考我们的聚合跟 Entity 以及ValueObject的设计。所以,这里我们的聚合对象就是User,因为一个用户可以对应多个role,同时role这个对象如果在没有具体的用户的情况下 他的存在也没有任何意义,但是多个用户可能有相同的角色,所以role可以确定为entity(DDD中entity的定义,有具体的标识)

以上是本人在设计在开发中的总结,如果您觉得不合理请指教。谢谢。

DDD - 概述 - 聚合 - 限界上下文 (四)的更多相关文章

  1. DDD之5限界上下文-定义领域边界的利器

    上图是一张普通地图,最刺眼的就是边界? 非常好奇地图绘制工程师是如何描绘如此弯曲多变的边界的?强制行政区域还是人群历史原因自然的人以群分? 我们再换个视角,对工程师或者架构师来说,微服务的边界如何划分 ...

  2. DDD - 概述 - 聚合 (三)

    不要再看那些理论啦,说的云里雾里的,绕到你怀疑人生 一句话概括聚合创建:聚合的一致性决定了聚合边界的确定,决定了聚合对象的创建.所谓的一致性即事务的一致性,细化就是 立即性和原子性.

  3. 【DDD】领域驱动设计实践 —— 限界上下文识别

    本文从战略层面街上DDD中关于限界上下文的相关知识,并以ECO系统为例子,介绍如何识别上下文.限界上下文(Bounded Context)定义了每个模型的应用范围,在每个Bounded Context ...

  4. 从壹开始微服务 [ DDD ] 之三 ║ 简单说说:领域、子域、限界上下文

    前言 哈喽大家好,DDD领域驱动设计系列又开始了,前天周二的那篇入门文章中,也收到了一定的效果(写小说的除外),同时我也是倍感鸭梨,怎么说呢,DDD领域驱动设计已经有十年历史了,甚至更久,但是包括我在 ...

  5. DDD中限界上下文与通用语言的作用

    什么是通用语言 通用语言, 最主要的目的就是减少交流中信息丢失, 在实际开发中, 可能关联很多人, 例如有业务层面的业务细节制定者.领域专家.产品经理.项目经理 .架构师.开发经理.测试经理等等, 即 ...

  6. DDD理论学习系列(3)-- 限界上下文

    1. 引言 限界上下文可以拆分为两个词,限界和上下文. 限界:是指一个界限,具体的某一个范围. 上下文:个人理解就是语境. 比如我们常说的段子: "我想静静." 这个句子一般是想表 ...

  7. 学习DDD的初步尝试,从最基础的开始,业务介绍,划分限界上下文 ,建立模型

    Conference业务简介 Conference是这样一个系统,它提供了一个在线创建会议以及预订会议座位的平台.这个系统的用户有两类: 1:客户,可以创建和管理会议. 2:会议座位预定者,可以预订会 ...

  8. 从壹开始微服务 [ DDD ] 之六 ║聚合 与 聚合根 (下)

    前言 哈喽大家周二好,上次咱们说到了实体与值对象的简单知识,相信大家也是稍微有些了解,其实实体咱们平时用的很多了,基本可以和数据库表进行联系,只不过值对象可能不是很熟悉,值对象简单来说就是在DDD领域 ...

  9. IDDD 实现领域驱动设计-理解限界上下文

    上一篇:<IDDD 实现领域驱动设计-理解领域和子域> <实现领域驱动设计>前两章内容,基本上读完了,和<领域驱动设计>不同的是,它把很多的概念都放在前面进行讲述了 ...

随机推荐

  1. vscode笔记(一)- vscode自动生成文件头部注释和函数注释

    VsCode 自动生成文件头部注释和函数注释 作者:狐狸家的鱼 本文链接:vscode自动生成文件头部注释和函数注释 GitHub:sueRimn 1.安装插件KoroFileHeader 2.设置 ...

  2. Djagno从入门到放弃

    一.web应用.http协议.web框架 二.Django简介 三.路由控制 四.视图层 五.模版层 六.模型层:单表操作,多表操作,常用字段和参数,Django-model进阶 七.组件:Djang ...

  3. 在线批量修改mysql中表结构

    在线批量修改mysql中表结构 1.获取要修改的表的表名称登录mysql库,查询出所有表 show tables; 将需要修改表结构的表名称存放到b.txt文件中2.执行修改修改表引擎为InnoDB ...

  4. jq选择器(jq 与 js 互相转换),jq操作css样式 / 文本内容, jq操作类名,jq操作全局属性,jq获取盒子信息,jq获取位置信息

    jq选择器(jq 与 js 互相转换) // 获取所有的页面元素jq对象 $('css3选择器语法'); var $box = $(".box:nth-child(1)"); 获取 ...

  5. mysql 一张表的数据插入另一张表的sql语句

    1. 表结构完全一样 insert into 表1 select * from 表2 2. 表结构不一样(这种情况下得指定列名) insert into 表(列名1,列名2,列名3) select 列 ...

  6. System系统类

    System系统类 : 主要的作用是用于获取系统的一个参数. System类需要掌握的方法: arraycopy(Object src, int srcPos, Object dest, int de ...

  7. 针对缓存在Redis中的聊天消息的持久化方案分析

    选型依据 数据库的选型主要考虑一下几个方面: 数据库本身是否收费 数据库后期维护成本 是否支持水平及垂直扩展,及扩展的容易程度 业务数据本身特性 使用此数据库的开发成本 由于此数据库主要用来存储缓存在 ...

  8. C#匿名对象(转JSON)

    多类型匿名对象 var result = new { pages = , users = new System.Collections.ArrayList { ,name="}, ,name ...

  9. luogu P5303 [GXOI/GZOI2019]逼死强迫症

    传送门 只有两行,考虑递推,设\(f_i\)为没有那两个\(1*1\)的,前\(i\)列的方案,可以发现一次可以放一个竖的或两个横的,也就是\(f_i=f_{i-1}+f_{i-2}\) 再设\(g_ ...

  10. 20175306 迭代和JDB调试

    迭代和JDB调试 1.使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功能 代码展示: public class C { public static ...