战术设计是指对特定上下文下的模型进行详细设计。
战术设计的对象包括聚合、实体和值对象等,其目标是用明确它们是什么以及相互之间有何关系。战术设计的产出可以是用 UML 表达的类图,需要细化到具体的属性,同时确保在代码级别可实现。
战术设计帮助我们创建一套优雅的业务模型,其中使用到下面的概念:
实体(Entities)
一个实体很有可能是一个可变的对象,它有唯一的ID。在整个领域模型中, 实体有自己独立的生命周期,这样可以让我们方便地获取到实体整个生命周期的变迁历史。
值对象(Value Objects)
区分值对象与实体的区别在于,值对象是不可变的,并且没有唯一标识,仅由其属性的值定义。这种不变性的结果是,为了更新值对象,您必须创建一个新实例来替换旧实例。
聚合(Aggregates)
它是战术设计中最重要和最复杂的模式之一,聚合基于另外两个战术标准,即实体和值对象。聚合是一种或多种的群集实体,并且还可以包含值对象。此群集的父实体接收聚合根的名称。
领域服务(Services)
服务是无状态对象,它们执行一些不适合实体或值对象上的操作的逻辑。它们执行特定于域的操作,这可能涉及多个域对象。
领域事件(Events)
事件表示域中发生的重大事件,需要向属于域的其他利益相关者报告。Aggregates通常发布事件。
模块(Modules)
模块很少被开发者提到,不过,他们的使用很有意思。
使用模块后, 可以有效地帮咱隔离关注点, 对应着Java中的包或C#中的命名空间,也总是遵循着统一语言。
资源库(Repositories)
存储库主要用于处理存储,它们抽象了对数据存储的依赖担忧。他们负责持久聚合。
工厂(Factories)
工厂的出现,隔离了对象的创建过程。工厂可以生成聚合根、实体或值对象。使用工厂,可以避免创建对象时的复杂过程。
规格(Specification)
规格是一些特殊的业务规则。通常表现为用于校验(e.g. 数据格式,业务逻辑)、查询和搜索条件。
在实践中,规格既可以被设计为灵活的查询或校验条件,也可以被抽象出来以便复用。