文章目录
- 一、DDD是什么?
- 二、重要概念
一、DDD是什么?
开发程序应该“自顶而下、逐步求精”。也就是说,不要求一步就编写出可执行的程序,我们可以面向问题的总体目标,抽象低层的细节,先构造程序的高层结构,然后再一层一层地向下分解和细化,最后一步编写出来的程序才是可执行程序。
DDD是一种面向对象分析(Object-Oriented Analysis,OOA)与设计的方法论,可以很好地与现代的面向对象的程序设计(Object-OrientedProgramming,OOP)方法相结合,实现软件的编程方法会反过来影响分析方法。
解决核心复杂性的关键还是在于切分(分而治之),也就是说希望可以缩减每次要解决的领域问题的范围,简化概念和概念之间的关系。
二、重要概念
实体有一类对象拥有标识符(简称ID),不管对象的状态如何变化,它的ID总是不变的,这样的对象称为实体。
没有标识符的对象,叫作值对象。·推荐将值对象实现为“不可变的”(Immutable)。也就是说,值对象由一个构造器创建,并且在它们的生命周期内永远不会被修改。实现为不可变的,并且不具有标识符后,值对象就能够被安全地共享,并且能维持一致性。
聚合在对象之间,特别是实体与实体之间划出边界。聚合内的实体分为两种:聚合根(Aggregate Root)与聚合内部实体(或者非聚合根实体)。
聚合:访问控制+同生命周期+状态变化同步
一个聚合只能包含一个聚合根。当客户端需要访问一个聚合内部实体的状态时,最先能得到的只有聚合根,然后通过这个聚合根,才能进一步访问到聚合内的其他实体。
聚合内部实体的生命周期由它们所属的聚合根控制。如果聚合根不存在,那么在它控制下的聚合内部实体也就不存在了。
对于一个聚合内的对象状态(数据)的修改,我们需要保证它们总是一致的,也就是说我们要实现它们的强一致性。(某个瞬间不一致也不行)(聚合内强一致,聚合外最终一致)
很多时候,一个聚合内只有聚合根这一个实体。
非聚合根实体ID=聚合根ID+局部ID
分布式系统设计原则的第一条:不要“分布”。确切地说,如果没有足够的理由就不要做分布式设计,开发和运维分布式系统往往需要更高的成本。
跨聚合操作,定义为服务,以两个不同的聚合为参数
系统中有一些行为是不适合“归属于”哪个对象的,DDD建议把这样的行为定义为服务(Service)。或者说,当有一个操作需要修改多个聚合实例的状态时,这个操作就很有可能应该被定义为服务。