本文摘自《程序员必备的思维能力》

限界上下文

任何问题都是有边界的,这个问题的边界也叫这领域边界。也就是说,我们要对一个问题进行分析或者建模,一定是在一个特定的上下文(Bounded Context:限界上下文)下,而不可能是漫无边际的乱讨论。

因为语言的多意性和灵活性,会导致同一个概念,在不同的上下文呈现出不同的语义,包含不同的属性。就像Apple,在水果卖场这个上下文下,它代表的是水果;而在手机卖场,它代表的是iPhone。同一个词语因为上下文不一样,其含义完全不一样。

限界上下文告诉我们,同一个概念,不必总是对应于一个单一模型,也可以对应于多个模型。用限界上下文明确模型要解决的问题,可以保持每个模型的清晰。限界上下文是领域模型的边界,也就是领域知识的边界。和上下文主题紧密相关的模型内聚在上下文内,而其他模型被会分到其他限界上下文中。限界上下文内的领域知识是高内聚低耦合的。

比如商品作为电商业务最核心的要素,贯彻整个商业活动始终。在庞大的电商系统做领域化拆分之后,商品的概念也是渗透到各个子域当中,售卖的是“商品”,营销的主体是“商品”,下单是针对“商品”的订单,仓库中存的是“商品”,履约是“商品”的送达等等。然而这些“商品”在不同的上下文下,表达的语义和内涵是不一样的

上下文映射

每一个上下文都有一套自己的“语言”,如果在该领域要使用其它领域的概念,我们就需要一个“翻译器”,这个在不同领域之间进行概念转化、信息传递的动作就叫上下文映射(Context Mapping)。上下文映射主要有两种解决方案:共享内核和防腐层。

共享内核

所谓的共享内核(Shared Kernel),是指把两个子域中共同的实体概念抽取出来,形成一个组件(java中的jar包),然后通过内联(inline)的方式,分别被不同的子域使用。

还是以电商系统为例,商品域中的“商品”和售卖域中的“商品”虽然都叫商品,但是两者的属性是不一样的,比如在商品管理中,主要关注的是商品的产品属性和产品分类,主要是用来做商品管理,因为还没有上架销售,所以也就没有商家属性(sellerId)。而在售卖域,商品是用来面向消费者销售的,相比较商品域中的商品或者产品,它多了商家属性、售卖价格、营销属性、买点等更多的属性。

鉴于商品域和售卖域中的“商品”大部分属性都是相同的,我们可以考虑使用共享内核的方式。如下图所示,将共同部分抽取成一个组件,由商品域和售卖域共享,这种方式的好处是最大程度的代码复用和能力共享,然而坏处也很明显,即高耦合:任何对于“共享内核”的改动都要小心翼翼的协调两个领域的技术团队,且会影响两个领域。说实话,这个副作用有点伤不起,所以在实践中,更推荐的上下文映射方法是防腐层。

防腐层

所谓的AC(Anti-Corruption:防腐层),在一个领域中,如果需要使用其它领域的信息,可以通过AC进行防腐和转义。实际上,在微服务的环境下,服务调用是一个普遍的诉求,因为没有一个服务是孤立的,都需要借助其它服务提供的数据,共同完成业务活动。

同样是上面的电商场景,如果采用AC的方式进行上下文映射的话,我们需要在售卖域中建一个AC模块。因为售卖域在商品上架销售的时候,需要从商品域获取商品的信息,在分布式环境下,这种信息获取可能是RPC调用,也可能是REST,通讯协议可能不一样,但并妨碍信息的载体都是商品DTO(Data Transfer Object)。AC的作用就是要把外域的DTO转义成自己领域内的概念。

这样做虽然有一定的代码重复,商品信息在商品域和售卖域都有一定的重复。但是解耦非常彻底,售卖域的AC起到了“防腐”的作用,商品域的任何变化并不会直接影响到售卖域,双方都拥有了更大的自主权和灵活度。系统架构就是这样,我们永远要在重复(Duplication)和复用(Reuse)之间去一个折中,进行权衡。关于更多AC的设计细节,我会在COLA一章中进行更加详细的介绍,这里就不多说了。

关于上下文映射看这篇就够了相关推荐

  1. Docker入门实战看这篇就够了(最新详细以及踩过的坑)

    Docker入门实战看这篇就够了 前言 初识 是什么 容器与虚拟机 能干什么 去哪玩 安装 先决条件 查看自己的内核 安装所需的软件包(支持devicemapper存储类型) 设置镜像的仓库 设置yu ...

  2. React入门看这篇就够了

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所 ...

  3. uiautomation遍历windows所有窗口_万字长文!滑动窗口看这篇就够了!

    大家好,我是小浩.今天是小浩算法 "365刷题计划" 滑动窗口系列 - 整合篇.之前给大家讲解过一些滑动窗口的题目,但未作系统整理. 所以我就出了这个整合合集,整合工作中除了保留原 ...

  4. Spring Cloud入门,看这篇就够了!

    点击▲关注 "中生代技术"   给公众号标星置顶 更多精彩 第一时间直达 概述 首先我给大家看一张图,如果大家对这张图有些地方不太理解的话,我希望你们看完我这篇文章会恍然大悟. 什 ...

  5. 面试率 90% 的JS事件循环Event Loop,看这篇就够了!! !

    面试率 90% 的JS事件循环Event Loop,看这篇就够了!! ! 事件循环(Event Loop)大家应该并不陌生,它是前端极其重要的基础知识.在平时的讨论或者面试中也是一个非常高频的话题. ...

  6. 99. 中高级开发面试必问的Redis,看这篇就够了

    中高级开发面试必问的Redis,看这篇就够了! 一.概述 二.数据类型 STRING LIST SET HASH ZSET 三.数据结构 字典 跳跃表 四.使用场景 计数器 缓存 查找表 消息队列 会 ...

  7. Java应用系统监控看这篇就够了

    Java应用系统监控看这篇就够了 文章目录 业务背景 系统监控发展历程 技术方案 日志监控技术方案 Grafana+阿里云SLS日志服务 分布式链路追踪技术方案 阿里云jaeger方案 开源框架sky ...

  8. 一文详解JavaBean 看这篇就够了

    一文详解JavaBean 看这篇就够了 JavaBean的历史渊源 JavaBean的定义(通俗版) JavaBean应用 < jsp:useBean > < jsp:getProp ...

  9. .NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了

    写在前面 上篇文章我们讲了如在在实际项目开发中使用Git来进行代码的版本控制,当然介绍的都是比较常用的功能.今天我再带着大家一起熟悉下一个ORM框架Dapper,实例代码的演示编写完成后我会通过Git ...

最新文章

  1. 荷花旁的浪漫,优雅了谁的光年,清纯少女芭蕾写真
  2. Golang协程goroutine和管道channel结合案例
  3. Windows——FTP命令匿名登录解决方案
  4. 如何使用 AutoPilot 对作业自动调优?
  5. mysql中创建唯一索引的关键字_mysql中唯一索引的关键字是什么
  6. 存储管理的页面置换算法
  7. 炒菜机器人放食材的顺序_珠江新城有了首家机器人餐厅,40多台机器人提供服务...
  8. oracle报609,ORA-609 错误分析及解决方法
  9. 5、提交报告获取服务、状态报告获取服务 -功能详细设计 --短信平台
  10. 海康威视复赛题 --- 算法说明书
  11. word中脚注和尾注的处理
  12. java的栈区 堆区存放什么_简单整理java中的栈内存, 堆内存是什么?
  13. 4键电子手表说明书_电子表通用说明书
  14. python爬取豆瓣电影top250_【Python3爬虫教程】Scrapy爬取豆瓣电影TOP250
  15. 自动化测试概述/自动化工具
  16. 在程序员上看到《企业开发新思维:COID模式简述》,有感
  17. 转:动态规划题目分类
  18. 一种互联网项目开发方式
  19. iOS开发常用国外网站清单
  20. 美国密歇根大学指数不及预期,欧元低位反弹

热门文章

  1. Opcode 缓存介绍以及使用 Opcache
  2. Nginx+Tomcat实现负载均衡、动静分离集群部署
  3. 深度学习项目:男女性别识别【附完整源码】
  4. 传iPhone8将搭载裸眼3D技术
  5. 如何解决浏览器提示“您与此网站之间建立的连接不安全”
  6. 教你下载微信小程序里的视频
  7. Swagger官网与官方文档
  8. java获取微信公众号二维码
  9. 苹果软件测试的电池损耗准确,电池不耐用?教你如何检测iPhone电池损耗!
  10. 语义分割--(DFN)Learning a Discriminative Feature Network for Semantic Segmentation