一文揭秘领域驱动设计(DDD):领域和子域
ccwgpt 2024-10-13 01:27 36 浏览 0 评论
★★★建议星标我们★★★
2020年Java原创面试题库连载中
【000期】Java最全面试题库思维导图
【020期】JavaSE系列面试题汇总(共18篇)
【028期】JavaWeb系列面试题汇总(共10篇)
【042期】JavaEE系列面试题汇总(共13篇)
【049期】数据库系列面试题汇总(共6篇)
【053期】中间件系列面试题汇总(共3篇)
【065期】数据结构与算法面试题汇总(共11篇)
【076期】分布式面试题汇总(共10篇)
【077期】综合面试题系列(一)
【078期】综合面试题系列(二)
【079期】综合面试题系列(三)
【080期】综合面试题系列(四)
【081期】综合面试题系列(五)
【082期】综合面试题系列(六)
【083期】综合面试题系列(七)
【084期】综合面试题系列(八)
【085期】综合面试题系列(九)
【086期】综合面试题系列(十)
【087期】综合面试题系列(十一)
【088期】综合面试题系列(十二)
【089期】综合面试题系列(十三)
更多内容,点击上面蓝字查看
- 前言 -
众所周知,领域驱动设计(DDD)是个相当抽象的概念,国内除了几家知名大厂有成功实践外,更多技术团队还处于探索阶段。想要以 DDD 思想指导架构设计,我们首先需要对 DDD 所包含的概念有深入了解,今天,就和大家简单聊聊 DDD 的核心概念:领域和子域。
- 领域和子域 -
在很长一段时间里,我们认为技术是主导项目成功的关键因素,这种关键因素通常表现在项目使用的编程语言、框架、架构(如:分层架构)、中间件、数据库等等方面(如:生态)。但技术真的是项目成功的关键因素吗?
在一个软件项目里除了技术层面的这部分,我们最主要的事情是实现业务。实现业务其实是在实现所在业务领域中所需要的业务。技术也是一个领域,称之为技术领域。领域驱动设计中的领域是指的业务领域。
大多数的技术人员对技术领域中的知识比较感兴趣(狂热),因为这能够使得自己在技术方面有一些前沿性和探索性的实践。然而对于业务领域中的知识就显得比较暗淡一些。
当项目的进展随着对业务领域的深入,大家又开始为各种曾经没有分析到的需求忙的焦头烂额。这个时候对技术领域的探索也基本成熟。接着又一轮新技术的出现,使得大家又开始对新技术进行探索实践,并试图使用新技术来解决掉以前遗留下来的没有解决的新需求,此时就出现了所谓的“全盘重构”。
正是这种周而复始的对技术领域的不断探索,使我们对业务领域里重要的核心知识被埋没。当有一天我们认识到业务领域十分重要时,你可能已经不在这个业务领域中探索技术了。
让一个技术水平较高的技术人员去深入研究分析领域中的业务是需要勇气的,这种勇气不是来自对未知的复杂业务领域的挑战而是让自己不在无时无刻沉静在对技术探索的环境中。
这要求一些技术人员需要花费一些时间去深入到业务领域中去分析领域知识并最终形成领域模型。
问题:领域中的业务是由什么组成的呢?
回答:需求。
问题:需求又是有什么组成的呢?
- 什么是领域? -
百度百科对领域的解释:
学术思想或社会活动的范围。
具体指一种特定的范围或区域。
在《领域驱动设计》中,领域指的是一个特定的业务范围,大家在这个业务域范围内开展工作。
领域这个词承载了太多的含义。在大多数人的理解中会使用领域代替行业、项目或者系统,这样会使一些人认识领域就是行业、项目或者系统。在认识领域时一定要注意所指的业务域,行业、项目或系统都不能准确地表达领域所指的业务域。
一个系统可能由一个领域或者多个领域组成。如果一个系统是由一个领域组成时,这会给大家一种错觉。
1、子域(Subdomain)
在初识子域概念时,可能会认为子域与领域的是父子关系。其实他们并不是父子关系,而是包含关系。当多个业务域(领域)的组合形成了一个更大的业务域(领域)时,其中每一个领域(业务域)是这个更大的业务域的一部分,每一个业务域相对于这个更大的业务域称之为这个更大领域的子业务域,简称子域。组合而成的这个更大的业务域统称为领域。
补充:领域与子域的关系更好的描述是饼状图,领域相当于整个饼状图,子域相当于这个饼状图中的某一个块。
这是一个有关“零售商在线销售产品”的例子,来源于《实现领域驱动设计》。
把零售商中的所有业务看做成一个领域(业务域),把这个整体业务域中的每一个业务域看做成子域。所以这个零售商业务域中包括:产品目录子域、订单子域、物流子域、发票子域、库存子域等。
这张业务域图已经为我们呈现了一个近似完整的子域划分图。那么这张图是如何完成划分的呢?
对一个业务域划分子域时,往往会把一个领域划分为:核心域、支撑子域、通用子域三种类型的子域集。其中核心域是整个业务域(领域)的核心,支撑子域和通用子域完成非核心的业务。不管怎么样,在对一个整体业务域进行划分时,首先要做的是划分核心域。
注意:三种类型的子域不是三个类型的子域,每种类型的子域数量可能有多个。
2、核心域(Core Domain)
核心域是整个业务系统的核心,所有的业务都要围绕着核心业务域展开。如何明确核心域呢?
通常明确核心的方式是精炼业务域。精炼是一个持续的过程,具体来说有以下几种方式:
领域愿景说明(Domain Vision Statement)
突出核心(Highlighted Core)
内聚机制(Cohesive Mechanism)
分离的核心(Segregated Core)
抽象核心(Abstract Core)
3、领域愿景说明(Domain Vision Statement)
这部分的内容在《领域驱动设计》中表达地非常简洁,没有必要再做过度的解读。具体内容如下:
并且还给出了两个“领域愿景说明”的示例:
在这两个示例中提到的模型并不是一个领域模型,而是一组领域模型。更具体地来说是要告诉我们这一组领域模型要解决什么问题,而这个要解决的问题正是由客户来提出的最需要的那个功能,这个最需要的功能正是业务域中的核心。
为业务域编写“领域愿景说明”是有必要的,因为它可以让整个团队的人员都能明确什么是核心域。正是明确了核心域,才可以使整个团队朝着统一的方向前进。
4、突出核心(Highlighted Core)
我们通过“领域愿景说明”可以明确什么是核心域,但这是从一个较为宽泛的角度对核心域进行说明的。我们明确核心域的目的是为了形成核心领域模型,此时我们需要突出核心。
突出核心域中的领域模型有两种方式:
精炼文档;
标明核心(Core)。
精炼文档要做的事情是创建一个最核心的概念对象的清单文档。
标明核心(Core) 要做的事情是从一个完整的领域模型文档中标记出最核心的领域模型。
5、分离的核心(Segregated Core)
分离的核心的主要目的有两个:
将核心域中的非核心元素(模型)分离出去。
将非核心域中的核心元素(模块)移动到核心域中。
这两个目的都是为了让核心域更加清晰和增强核心域的内聚性。
有关核心域的更多内容请阅读《领域驱动设计》中的第十五章,其中非常详细地阐述了如何明确核心域和实现核心域。
《实现领域驱动设计》中通过问题空间和解决方案空间对核心域做了更直接的说明:
问题空间是领域的一部分,对问题空间的开发将产生一个新的核心域。[IDDD, P48]
核心域的范围并不一定是一次就能确认的,可能需要迭代很多次,每一次都有可能扩大或缩小。
6、通用子域
如果一个子域不是核心域并且被用于整个业务系统,那么这个子域便是通用子域。[IDDD, P44]
通用子域:模型中有你想当然的部分。不可否认,它们确实是领域模型的一部分,但它们抽象出来的概念是很多业务都需要的。比如:各个行业(如:运输业、银行业或制造业)都需要某种形式的企业组织图。[DDD, P282]
这两段摘取为我们描述出什么是通用子域,从业务域的角度来看,通用子域也是一种业务域,和核心域一样。只是没有核心域的优先级高。因为核心域是整个系统的核心,整个系统因为核心域才具有竞争性。而通用子域只是那些提供的增强功能,比如电商系统中的商品收藏、店铺收藏、用户信息等等这些功能,它们确实是电商系统中的业务,但是并不是核心业务,这些增强性的业务就是通用子域。
注意:有些小伙伴会把通用子域与共享内核混淆,是因为共享内核的组成部分既有可能是核心域、支撑子域或者通用子域。
7、支撑子域
在业务域中,会有一些比较重要的业务,但却不是核心,那么它便是一个支撑子域。创建支撑子域的原因在于它们专注于业务的某个方面。它不像核心域在整个系统中那么重要,也不像通用子域。
8、开源电商
Mallfoundry 是一个完全开源的使用 Spring Boot 开发的多商户电商平台。它可以嵌入到已有的 Java 程序中,或者作为服务器、集群、云中的服务运行。
领域模型采用领域驱动设计(DDD)、接口化以及面向对象设计。
项目地址:gitee.com/mallfoundry…
- 总结 -
在一个业务域中,基本由三种类型的子域组成,分别是:核心域、通用子域和支撑子域。在分析业务域时,首先要做的事情是分析核心域,然后设计核心域,这样就能明确系统的最主要的功能。
围绕着这个核心域进行展开,慢慢添加其它子域,比如通用子域和支撑子域。在开发核心域和其它子域时,要为核心域分配最高的优先级,其它子域可以根据任务的多方面因素在分配优先级。
来源:掘金
链接:https://juejin.cn/post/6898450822771539981
之前,给大家发过三份Java面试宝典,这次新增了一份,目前总共是四份面试宝典,相信在跳槽前一个月按照面试宝典准备准备,基本没大问题。
《java面试宝典5.0》(初中级)
《350道Java面试题:整理自100+公司》(中高级)
《资深java面试宝典-视频版》(资深)
《Java[BAT]面试必备》(资深)
分别适用于初中级,中高级,资深级工程师的面试复习。
内容包含java基础、javaweb、mysql性能优化、JVM、锁、百万并发、消息队列,高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper、数据结构、限流熔断降级等等。
看到这里,证明有所收获
相关推荐
- 一个基于.Net Core遵循Clean Architecture原则开源架构
-
今天给大家推荐一个遵循CleanArchitecture原则开源架构。项目简介这是基于Asp.netCore6开发的,遵循CleanArchitecture原则,可以高效、快速地构建基于Ra...
- AI写代码翻车无数次,我发现只要提前做好这3步,bug立减80%
-
写十万行全是bug之后终于找到方法了开发"提示词管理助手"新版本那会儿,我差点被bug整崩溃。刚开始两周,全靠AI改代码架构,结果十万行程序漏洞百出。本来以为AI说没问题就稳了,结果...
- OneCode低代码平台的事件驱动设计:架构解析与实践
-
引言:低代码平台的事件驱动范式在现代软件开发中,事件驱动架构(EDA)已成为构建灵活、松耦合系统的核心范式。OneCode低代码平台通过创新性的注解驱动设计,将事件驱动理念深度融入平台架构,实现了业务...
- 国内大厂AI插件评测:根据UI图生成Vue前端代码
-
在IDEA中安装大厂的AI插件,打开ruoyi增强项目:yudao-ui-admin-vue31.CodeBuddy插件登录腾讯的CodeBuddy后,大模型选择deepseek-v3,输入提示语:...
- AI+低代码技术揭秘(二):核心架构
-
本文档介绍了为VTJ低代码平台提供支持的基本架构组件,包括Engine编排层、Provider服务系统、数据模型和代码生成管道。有关UI组件库和widget系统的信息,请参阅UI...
- GitDiagram用AI把代码库变成可视化架构图
-
这是一个名为gitdiagram的开源工具,可将GitHub仓库实时转换为交互式架构图,帮助开发者快速理解代码结构。核心功能一键可视化:替换GitHubURL中的"hub...
- 30天自制操作系统:第六天:代码架构整理与中断处理
-
1.拆开bootpack.c文件。根据设计模式将对应的功能封装成独立的文件。2.初始化pic:pic(可编程中断控制器):在设计上,cpu单独只能处理一个中断。而pic是将8个中断信号集合成一个中断...
- AI写代码越帮越忙?2025年研究揭露惊人真相
-
近年来,AI工具如雨后春笋般涌现,许多人开始幻想程序员的未来就是“对着AI说几句话”,就能轻松写出完美的代码。然而,2025年的一项最新研究却颠覆了这一期待,揭示了一个令人意外的结果。研究邀请了16位...
- 一键理解开源项目:两个自动生成GitHub代码架构图与说明书工具
-
一、GitDiagram可以一键生成github代码仓库的架构图如果想要可视化github开源项目:https://github.com/luler/reflex_ai_fast,也可以直接把域名替换...
- 5分钟掌握 c# 网络通讯架构及代码示例
-
以下是C#网络通讯架构的核心要点及代码示例,按协议类型分类整理:一、TCP协议(可靠连接)1.同步通信//服务器端usingSystem.Net.Sockets;usingTcpListene...
- 从复杂到优雅:用建造者和责任链重塑代码架构
-
引用设计模式是软件开发中的重要工具,它为解决常见问题提供了标准化的解决方案,提高了代码的可维护性和可扩展性,提升了开发效率,促进了团队协作,提高了软件质量,并帮助开发者更好地适应需求变化。通过学习和应...
- 低代码开发当道,我还需要学习LangChain这些框架吗?| IT杂谈
-
专注LLM深度应用,关注我不迷路前两天有位兄弟问了个问题:当然我很能理解这位朋友的担忧:期望效率最大化,时间用在刀刃上,“不要重新发明轮子”嘛。铺天盖地的AI信息轰炸与概念炒作,很容易让人浮躁与迷茫。...
- 框架设计并不是简单粗暴地写代码,而是要先弄清逻辑
-
3.框架设计3.框架设计本节我们要开发一个UI框架,底层以白鹭引擎为例。框架设计的第一步并不是直接撸代码,而是先想清楚设计思想,抽象。一个一个的UI窗口是独立的吗?不是的,...
- 大佬用 Avalonia 框架开发的 C# 代码 IDE
-
AvalonStudioAvalonStudio是一个开源的跨平台的开发编辑器(IDE),AvalonStudio的目标是成为一个功能齐全,并且可以让开发者快速使用的IDE,提高开发的生产力。A...
- 轻量级框架Lagent 仅需20行代码即可构建自己的智能代理
-
站长之家(ChinaZ.com)8月30日消息:Lagent是一个专注于基于LLM模型的代理开发的轻量级框架。它的设计旨在简化和提高这种模型下代理的开发效率。LLM模型是一种强大的工具,可以...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- mfc框架 (52)
- abb框架断路器 (48)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- tornado框架 (48)
- 前端框架bootstrap (54)
- orm框架有哪些 (51)
- 知识框架图 (52)
- ppt框架 (55)
- 框架图模板 (59)
- 内联框架 (52)
- cad怎么画框架 (58)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)