PHP:何时维护对象反向链接

时间:2015-12-03 21:35:02

标签: php domain-driven-design

我不时读到了维护域对象之间反向链接的必要性,但是我从来没有遇到过这样做的必要性。我想知道这是否与我的编码风格或我使用PHP的事实有关。

举例来说,考虑一个运行兽医实践的应用程序。业主与一群动物(他们的宠物)有联系。兽医也与一群动物(他们的病人)有联系。当动物的兽医改变时,我可以通过两种方式编写该方法。首先,简单的方法:

class Animal {
    //
    public function changeVet(Veterinarian $vet) {
        $this->vet = $vet;
    }
}

其次,一种更复杂的方法来维护反向链接:

class Animal {    
    //
    public function changeVet(Veterinarian $vet) {
        $vet->addPatient($this);
        $this->vet->removePatient($this);
        $this->vet = $vet;
    }
}

显然第二种方法要复杂得多,但我从来不需要使用它。我可以看到这个要求,如果我正在编写一个Java应用程序,其中内存模型在请求之间保持不变,但PHP不会发生这种情况。我错过了什么吗?

据我所知,不维护与PHP链接的唯一缺点是开发人员需要知道事情的持久性。例如,在上面的例子中,如果我需要在我用来改变宠物兽医的同一请求中迭代兽医的患者集合,我将需要重新加载该集合(而不是关注链接)。这种情况很少发生。

2 个答案:

答案 0 :(得分:2)

几乎总是可以创建没有双向关联的设计。

单向设计比双向设计好得多,因为类之间的耦合较小。因此,设计可以更容易地进行调整和重构,并且测试更简单。

答案 1 :(得分:0)

何时维持反向链接?当您的业务规则要求时,您需要它们。

您使用反向链接的示例可能有一个重要的副作用:如果宠物的主人决定更换兽医,兽医知道他失去了一名患者。

不幸的是,您的示例缺乏深度来解释基于业务规则的要求。创建一个需要反向链接的情况很容易,但使用类似于实际业务的对象可能并不是最好的。

你的第一个例子说动物有一个兽医,兽医可以改变。你对兽医本身没有任何说法。第二个例子说明了同样的情况,并且还说兽医将动物作为患者。因此,只有当您的企业与兽医患者打交道时,此示例才适用。其他任何事情(比如处理管理用户的动物,包括他们的兽医)都不会要求兽医了解他们的病人。即使你正在与兽医的病人打交道,你可能也不会改变动物的兽医,你可以在特定的兽医中添加一种新的动物,因为这是现实世界中发生的事情(所以没有changeVet(),只有{ {1}})。

管理用户的动物和兽医的唯一情况是,如果你有一个关于多个兽医和动物的公司,如保险公司。在这种情况下,知道哪个兽医由哪个兽医治疗可能很重要,因此转换兽医可能是一个商业案例。

TL; DR:如果您知道必须,请维持反向链接。如果没有,请避免使用。