8个基础概念

核心概念

1. 领域(Domain)

领域指的是业务所涉及的范围和边界。比如电商系统,它的领域涵盖商品管理、订单管理、用户管理等。不同领域有不同的业务规则和知识体系。

2. 子域(Subdomain)

大的领域可以细分为多个子域。例如在电商系统中,订单管理子域负责处理订单的创建、支付、发货等业务;商品管理子域则专注于商品的上架、下架、库存管理等。子域分为核心子域、支撑子域和通用子域。

  • 核心子域:是业务的核心竞争力所在,对业务成功至关重要。在电商系统中,订单管理子域可能就是核心子域。
  • 支撑子域:用于支撑核心业务,但不具备独特的业务价值。比如电商系统中的日志管理子域。
  • 通用子域:是多个业务系统都可能用到的通用功能,如权限管理子域。

3. 限界上下文(Bounded Context)

限界上下文是一个明确的边界,在这个边界内,模型的含义是明确且一致的。不同的限界上下文可能对同一个概念有不同的理解。例如,在电商系统的订单管理限界上下文中,“商品” 可能主要关注商品的价格、库存等信息;而在商品管理限界上下文中,“商品” 更关注商品的描述、分类等信息。

4. 实体(Entity)

实体是具有唯一标识,且在生命周期中会发生状态变化的对象。在电商系统中,“订单” 就是一个实体,每个订单都有唯一的订单编号,并且在订单的创建、支付、发货等过程中,订单的状态会不断变化。

5. 值对象(Value Object)

值对象没有唯一标识,它主要通过属性来描述某个概念。例如在电商系统中,“地址” 可以作为一个值对象,它由省、市、街道等属性组成,主要用于描述用户的收货地址,不具备唯一标识。

6. 聚合(Aggregate)

聚合是一组相关的实体和值对象的集合,它有一个根实体(Aggregate Root)。聚合的边界由根实体来控制,外部对象只能通过根实体来访问聚合内部的对象。在电商系统中,“订单” 聚合可能包含订单实体(根实体)、订单项实体和收货地址值对象。外部系统只能通过订单实体来访问订单项和收货地址。

7. 仓储(Repository)

仓储用于管理聚合的生命周期,负责聚合的持久化和查询。在电商系统中,订单仓储负责将订单聚合保存到数据库中,以及从数据库中查询订单聚合。

8. 服务(Service)

当某个操作不能简单地归属于某个实体或值对象时,可以使用服务。服务通常处理跨多个实体或聚合的业务逻辑。例如在电商系统中,订单支付服务负责处理订单的支付逻辑,它可能涉及到订单实体、用户账户实体等多个对象。

DDD 开发流程

一般来说,DDD 的开发流程包括以下几个步骤:

  1. 战略设计:识别领域、子域和限界上下文,明确业务的核心和边界。
  2. 战术设计:在限界上下文内设计实体、值对象、聚合、仓储和服务等模型。
  3. 代码实现:根据设计模型进行代码开发,确保代码与设计的一致性。
  4. 持续演进:随着业务的发展,不断对领域模型进行调整和优化。

通过以上这些基础概念和开发流程,DDD 可以帮助开发团队更好地理解业务需求,设计出更加符合业务逻辑的软件系统。

三层架构mvc

1.业务接口,modula,api

2.业务逻辑,vo ,service

3.数据访问,po,dao,mapperxml

ddd四层架构

1.用户接口,api,dto

2.应用层,application service

3.领域层

4.基础层

ddd分层架构

参考:DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构-阿里云开发者社区

面向对象设计,数据行为绑定,告别贫血模型;降低复杂度,分而治之;优先考虑领域模型,而不是切割数据和行为;准确传达业务规则,业务优先;代码即设计;它通过边界划分将复杂业务领域简单化,帮我们设计出清晰的领域和应用边界,可以很容易地实现业务和技术统一的架构演进;领域知识共享,提升协助效率;增加可维护性和可读性,延长软件生命周期;中台化的基石。

消除信息不对称;常规 MVC 三层架构中自底向上的设计方式做一个反转,以业务为主导,自顶向下的进行业务领域划分;将大的业务需求进行拆分,分而治之。

【DDD】全网最详细2万字讲解DDD,从理论到实战(代码示例)_ddd代码实例-CSDN博客

贫血模型和充血模型

贫血模型

贫血模型具有一堆属性和set get方法,存在的问题就是通过pojo这个对象上看不出业务有哪些逻辑,一个pojo可能被多个模块调用,只能去上层各种各样的service来调用,这样以后当梳理这个实体有什么业务,只能一层一层去搜service,也就是贫血失忆症,不够面向对象。

充血模型

比如如下user用户有改密码,改手机号,修改登录失败次数等操作,都内聚在这个user实体中,每个实体的业务都是清晰的,就是充血模型,充血模型的内存计算会多一些,内聚核心业务逻辑处理。 说白了就是,不只是有贫血模型中setter getter方法,还有其他的一些业务方法,这才是面向对象的本质,通过user实体就能看出有哪些业务存在。

作者 meiyoufan

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注