【问题标题】:Should an object "load" another object on its own, or have the other passed to it?一个对象应该自己“加载”另一个对象,还是让另一个对象传递给它?
【发布时间】:2011-09-26 07:44:03
【问题描述】:

从原始对象中加载另一个对象是否是一种好习惯,如下所示:

Class parent() {

    $child;

    function loadChild() {
        $child = new Child();
        $this->child = $child;
    }
}

或者,子对象是否应该总是单独传入?

Class parent() {

    $child;

    function setChild(child $child) {
        $this->child = $child;
    }
}

$parent = new Parent();
$child = new Child();
$parent->setChild($child);

哪个是更好的选择,更灵活等?

【问题讨论】:

  • 尽管这只是一个例子:它应该是private %child; 而不是$child;
  • @stereofrog,这实际上是一个普遍的问题 - 我想知道我的栖息地是否不好 :) 最后,我希望在两种类型的类之间建立双向性。跨度>
  • 我认为@J0HN 做对了——如果您练习测试驱动开发,您很快就会注意到将new 加入您的合作者几乎是从来没有一个好主意,因为您不能轻松地模拟和存根它们。代码重用也受到它的严重阻碍。不要这样做。看看The Clean Code Talks

标签: php oop separation-of-concerns


【解决方案1】:

视情况而定。

第二个对象的名称表明

  1. Child 实例将仅由 Parent 实例使用
  2. 不需要比Parent 实例更长寿

如果是这种情况,那么第一个模式 (Object composition pattern) 会更好。

如果代码中的其他地方需要/使用Child 实例,则第二种模式(Dependency injection)更合适。依赖注入是一种更灵活的模式,如果您不确定自己的用例,通常应该使用依赖注入。

【讨论】:

  • 您几乎可以使用复合模式,而无需在对象图中使用任何new。复合模式是关于统一处理单个对象和对象的组合。您可能指的只是Object Composition
【解决方案2】:

第二个选项更合适。它被称为Dependency Injection。主要原因之一是您可以传递任何实现 child 接口的对象(包括模拟对象,这对 TDD 很重要),而无需修改您的类。

【讨论】:

    【解决方案3】:

    依赖于你想要的。如果你确定你不需要改变孩子,你可以在对象中创建它。更少的代码 => 更少的错误。但是,如果您以后可能想拥有不同的孩子,那就不好了。

    【讨论】:

      猜你喜欢
      • 2015-09-15
      • 1970-01-01
      • 2019-05-02
      • 2012-07-07
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 2021-12-07
      相关资源
      最近更新 更多