DDD是领域驱动设计,是Eric Evans于2003年提出的,离现在有19年。
当软件越来越复杂,实际开发中,大量的业务逻辑堆积在一个巨型类中的例子屡见不鲜,代码的复用性和扩展性无法得到保证。为了解决这样的问题,DDD提出了清晰的分层架构和领域对象的概念,让面向对象的分析和设计进入了一个新的阶段,对企业级软件开发起到了巨大的推动作用。
面向过程编程(POP):接触到需求第一步考虑把需求自顶向下分解成一个一个函数。并且在这个过程中考虑分层,模块化等具体的组织方式,从而分解软件的复杂度。当软件的复杂度不是很大,POP也能得到很好的效果。
面向对象编程(OOP):接触到需求第一步考虑把需求分解成一个一个对象,然后每个对象添加一个一个方法和属性,程序通过各种对象之间的调用以及协作,从而实现计算机软件的功能。跟很多工程方法一样,OOP的初衷就是一种处理软件复杂度的设计方法。
领域驱动设计(DDD):接触到需求第一步考虑把需求分解成一个一个问题域,然后再把每个问题域分解成一个一个对象,程序通过各种问题域之间的调用以及协作,从而实现计算机软件的功能。DDD是解决复杂中大型软件的一套行之有效方式,现已成为主流。
POP,无边界,软件复杂度小适用,例如“盖房子”。
OOP,以“对象”为边界,软件复杂度中适用,例如“盖小区”。
DDD,以“问题域”为边界,软件复杂度大适用,例如“盖城市”。
一个项目可以分层几个层级关系
应用层
相对于领域层,应用层是很薄的一层,应用层定义了软件要完成的任务,要尽量简单.
它不包含任务业务规则或知识, 为下一层的领域对象协助任务、委托工作。
它没有反映业务情况的状态,但它可以具有反映用户或程序的某个任务的进展状态。
对外为展现层提供各种应用功能(service)。
对内调用领域层(领域对象或领域服务)完成各种业务逻辑任务(task)。
这一层也很适合写一些任务处理,日志监控
领域层
领域层主要负责表达业务概念,业务状态信息和业务规则。 Domain层是整个系统的核心层,几乎全部的业务逻辑会在该层实现。
领域模型层主要包含以下的内容:
聚合类
需要接受前端数据以及所需数据库的部分查询字段
自定义业务异常
这里可以写入一个枚举,把所遇到的异常可以写入进去,到时方便直接调用
仓储接口
这里写入的是对于项目中增删改查的接口
领域服务
这里写入的是领域接口以及领域接口实现类
领域接口实现类中做出判断,这里可以引入exception自定义异常类中的枚举
基础实施层
最底层(但与所有层进行交互) 向其他层提供 通用的 技术能力(比如工具类,第三方库类支持,常用基本配置,数据访问底层实现)
基础实施层主要包含以下的内容:
聚合工厂类
这里写入的是全是工厂对象
PO转DO DO转PO
用于持久化操作
pojo,mapper,service以及对应的Impl
应用接口实现类
用户界面层或者是表示层
最顶层 请求应用层以获取用户所需要展现的数据(比如获取首页的商品数据) 发送命令给应用层要求其执行某个用户命令(实现某个业务逻辑,比如用户要进行转账)
用户界面层应该包含以下的内容:
装配
实现DTO与领域对象之间的相互转换,数据交换,因此Assembler几乎总是同DTO一起出现。
新增DTO对象
更新DTO对象
PO返回DTO
DTO是数据传输的载体,内部不应该存在任何业务逻辑,通过DTO把内部的领域对象与外界隔离
使用数据库部分字段,用来request和response前端数据展示
表面
Façade的用意在于为远程客户端提供粗粒度的调用接口
它的主要工作就是将一个用户请求委派给一个或多个Service进行处理,也就是我们常说的Controller。
用于发送请求给前端接收数据