【问题标题】:PHP: When to maintain object backlinksPHP:何时维护对象反向链接
【发布时间】:2015-12-03 21:35:02
【问题描述】:

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

【问题讨论】:

    标签: php domain-driven-design


    【解决方案1】:

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

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

    【讨论】:

    • 有趣。我在哪里可以找到更多相关信息?
    • 任何一本关于面向对象设计的好书都应该这样做。不过,我不知道使用 PHP 作为示例语言的好方法。另外,看看Solid Principles
    • @KimPrince Eric Evans 在 DDD 蓝皮书中提到了这一点,但我不记得是哪一章了。
    【解决方案2】:

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

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

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

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

    唯一同时管理用户的动物和兽医的情况是,如果您的业务涉及多个兽医和动物,例如保险公司。在这种情况下,了解哪个动物由哪个兽医治疗可能很重要,因此更换兽医可能是一个商业案例。

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

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 2013-01-31
      相关资源
      最近更新 更多