什么是DDD

DDD(Domain Driven Design),定义了一系列的术语与规范,用于指导如何构建一个结构清晰、核心稳定、高可维护性、高代码复用性的工程实现;

优缺点

优点:结构清晰,代码可复用性高(单一职责)、可维护性高(依赖路径清晰)
缺点:代码量高、实现冗余

核心概念

领域-> 限界上下文 -> 子域 -> 实体、聚合
领域(核心域、通用域、支撑域)
限界上下文(业务流程划分)
实体对象、值对象
聚合、聚合根 (对外只操作聚合根)
事件风暴

核心方法

交互与业务原子语义分离:所见(交互)不等于所得(实现),这一点自己感觉还是至关重要的,即要把一个功能进行拆解和抽象,这是一个优秀的项目的核心要素;
聚合:能力内聚

分层方法

交互层(对外接口) -> 服务层(尽量只处理逻辑编排) -> 领域层(域服务、聚合(值对象、实体)) -> 基础层
可通过控制反转(依赖倒置)方法增强稳定性(防腐层)

充血 or 贫血模型?

充血模型的实体包含业务逻辑,尽量会和业务形态(非交互形态)保持一致,但通常依赖较多的情况下会比较复杂,需要取舍;
贫血模型更像数据库模型;
可以相互结合,例如把对数据库外部中间件的依赖去掉,只做内存操作,但对于依赖较多的业务,比较难以达成。

怎么防止扩散、边界扩展?

控制反转
依赖DDD的核心概念指导隔离(对开发人员有要求)

其他可用的工具?

code generator
设计模式

小结

DDD不是一套具体的设计准则,但通过一系列的术语,然后利用手上的一些工具,可以帮我们构建一个良好的(交互与业务原子语义分离的)工程实现;