DDD 学习

DDD Core

高内聚,低耦合是好的软件设计标准,而DDD是一种软件设计思想,他用一些更加细化的流程或者规范指导我们一步一步走到高内聚低耦合的目标。

软件是将现实生活中的行为映射到代码中,所以越是接近现实的设计,越是高效的。能否做到这一点,也正是软件工程师和程序员的区别。

各种概念

领域

和现实生活中的领域一个意思,指一块业务范围。

核心域 & 子域

核心域和子域都是领域,只是地位不同。

限界上下文

对应到现实生活中,限界上下文类似语境的意思。每个领域中有一个或多个限界上下文,但如果存在多个限界上下文,那应该思考,领域是否切分的太大。
限界上下文用来辅助领域的使用,例如不同语境下相同的东西可能用不同的词汇(例如商品和货物)或者相同的东西关注不同的属性。

Screen Shot 2020-12-22 at 3.59.46 PM.png

Q:我的一个电商系统,有个Class叫Product,我可以在库存领域和物流领域使用同一个Class吗?因为我不想要重复的代码?
A:应该使用两个Product Class(准确的说在库存领域叫commodity,在物流领域是goods,虽然他们其实是一个东西),因为在不同领域我们对模型的侧重点不同,在物流领域我们关注Product的类型编号,不能送错货物了,或者重量大小之类的。而在库存领域,我们即关心的是他们的大小重量,也关心他们的生产日期之类的,我不想存过期的东西。两个领域既有重合在意的信息,也有不同侧重的信息,所以应该建立两个Class在不同的领域。

实体&值对象

举例:体育场的座位。当我们发放的门票上有座位号的时候,座位需要作为独立的实体,座位号是唯一的标识。而当先到先座模式下,我们只关心剩余座位数,那么座位号并不是唯一标识,这时候座位就可以作为一个值对象。

所以一个model是值对象还是实体与业务场景有关,与具体存储方法无关,他们都可以存入数据库都可以有在数据库中的唯一标示。

举例:我们网购的时候填入的地址,从业务角度并不关心他的唯一性,你可以使用它,与你同住的人都可以使用。但每个人可能有很多个不同的收货地址,例如家,学校,公司等。所以在存储时你需要单独建立一个表,每个地址有个数据库中的唯一标示,并用此唯一标示绑定与你的一对多关系。所以地址在这个业务场景下,是一个值对象,但有数据库的id。

在学DDD的初期,经常会陷入思维定势,将新的知识与已知的知识对应,以为有id的就是实体,没有id的就是值对象,这样的想法并不全面,就像不是有了北洋舰队,清朝就变成了现代国家一样。在学习DDD的时候一定要摆脱旧的数据建模的思想,不能一上来就想数据库建表之类的事情。而是一切以业务为中心进行领域建模。

高内聚,就是将model的行为封装到实体本身中,所以在高内聚的代码中,应该很少需要get和set方法,这又让我们多了一个不使用Lombok的理由。

聚合&聚合根

聚合包含聚合根、实体和值对象。
聚合根是一种实体,从真实世界对业务对象进行识别和概念建模的时候,一个对象可能有多个层次,也可能有多个子实体,但是这些子实体都不可能孤立存在,它们必须依附于一个聚合根存在,它们和根节点具有同样的生命周期。
举例:在电商系统中,客户是一个实体也是聚合根,客户的地址,订单是依附于客户的值对象和子实体。

Screen Shot 2020-12-24 at 3.03.20 PM.png

架构

DDD 并不硬性要求架构设计,可以使用分层架构、六边形架构、SOA架构、REST风格、CRQS架构、事件驱动架构、数据网织和基于网格的分布式计算等架构方式/风格。这些架构的文章很多,在这里不赘述了,省的复制粘贴工作。

核心理解

无论是分层架构还是六边形架构,在DDD中我们要保证的就是将领域中的业务逻辑和我们的基础设施分开。
所以领域内的model类中,不应该有类似@Table等这类JPA的注解,也不应该有@Valid这样网络接口层用来校验合法性的注解,这样就讲我们的领域模型和基础设施强耦合了,如果我们有一天更换数据库类型,我们就需要修改领域模型,这是不合理的。

Q:这样我们会不会有很多相似的类,例如Product在领域逻辑中,在数据持久层中,在网络接口层都需要一个类文件,而他们的属性基本相同。
A:我只能说这些重复是有利的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352