2011-09-26 54 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

依賴你想要的東西。如果你確定你不需要改變孩子,你可以在對象中創建它。較少的代碼=>較少的錯誤。但是如果你以後可能想要不同的孩子,這將是不好的。

相關問題