首页 > 其他分享 >理解DDD中的限界上下文

理解DDD中的限界上下文

时间:2022-12-17 19:11:45浏览次数:38  
标签:上下文 BC 二义性 桃子 线索 限界 DDD

限界上下文(英文:Bounded Context,简称BC)。从字面上就知道限界上下文(BC)有两层意思:

  • Bounded即有边界的,限界就是领域的边界;
  • Context即上下文相关的,上下文是指语义环境;

限界上下文的定义:用来封装通用语言领域对象,提供上下文环境,保证在领域之内的一些术语、业务相关对象等(通用语言)有一个确切的含义,没有二义性

二义性例子

例子:

在一个明媚的早晨,孩子起床问妈妈:“今天应该穿几件衣服呀?”
妈妈回答:“能穿多少就穿多少!”

那到底是穿多还是穿少呢?

如果没有具体的语义环境,还真不太好理解。

但是,如果你已经知道了这句话的语义环境,比如是:寒冬腊月或者是炎炎夏日,那理解这句话的涵义就会很容易了。

所以语言离不开它的语义环境。

大杂烩的业务概念歧义

再举个例子:

  • 营销部门通过投放广告和参加展会能留下线索
  • 客服部门通过在线接待系统回到陌生访客的问题也能留下线索
  • 销售部门通过跟进线索从而发现商机。

这里其实出现了三个『线索』概念,看起来都是在讲线索,但其实它们各有各的不同。

  • 营销部门的线索可能只是对你的产品有点兴趣,只是留下了一个联系方式(不知道能不能联系上);
  • 客服部门的线索有些只是网民访问你的网站留下来的记录,可能连联系方式也没留下;
  • 销售部门面对的线索是能联系的上,甚至对产品有一定购买意向;

如果把这三个线索用一个业务概念来表达,那么不同部门人员之间的沟通往往会出现概念之间的歧义甚至冲突,系统的实现也会变得复杂且容易变化

BC就是用来区分这种特殊性的。通过BC把有歧义的业务概念隔离开,各自回到各自的BC中,在BC里面形成统一的命名。

语言交流层面如果发现障碍和歧义也侧面反映了BC划分的不正确性。

同一个对象在不同阶段有不同涵义

举个例子:

电商领域的商品在不同的阶段有不同的术语,在销售阶段是商品,而在运输阶段则变成了货物。

同样的一个东西,由于业务领域的不同,赋予了这些术语不同的涵义和职责边界,这个边界就可能会成为未来微服务设计的边界。

这个边界定义了模型的适用范围,使团队所有成员能够明确地知道什么应该在模型中实现,什么不应该在模型中实现。

限界上下文拆分多细?

还是要回到定义:为了避免通用语言领域对象有二义性时用限界上下文。

而领域对象是要看你要解决什么问题的?

  • 对电商来说,关注的销售商品,这时候桃子也就分不同类别、不同级别的就可以了(好的定价更高)。
  • 而长途运输场景下,则是看一箱箱的桃子。
  • 上面这两个场景都不会看一个个具体的桃子。拆分太细对解决问题没有任何帮助,反而增加相关成本。
  • 当桃子中有坏桃子,我们需要挑出来扔掉时,我们才需要一一识别。

总结

通过上下文环境,确保领域内的术语、业务相关对象没有二义性,这就是限界上下文。

标签:上下文,BC,二义性,桃子,线索,限界,DDD
From: https://www.cnblogs.com/ghj1976/p/li-jieddd-zhong-de-xian-jie-shang-xia-wen.html

相关文章

  • jmeter做压测性能调优:SSL上下文切换导致SSL频繁握手【杭州多测师_王sir】【杭州多测师
    一、问题背景在使用 JMeter 压测时,发现同一后端服务,在单机 500 并发下,HTTP 和 HTTPS 协议压测 RT 差距非常大。同时观测后端服务各监控指标水位都很低,因此怀疑性......
  • DDD学习笔记----基础知识(2)
    聚合:高内聚,低耦合。聚合内实体可以协同工作,聚合外实体可以低耦合工作。关系紧密的实体放到一个聚合中,每个聚合中有一个实体作为聚合根,所有对于聚合内对象的访问都能通过聚......
  • DDD的领域与核心域
    领域和子域领域(domain):需要讨论的问题范围,称为域、领域或问题域。子域(subdomain):对于域进行不同纬度切分相对内聚的单元。比如:电商业务涉及订单、库存、营销子域等。比如:......
  • 模型驱动设计的构造块(上)——DDD
    为了保证软件实践得简洁并且与模型保持一致,不管实际情况如何复杂,必须运用建模和设计的实践。某些设计决策能够使模型和程序紧密结合在一起,互相促进对方的效用。这......
  • DDD Domain-Driven Design
    商品中心答疑​​http://www.nmalls.com/public/help.htm​​阿里高级技术专家方法论:如何写复杂业务代码?​​https://mp.weixin.qq.com/s/pdjlf9I73sXDr30t-5KewA​​以商品......
  • threading.local、请求上下文执行流程
    多app应用fromflaskimportFlaskfromwerkzeug.servingimportrun_simplefromwerkzeug.middleware.dispatcherimportDispatcherMiddlewareapp01=Flask('app01......
  • 【Python内置函数map和zip+上下文管理器及其实现原理】
    一、map作用map:自动将可迭代对象遍历,把遍历出来的数据,当成参数传入map第一个接口的函数中,将函数执行的结果,放到一个迭代器中进行返回语法map(function,iterable,...)第......
  • 【Flask】数据库连接池,信号,flask请求上下文
    目录1.数据库连接池1.1如果把conn做成全局1.2如果在每个视图函数中建立链接1.3借助于第三方模块,实现数据库连接池1.4pool.py1.5flask测试1.6压力测试2.wtfroms(了......
  • DDD中的 充血模型 和 贫血模型
    领域驱动设计,关键是要做领域建模,领域建模的结果叫领域模型。领域模型还有一个名字叫充血模型,以与贫血模型这个名称做对应。贫血领域模型的基本特征是:它第一眼看起来还真......
  • libco 源码剖析(1): 协程上下文切换之 32 位
    libco源码剖析(1):协程上下文切换之32位相关背景资料关于汇编语言及内存布局相关基础,参看​​参考文献[0]​​,​​参考文献[1]​​32位协程上下文结构如下://coct......