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

PHP:何时维护对象反向链接,php,domain-driven-design,Php,Domain Driven Design,我不时地读到关于维护域对象之间的反向链接的需要,但是我从来没有遇到过这样做的需要。我想知道这是与我的编码风格有关,还是与我使用PHP有关 例如,考虑一个运行兽医实践的应用程序。主人与动物群(他们的宠物)有联系。兽医也与动物群(他们的病人)有联系。当动物的兽医更换时,我可以用两种方法编写方法。首先,简单的方法是: class Animal { // public function changeVet(Veterinarian $vet) { $this->ve

我不时地读到关于维护域对象之间的反向链接的需要,但是我从来没有遇到过这样做的需要。我想知道这是与我的编码风格有关,还是与我使用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的反向链接的唯一缺点是开发人员需要知道如何持久化。例如,在上面的例子中,如果我需要在更改宠物兽医的相同请求中迭代兽医的患者集合,我需要重新加载集合(而不是跟随链接)。这种情况很少发生。

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

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

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

你的第一个例子说明动物有兽医,兽医可以改变。你什么也没说兽医本身。第二个例子说明了同样的情况,还说兽医让动物作为病人。因此,这个例子只适用于你的公司与兽医病人打交道的情况。其他任何事情(比如管理用户的动物,包括他们的兽医)都不会要求兽医了解他们的患者。即使你在与兽医的病人打交道,你也可能不会改变动物的兽医,而是在特定的兽医中添加新的动物,因为这是真实世界中发生的事情(因此没有
changeVet()
,只有
addPatient()

如果你有一家关于多个兽医和动物的公司,比如保险公司,那么将用户的动物和兽医一起管理的唯一情况就是。在这种情况下,知道哪只动物接受哪位兽医的治疗可能很重要,因此更换兽医可能是一个商业案例


TL;博士:如果你知道你必须保持反向链接。如果没有,请避免。

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


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

有趣。我在哪里可以找到更多关于这方面的信息?任何关于面向对象设计的像样的书都可以。不过,我不知道有哪一种使用PHP作为示例语言。另外,看看埃里克·埃文斯亲王在DDD蓝皮书中提到的,尽管我记不起是哪一章了。