导航

理解DDD中的限界上下文

Posted on 2022-12-17 19:08  蝈蝈俊  阅读(407)  评论(0编辑  收藏  举报

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

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

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

二义性例子

例子:

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

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

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

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

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

大杂烩的业务概念歧义

再举个例子:

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

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

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

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

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

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

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

举个例子:

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

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

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

限界上下文拆分多细?

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

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

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

总结

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