最近在看一本书,看到了AGGREGATE(聚合),AGGREGATE root(聚合根)。下面解释下这两个的意思。
在具有复杂关联的模型中,要想保证对象更改的一致性是很困难的。不仅互不关联的对象需要遵守一些固定规则,而且紧密关联的各组对象也要遵守一些固定规则。然而,过于谨慎的锁定机制又会导致多个用户之间毫无意义地互相干扰,从而使系统不可用[1]。
借用书上的例子打个比方,汽车。汽车由发动机、车轮、引擎等组成。那么我们在实际开车等场景中,人去开车,我们怎么来建立这个模型。这个时候就用到来一个聚合的schema。也就是说我们需要用一个抽象来封装模型中的引用。 就是这个一组相关对象的集合,我们把他称为数据修改的单元。
每个AGGREGATE都有一个根(root)和一个边界(boundary)。边界定义了AGGREGATE的内部都有什么。根则是AGGREGATE所包含的一个特定ENTITY。对AGGREGATE而言,外部对象只可以引用根,而边界内部的对象之间则可以互相引用。除根以外的其他ENTITY都有本地标识,但这些标识只在AGGREGATE内部才需要加以区别,因为外部对象除了根ENTITY之外看不到其他对象。
汽车是一个具有全局标识的ENTITY:我们需要将这部汽车与世界上所有“其他汽车区分开(即使是一些非常相似的汽车)。我们可以使用车辆识别号来进行区分,车辆识别号是为每辆新汽车分配的唯一标识符。我们可能想通过4个轮子的位臵跟踪轮胎的转动历史。我们可能想知道每个轮胎的里程数和磨损度。要想知道哪个轮胎在哪儿,必须将轮胎标识为ENTITY。当脱离这辆车的上下文后,我们很可能就不再关心这些轮胎的标识了。如果更换了轮胎并将旧轮胎送到回收厂,那么软件将不再需要跟踪它们,它们会成为一堆废旧轮胎中的一部分。没有人会关心它们的转动历史。更重要的是,即使轮胎被安在汽车上,也不会有人通过系统查询特定的轮胎,然后看看这个轮胎在哪辆汽车上。人们只会在数据库中查找汽车,然后临时查看一下这部汽车的轮胎情况。因此,汽车是AGGREGATE的根ENTITY,而轮胎处于这个AGGREGATE的边界之内。另一方面,发动机组上面都刻有序列号,而且有时是独立于汽车被跟踪的。在一些应用程序中,发动机可以是自己的AGGREGATE的根。
通俗异议的理解,就是我们在设计模型的时候,肯定是引用汽车这个entity。而非引用车轮和引擎等,所以car就是一个聚合根的概念。而和car相关的组件,组成了一个聚合的概念。
[1]: [美] 埃里克 埃文斯(Eric Evans). “领域驱动设计 软件核心复杂性应对之道 修订版.”
网友评论