2016-04-26 75 views
0

我有去像緊耦合與DI門檻

class A 
{ 
    public $b, $c; 

    //Inject D and E here? (B $b, C $c, D $d, E $e, ...) 
    public function __construct(B $b, C $c) 
    { 
     $this->b = $b; 
     $this->c = $c; 
    } 

    public function main() 
    { 
     if (rand(0,1)) { 
      new D(); 
     } else { 
      new E(); 
     } 
    } 
} 

我應該在A構造函數注入可能DE類代碼?這裏的問題是項目的層次結構遵循這個樹狀結構,從而使上層節點A保持其子節點的所有依賴關係。或者在某個時候足夠健全地成爲stupid

回答

1

這取決於D和E實際是什麼。如果他們只是簡單的數據對象,你會沒事的。如果他們例如抽象數據庫訪問,你最好注入它們。作爲一條經驗法則:如果你可以編寫一個適用於每個系統的單元測試(例如使用phpUnit)(這意味着不僅僅是你的本地開發環境),那麼耦合並不那麼嚴重,你會沒事的用你現在正在做的方式。

另一方面,如果這種單元測試由於某個缺失的資源(例如數據庫連接)而失敗,則需要注入該服務之一。然後,您可以爲測試創建一個模擬對象,並再次運行。