DDD领域驱动设计

什么是DDD?

Domin Driven Design,领域驱动设计。核心思想:通过领域驱动定义领域模型,能帮助我们确定业务边界技术边界

为什么需要DDD?

  1. 早期的领域模型:数据库,根据业务建立表,根据表生成对象,当业务发生变化,对应的表也需要发生变化,耦合度会随时间增加。仅仅适合瀑布式开发,需求较为恒定。而现在更多的是使用敏捷开发,版本在不断变更,也就是需求也在不断的变更,整个阶段都是位于实验阶段,没有需求是固定下来的。

  2. 微服务的拆分问题,如果使用SOA的方式,拆分的太粗,比如订单、库存、商品;如果使用更细粒度的拆分,有可能出现上百个微服务,这些服务的管理将会变得很困难。

DDD 通过确定业务边界、技术边界可以很好的解决上述问题。但是ddd通常对架构师的技术能力以及业务能力要求很高,对其他角色的要求也很高,并且需要项目具有一定的体量。

DDD的落地大致可以归结为三个步骤:

  1. 概念设计

  2. 逻辑设计

  3. 物理设计

领域驱动进行边界定义的方式共有两个部分:

  1. 战略设计,从业务角度出发,建立业务模型,划分业务边界

    1. 领域设计

    2. 子域设计

    3. 通用语言定义

    4. 限界上下文

  2. 战术设计,根据业务模型进行技术实现,完成软件开发以及落地

    1. 定义领域模型

不适合DDD的应用场景:

  1. 频繁你的进行战略改动(规模较小的场景下,老板可能频繁的更改战略目标)

战略设计

领域

一个问题域,只要在同一个领域,那问题域就相同。

比如,传统电商的领域问题可以大致分为

  • 订单

  • 商品

  • 物流

绝不会涉及到的问题:

  • 出行

  • 政法

有可能设计到的问题:

  • 社交电商,仍然是电商属性

子域

一个领域的业务可能过于复杂,可以将领域拆分为多个子域。比如仍然以传统电商为例,他的子域可以有:

  • 订单

  • 商品

  • 物流

  • 仓储

  • 社交电商

根据每个领域的业务,对子域进一步进行划分:

核心子域

核心领域是指整个业务系统的核心,所有业务都要围绕着核心业务域展开。

如何明确业务核心:

  1. 精炼业务域,将某一处剔除,核心业务还能正常进行,那么经过持续精炼就可以得到核心子域

如何精炼业务域:

  1. 领域愿景模型,也就是立项的目的是什么

  2. 突出核心,留文档

  3. 内聚机制,核心业务内聚在一起

  4. 分离的核心,非核心业务与核心业务分离,比如支付和支付优惠,核心支付功能如果没有支付优惠也可以正常进行

  5. 抽象核心

举例,虽然同样都是电商领域,他们的核心子域不同:

  • 淘宝 C2C(卖家卖出去,卖家买出来,主要做中间的交易保证)

  • 京东 B2C(卖家是京东,主要做口碑,所以产品质量好)

  • 苏宁 (线下选货,线上卖货)

通用子域

整个领域都能用到的子域,比如

  • 认证授权

支撑子域

是不包含核心竞争力的功能,也不包含通用的功能,但是优势必须的支撑。以电商为例:

  • 限时秒杀活动,支撑增加订单成交

通用语言

通用语言:能够正确的、简单地、清晰的表达业务。并让项目参与人员都能够达成共识的语言,降低人员之家能沟通成本。

限界上下文

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

战术设计

领域模型(domain model)

领域模型是对领域内的概念类或显示世界中对象的可视化表示,也就是业务对象模型,用于描述业务对象之间的引用关系。

业务对象主要分为三种:

  1. 业务角色,每个角色都有对应的职责,比如收银员拥有计算商品价格、收钱、找零、退换货的职责

  2. 业务实体,表示的是与业务角色交互所需要的可交付的工作、资源、事件,比如商品、发票

  3. 业务实例,表示的是一整套的业务链路,包含业务角色以及业务实体,也就是业务角色与业务实体质检室如何执行工作流程

实现领域模型的四种方式

失血模型

  1. 优点:领域对象结构简单,只包含数据层与业务逻辑层两层

  2. 缺点:肿胀的业务代码难以维护,无法应对频繁修改的需求

贫血模型

  1. 固有行为:作为业务对象,一定具有的行为,比如人一定可以走路、睡觉

  2. 非固有行为:作为业务对象,不一定具有的行为,是变动的,比如人不一定可以敲代码、弹钢琴

  3. 固有行为一般不用进入持久层,非固有行为因为具有不确定性的,那么一般进入持久层

  4. 优点:层次结构清楚,各层级是单向依赖,对于只有少量业务的应用来说,使用起来非常自然(Spring),开发迅速简单

  5. 缺点:无法应对非常复杂的业务逻辑场景,比如订单业务模型要顺带获取库存信息,而订单业务模型与库存业务模型不是包含关系

充血模型

  1. 优点:更加符合面向对象原则,业务逻辑层很薄,符合单一职责原则

  2. 缺点:职责很难划分,模型中包含大量的操作,将造成很多不必要的消耗

胀血模型

  1. 优点:建立了分层的架构,符合面向对象设计

  2. 缺点:取消了业务逻辑层,直接在Domain Object上封装事物以及授权,授权很多原本不属于这个领域对象的逻辑,增加了模型的不稳定性。

最后更新于