对象应该自己“加载”另一个对象,还是让另一个对象传递给它?
将它应用到原始对象内加载另一个对象,像这样的好做法:对象应该自己“加载”另一个对象,还是让另一个对象传递给它?
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);
哪一个更好的选择,更灵活等?
这取决于情况。
第二个对象的名称表明,
- 的
Child
实例只用于由Parent
实例 - 并不需要住长于
Parent
实例
如果这是这样的,比第一种模式(Object composition pattern)更好。
如果Child
实例在您的代码中的其他地方需要/使用,则第二个模式(Dependency injection)更合适。依赖注入是一种更灵活的模式,如果你不确定你的用例,你通常应该使用依赖注入。
我选择了这个答案来描述它的双方... – johnnietheblack
你几乎可以使用一个Composite * Pattern *而不在对象图中使用任何'new'。 Composite * Pattern *关于*统一处理单个对象和对象的组合*您可能指的是[对象组合](https://secure.wikimedia.org/wikipedia/en/wiki/Object_composition) – Gordon
@Gordon , 你是对的;更新了答案 – Jacco
依赖你想要的东西。如果你确定你不需要改变孩子,你可以在对象中创建它。较少的代码=>较少的错误。但是如果你以后可能想要不同的孩子,这将是不好的。
尽管它只是一个例子:它应该是'private%child'而不是'$ child;'。 – ThiefMaster
@stereofrog,它实际上是一个普遍的问题 - 我想知道我的栖息地是否糟糕:)我最终希望设置两种类型之间的双向性。 – johnnietheblack
我认为@ J0HN是正确的 - 如果你练习测试驱动开发,你会很快注意到把'new'放入你的协作者几乎是不可能的,因为你不能轻易地模拟和存储它们。代码重用也受到严重阻碍。不要这样做。看看[清洁代码会谈](http://www.youtube.com/results?search_query=The+Clean+Code+Talks&aq=f) – Gordon