领域和子域

在很长一段时间里,我们认为技术是主导项目成功的关键因素,这种关键因素通常表现在项目使用的编程语言、框架、架构(如:分层架构)、中间件、数据库等等方面(如:生态)。但技术真的是项目成功的关键因素吗?

在一个软件项目里除了技术层面的这部分,我们最主要的事情是实现业务。实现业务其实是在实现所在业务领域中所需要的业务。技术也是一个领域,称之为技术领域。领域驱动设计中的领域是指的业务领域。

大多数的技术人员对技术领域中的知识比较感兴趣(狂热),因为这能够使得自己在技术方面有一些前沿性和探索性的实践。然而对于业务领域中的知识就显得比较暗淡一些。

当项目的进展随着对业务领域的深入,大家又开始为各种曾经没有分析到的需求忙的焦头烂额。这个时候对技术领域的探索也基本成熟。接着又一轮新技术的出现,使得大家又开始对新技术进行探索实践,并试图使用新技术来解决掉以前遗留下来的没有解决的新需求,此时就出现了所谓的“全盘重构”。正是这种周而复始的对技术领域的不断探索,使我们对业务领域里重要的核心知识被埋没。但有一天我们认识到业务领域十分重要时,你可能已经不在这个业务领域中探索技术了。

让一个技术水平较高的技术人员去深入研究分析领域中的业务是需要勇气的,这种勇气不是来自对未知的复杂业务领域的挑战而是让自己不在无时无刻沉静在对技术探索的环境中。

这要求一些技术人员需要花费一些时间去深入到业务领域中去分析领域知识并最终形成领域模型。

问题:领域中的业务是由什么组成的呢?

回答:需求。

问题:需求又是有什么组成的呢?


什么是领域?

百度百科对领域的解释:

  • 学术思想或社会活动的范围。

  • 具体指一种特定的范围或区域。

《领域驱动设计》中领域指的是一个特定的业务范围,大家在这个业务域范围内开展工作。

领域这个词承载了太多的含义。在大多数人的理解中会使用领域代替行业、项目或者系统,这样会使一些人认识领域就是行业、项目或者系统。在认识领域时一定要注意所指的业务域,行业、项目或系统都不能准确地表达领域所指的业务域。

  • 一个系统可能由一个领域或者多个领域组成。如果一个系统是由一个领域组成时,这会给大家一种错觉。


子域(Subdomain)

在初识子域概念时,可能会认为子域与领域的是父子关系。其实他们并不是父子关系,而是包含关系。当多个业务域(领域)的组合形成了一个更大的业务域(领域)时,其中每一个领域(业务域)是这个更大的业务域的一部分,每一个业务域相对于这个更大地业务域称之为这个更大领域的子业务域,简称子域。组合而成的这个更大地业务域统称为领域。

补充:领域与子域的关系更好的描述是饼状图,领域相当于整个饼状图,子域相当于这个饼状图中的某一个块。

这是一个有关“零售商在线销售产品”的例子,来源于《实现领域驱动设计》。

把零售商中的所有业务看做成一个领域(业务域),把这个整体业务域中的每一个业务域看做成子域。所以这个零售商业务域中包括:产品目录子域、订单子域、物流子域、发票子域、库存子域等。

这张业务域图已经为我们呈现了一个近似完整地子域划分图。那么这张图是如何完成划分的呢?

对一个业务域划分子域时,往往会把一个领域划分为:核心域、支撑子域、通用子域三种类型的子域集。其中核心域是整个业务域(领域)的核心,支撑子域和通用子域完成非核心的业务。不管怎么样,在对一个整体业务域进行划分时,首先要做的是划分核心域。

注意:三种类型的子域不是三个类型的子域,每种类型的子域数量可能有多个。


核心域(Core Domain)

核心域是整个业务系统的核心,所有的业务都要围绕着核心业务域展开。如何明确核心域呢?

通常明确核心的方式是精炼业务域。精炼是一个持续的过程,具体来说有以下几种方式:

  • 领域愿景说明(Domain Vision Statement)

  • 突出核心(Highlighted Core)

  • 内聚机制(Cohesive Mechanism)

  • 分离的核心(Segregated Core)

  • 抽象核心(Abstract Core)

领域愿景说明(Domain Vision Statement)

这部分的内容在《领域驱动设计》中表达地非常简洁,没有必要再做过度的解读。具体内容如下:

并且还给出了两个“领域愿景说明”的示例:

在这两个示例中提到的模型并不是一个领域模型,而是一组领域模型。更具体地来说是要告诉我们这一组领域模型要解决什么问题,而这个要解决的问题正是由客户来提出的最需要的那个功能,这个最需要的功能正是业务域中的核心。

为业务域编写“领域愿景说明”是有必要的,因为它可以让整个团队的人员都能明确什么是核心域。正是明确了核心域,才可以使整个团队朝着统一地方向前进。


突出核心(Highlighted Core)

我们通过“领域愿景说明”可以明确什么是核心域,但这是从一个较为宽泛的角度对核心域进行说明的。我们明确核心域的目的是为了形成核心领域模型,此时我们需要突出核心。

突出核心域中的领域模型有两种方式:

  • 精炼文档

  • 标明核心(Core)

精炼文档要做的事情是创建一个最核心的概念对象的清单文档。

标明核心(Core) 要做的事情是从一个完整的领域模型文档中标记出最核心的领域模型。

分离的核心(Segregated Core)

分离的核心的主要目的有两个:

  • 将核心域中的非核心元素(模型)分离出去。

  • 将非核心域中的核心元素(模块)移动到核心域中。

这两个目的都是为了让核心域更加清晰和增强核心域的内聚性。

有关核心域的更多内容请阅读《领域驱动设计》中的第十五章,其中非常详细地阐述了如何明确核心域和实现核心域。

《实现领域驱动设计》中通过问题空间和解决方案空间对核心域做了更直接的说明:

  • 问题空间是领域的一部分,对问题空间的开发将产生一个新的核心域。[IDDD, P48]

核心域的范围并不一定是一次就能确认的,可能需要迭代很多次,每一次都有可能扩大或缩小。


通用子域

如果一个子域不是核心域并且被用于整个业务系统,那么这个子域便是通用子域。[IDDD, P44]

通用子域:模型中由你想当然的部分。不可否认,它们确实是领域模型的一部分,但它们抽象出来的概念是很多业务都需要的。比如:各个行业(如:运输业、银行业或制造业)都需要某种形式的企业组织图。[DDD, P282]

这两段摘取为我们描述出什么是通用子域,从业务域的角度来看,通用子域也是一种业务域,和核心域一样。只是没有核心域的优先级高。因为核心域是整个系统的核心,整个系统因为核心域才具有竞争性。而通用子域只是那些提供的增强功能,比如电商系统中的商品收藏、店铺收藏、用户信息等等这些功能,它们确实是电商系统中的业务,但是并不是核心业务,这些增强性的业务就是通用子域。

注意:有些小伙伴会把通用子域共享内核混淆,是因为共享内核的组成部分既有可能是核心域、支撑子域或者通用子域。


支撑子域

在业务域中,会有一些比较重要的业务,但却不是核心,那么它便是一个支撑子域。创建支撑子域的原因在于它们专注于业务的某个方面。它不像核心域在整个系统中那么重要,也不像通用子域。


开源电商

Mallfoundry 是一个完全开源的使用 Spring Boot 开发的多商户电商平台。它可以嵌入到已有的 Java 程序中,或者作为服务器、集群、云中的服务运行。

  • 领域模型采用领域驱动设计(DDD)、接口化以及面向对象设计。

项目地址:gitee.com/mallfoundry…



总结

在一个业务域中,基本由三种类型的子域组成,分别是:核心域、通用子域和支撑子域。在分析业务域时,首先要做的事情是分析核心域,然后设计核心域,这样就能明确系统的最主要的功能。围绕着这个核心域进行展开,慢慢添加其它子域,比如通用子域和支撑子域。在开发核心域和其它子域时,要为核心域分配最高的优先级,其它子域可以根据任务的多方面因素在分配优先级。


http://www.taodudu.cc/news/show-1178713.html

相关文章:

  • 高可用:异地多活
  • 领域驱动设计(DDD)前夜:面向对象思想
  • 技术转管理?这些“坑”你要绕道走
  • 温昱:架构实践全景图
  • 因为一次宕机,终于搞透了 Kafka 高可用原理!
  • DDD专家张逸:复杂与架构演进的关系
  • 这 3 种 DDD 分层架构的模式,你掌握了么?
  • 百度十亿级流量的搜索前端,是怎么做架构升级的?
  • Jartto: 如何成为一名合格的技术面试官?
  • 梁鑫:重构 - 在美股行情系统的实践
  • 阿里晓斌:如何做好技术 Team Leader?
  • 深入解读 MySQL 底层原理,让性能“飞起来”的方法总结
  • 原创精华:剖析亿级请求下的多级缓存
  • 天鼎:一个技术人在世界读书日的遐想
  • 梁鑫:美股交易架构实践
  • 代码重构技巧宝典,学透本篇就足够了!
  • 图解 Kafka,看本篇就足够啦
  • 万字长文精华之数据中台构建五步法
  • 微服务架构设计总结实践
  • 重构 - 美股行情系统APP推送改造
  • 火热报名|5月15日线下沙龙上海站——“大促活动场景下的质量保障”主题
  • 如何从 0 到 1,搭建一个完整的 Kubernetes 集群?
  • 追根溯源 - 数据中台概念的起源
  • 阿里云MVP:如何设计实现一个通用的微服务架构?
  • 系统“烂”怎么办?请看资深专家拆分改造实践
  • 凭运气接来的项目,怎样凭本事搞砸?
  • 架构概述之架构演化、模式与核心要素
  • 保险极客CTO叶晖谈企业团体险的星辰大海
  • 彭荣新:喜马拉雅自研网关架构演进过程
  • 八戒科技服务技术负责人鸿鹄真人:做好技术负责人的4个关键特质

领域驱动设计(DDD):领域和子域相关推荐

  1. 领域驱动设计(DDD)实践之路(四):领域驱动在微服务设计中的应用

    这是"领域驱动设计实践之路"系列的第四篇文章,从单体架构的弊端引入微服务,结合领域驱动的概念介绍了如何做微服务划分.设计领域模型并展示了整体的微服务化的系统架构设计.结合分层架构. ...

  2. 领域驱动设计(DDD)-基础思想

    一.序言 领域驱动设计是一种解决业务复杂性的设计思想,不是一种标准规则的解决方法.在领域驱动设计理念上,各路大侠的观点也是各有不同,能力有限.欢迎留言讨论. 二.领域驱动设计 DDD是什么 wiki释 ...

  3. 领域驱动设计 DDD

    一.序言 领域驱动设计是一种解决业务复杂性的设计思想,不是一种标准规则的解决方法.在领域驱动设计理念上,各路大侠的观点也是各有不同,能力有限.欢迎留言讨论. 二.领域驱动设计 DDD是什么 wiki释 ...

  4. [理论]领域驱动设计 DDD 是啥,cqrs是啥

    父文章 如何成为一名架构师,架构师成长之路_个人渣记录仅为自己搜索用的博客-CSDN博客_架构师成长之路 [落地版]领域驱动落地 [理论版]领域驱动设计DDD 代码框架 · 语雀 子文章 如何写可维护 ...

  5. 领域驱动设计DDD(一)

    领域驱动设计DDD(一) 一.何为领域驱动设计 二.模型驱动设计 (一)分层架构 (二)实体 (三)值对象 (四)服务 (五)模块 (六)聚合 (七)工厂 (八)资源库 三.面向深层理解的重构 (一) ...

  6. 领域驱动设计(DDD:Domain-Driven Design)

    领域驱动设计(DDD:Domain-Driven Design) Eric Evans的"Domain-Driven Design领域驱动设计"简称DDD,Evans DDD是一套 ...

  7. python 全栈开发,Day116(可迭代对象,type创建动态类,偏函数,面向对象的封装,获取外键数据,组合搜索,领域驱动设计(DDD))...

    昨日内容回顾 1. 三个类 ChangeList,封装列表页面需要的所有数据.StarkConfig,生成URL和视图对应关系 + 默认配置 AdminSite,用于保存 数据库类 和 处理该类的对象 ...

  8. 领域驱动设计 (DDD)实例分析

    本文结合实例来分析下领域驱动设计 (DDD) 文章目录 啥是DDD 啥是驱动 DDD误解 啥时候用 啥是复杂 具体解决啥 为啥会耦合 咋解决耦合 咋做分治 咋做分界 模块 分层 咋落地 本文小结 啥是 ...

  9. 领域驱动设计DDD之读书笔记

    查看文章   领域驱动设计DDD之读书笔记  转载原地址:http://hi.baidu.com/lijiangzj 2007-08-17 16:53 一.当前Java软件开发中几种认识误区 Hibe ...

  10. JPA实现领域驱动设计(DDD) 中值对象的持久化

    文章目录 什么是DDD值对象? 实现方式 单一值对象 改变表中映射的字段的名称 根据值对象的单一属性查询或多属性的动态查询 多个值对象 根据值对象的单一属性查询或多属性的动态查询 什么是DDD值对象? ...

最新文章

  1. 查看服务器Smart Array卡
  2. CentOS 6.5 64位 安装Nginx, MySQL, PHP
  3. 实现AIDL接口的Binder连接池
  4. 计组之数据运算:8、c语言之强制类型转化、数据的存储与排序(大小端、字节对齐)
  5. C#LeetCode刷题之#622-设计循环队列​​​​​​​(Design Circular Queue)
  6. hive 创建外部表产生java_(一)Hive表(管理表、外部表)的创建规则
  7. python连接mysql用哪个模块_pymysql模块使用---Python连接MySQL数据库
  8. 随想录(高质量代码开发)
  9. 从月薪 1000 到 2W+,文科生如何逆袭成为大厂程序员?
  10. 前端同时访问后端同一接口两次,但只有后面那次请求有返回数据
  11. 单片机(ISIS 7 Professional):交通灯代码项目
  12. outlook如何设置qq邮箱服务器,qq邮箱关联outlook
  13. 矢量地图质量检查现状与需求分析
  14. Matlab版本svm工具箱,matlab libsvm工具箱
  15. 工作两三年了,整不明白架构图都画啥?
  16. 微信公众号发红包 php,php微信公众号接口实现发红包的方法
  17. SwiftUI 绘制刻度时钟表盘(自定义组件教程含源码)
  18. 关于Javascript的学习心得
  19. HG30A-2多功能校准仪
  20. 小傻蛋的妹妹跟随小甲鱼学习Python的第五节005

热门文章

  1. linux系统月初月末,Linux last显示系统开机以来获是从每月初登入者的讯息命令详解...
  2. 注册表改win 7更新服务器,Win7 SP1 修改注册表升级的说明事项
  3. android日志打印机制,Android4_使用Log打印
  4. springboot集成druid_绝了!Dataway让SpringBoot不在需要Controller、Service、DAO等了
  5. 输入文字加下划线_Word中被很多职场人士忽略的输入技巧为什么插入的文字会后移...
  6. abstract类中不可以有private的成员_C++ 类:声明成员函数与实现
  7. 用python做一张图片_如何用python下载一张图片
  8. 测试学开发——第一课:java学习路程
  9. 9-3:C++多态之多态的实现原理之虚函数表,虚函数表指针静态绑定和动态绑定
  10. python numpy中数组.min()