DDD是什么
DDD是领域(Domain)驱动(Driven)设计(Design)的简写,是一种战略设计,先绘制业务领域的关系图,同时定义与模型的边界上下文。
实体
实体是一直保持唯一标识的对象,是一个类,一般的事情情况是对应到数据库中的一张表,也就是OOP里的对象,抽象出来的一个对象。唯一标识,也可以理解成主键,通过这个主键可以在系统中找到它,这个主键还可以跨越多个边界的上下文,也就是关系,一对多,多对多,一对一这样的关系,实体的属性可以随时变化,但是标识不能改变。
值对象
值对象没有标识,这是与实体的区别,它只有属性而且也是不可变的,如果需要改变,那么就需要创建一个新实例来替换旧实例。
聚合
聚合定义了一个或多个实体的一致性边界,一个聚合包含一个根实体,可以使用过实体的标识符执行查找,聚合的作用是为了事务的不变性建模,现实中的操作是复杂的,一次动作可能包含了多个实体的变更,也就是为了数据一致性的操作,但是有一个弊端就是在分布式应用中通常是不可行的,
给可以包含单个实体且不包含子实体,聚合的定义由事务边界确定。
领域服务和应用服务
在DDD的设计中,服务是实现某种逻辑且不保存任何状态的对象,这个理解为中间的中转,例如饭店的服务员,服务员来了,点餐,服务员带着订单到后厨交给其他人处理。
领域事件
发生某种情况的时候,使用领域事件来通知给其他的部件,比如在表中插入一条记录不是领域事件
,但是订单取消是领域事件
。
DDD 相比 MVC
MVC | DDD |
---|---|
解决应用程序结构的问题 | 解决业务复杂度的问题 |
适用于比较简单的业务逻辑 | 适用于比较复杂的业务逻辑 |
自上而下的设计,从用户界面到数据存储,强调分层开发 | 自下而上的设计,从业务建模出发到应用和基础设施,强调的是领域驱动开发 |
讲系统分为模型、视图、控制器,前后端分离 | 将系统分为领域层、应用层、基础设施层、用户接口层、强调业务逻辑与技术徐虎额的分离 |
一般设计中MVC中的实体或者模型都是贫血模式(只有属性) | 实体或者模型中采用充血设计(有属性,有方法) |
如何选择
并不是DDD一定比MVC好,而是要根据业务场景也成本来选择,我个人认为,DDD通常来讲,时间成本、人力成本和学习成本都是高于MVC的,前期战术设计阶段就需要人力和时间来对业务进行建模来确定边界,进行设计,而MVC则可以通过用户的交互方式来直接做设计。
DDD是什么
https://oujun.work/2024/06/11/ddd.html