目录
1 一些你需要了解的概念
先上经典领域模型图:
1.1 什么是 DDD?
-
DDD(Domain Driven Design):是一种处理高度复杂领域的设计思想,它试图分离技术实现的复杂性,并围绕业务概念构建领域模型来控制业务的复杂性,以解决软件难以理解,难以演进的问题。DDD 不是架构,而是一种架构设计方法论,它通过边界划分将复杂业务领域简单化,帮我们设计出清晰的领域和应用边界,可以很容易地实现架构演进。
-
DDD 包括战略设计和战术设计两部分。战略设计主要从业务视角出发,建立业务领域模型,划分领域边界,建立通用语言的限界上下文,限界上下文可以作为微服务设计的参考边界。战术设计则从技术视角出发,侧重于领域模型的技术实现,完成软件开发和落地,包括:聚合根、实体、值对象、领域服务、应用服务和资源库等代码逻辑的设计和实现。
1.2 领域、子域、核心域、通用域和支撑域
-
领域:领域就是用来确定范围的,范围即边界,这也是 DDD 在设计中不断强调边界的原因。DDD 的领域就是这个边界内要解决的业务问题域。
-
子领域:领域可以进一步划分为子领域。我们把划分出来的多个子领域称为子域,每个子域对应一个更小的问题域或更小的业务范围。甚至于业务复杂的情况下,子域还可以做进一步的划分,称为子子域,这依赖实际情况来定。
接下来根据子域的不同类型就可以划分出核心域、通用域和支撑域了。
-
核心域:是决定产品和公司核心竞争力的子域,它是业务成功的主要因素和公司的核心竞争力。
-
通用域:没有太多个性化的诉求,同时被多个子域使用的通用功能子域。
-
支撑域:既不包含决定产品和公司核心竞争力的功能,也不包含通用功能的子域。简单点说既不属于核心域也不输于通用域的子域就属于支撑域。
我们以桃树的生物学体系建立过程为例。
第一步:确定研究对象,即研究领域,这里是一棵桃树。
第二步:对研究对象进行细分,将桃树细分为器官,器官又分为营养器官和生殖器官两种。其中营养器官包括根、茎和叶,生殖器官包括花、果实和种子。桃树的知识体系是我们已经确定要研究的问题域,对应 DDD 的领域。根、茎、叶、花、果实和种子等器官则是细分后的问题子域。这个过程就是 DDD 将领域细分为多个子域的过程。
第三步:对器官进行细分,将器官细分为组织。比如,叶子器官可细分为保护组织、营养组织和输导组织等。这个过程就是 DDD 将子域进一步细分为多个子域的过程。
第四步:对组织进行细分,将组织细分为细胞,细胞成为我们研究的最小单元。细胞之间的细胞壁确定了单元的边界,也确定了研究的最小边界。
再说子域类型的划分。不同的人对桃树的理解是不同的。如果这棵桃树生长在公园里,在园丁的眼里,他喜欢的是“人面桃花相映红”的阳春三月,这时花就是桃树的核心域。但如果这棵桃树生长在果园里,对果农来说,他则是希望在丰收的季节收获硕果累累的桃子,这时果实就是桃树的核心域。在不同的场景下,不同的人对桃树核心域的理解是不同的,因此对桃树的处理方式也会不一样。园丁更关注桃树花期的营养,而果农则更关注桃树落果期的营养,有时为了保证果实的营养供给,还会裁剪掉疯长的茎和叶(通用域或支撑域)。
总结一下:关于子域类型的划分并不是固定的,需要根据实际业务场景去识别,只有了解了业务中所真正关注的问题点才能做好划分。核心域、支撑域和通用域的主要目标是:通过领域划分,区分不同子域在公司内的不同功能属性和重要性,从而公司可对不同子域采取不同的资源投入和建设策略,其关注度也会不一样。
1.3 其他概念
1.3.1 限界上下文
我们可以将限界上下文拆解为两个词:限界和上下文。限界就是领域的边界,而上下文则是语义环境。
通过领域的限界上下文,我们就可以在统一的领域边界内用统一的语言进行交流。
为了避免同样的概念或语义在不同的上下文环境中产生歧义,DDD 在战略设计上提出了“限界上下文”这个概念,用来确定语义所在的领域边界。
举个例子:正如电商领域的商品一样,商品在不同的阶段有不同的术语&#x