2011-09-26 58 views
1

将它应用到原始对象内加载另一个对象,像这样的好做法:对象应该自己“加载”另一个对象,还是让另一个对象传递给它?

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); 

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

+1

尽管它只是一个例子:它应该是'private%child'而不是'$ child;'。 – ThiefMaster

+0

@stereofrog,它实际上是一个普遍的问题 - 我想知道我的栖息地是否糟糕:)我最终希望设置两种类型之间的双向性。 – johnnietheblack

+1

我认为@ J0HN是正确的 - 如果你练习测试驱动开发,你会很快注意到把'new'放入你的协作者几乎是不可能的,因为你不能轻易地模拟和存储它们。代码重用也受到严重阻碍。不要这样做。看看[清洁代码会谈](http://www.youtube.com/results?search_query=The+Clean+Code+Talks&aq=f) – Gordon

回答

4

这取决于情况。

第二个对象的名称表明,

  1. Child实例只用于由Parent实例
  2. 并不需要住长于Parent实例

如果这是这样的,比第一种模式(Object composition pattern)更好。

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

+0

我选择了这个答案来描述它的双方... – johnnietheblack

+0

你几乎可以使用一个Composite * Pattern *而不在对象图中使用任何'new'。 Composite * Pattern *关于*统一处理单个对象和对象的组合*您可能指的是[对象组合](https://secure.wikimedia.org/wikipedia/en/wiki/Object_composition) – Gordon

+1

@Gordon , 你是对的;更新了答案 – Jacco

4

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

1

依赖你想要的东西。如果你确定你不需要改变孩子,你可以在对象中创建它。较少的代码=>较少的错误。但是如果你以后可能想要不同的孩子,这将是不好的。

相关问题