2012-05-21 61 views
2

比方說,我有一個類的東西,我需要使用由擴展Zend_Validate_Abstract來MySpecificDateValidation類提供一些具體的日期驗證。二傳手,驗證和依賴注入

在Thing類,我在想依賴注入,不知道如果這個代碼:

public function SetDateBegin($dateBegin) { 
    $dateValidator = new MySpecificDateValidation(); 
    if ($dateValidator->isValid($dateBegin)) { 
     $this->dateBegin = $dateBegin; 
    } else { 
     throw new Exception /*...*/; 
    } 
} 

應重構爲:

public function SetDateBegin($dateBegin, MySpecificDateValidation $dateValidator) { 
    if ($dateValidator->isValid($dateBegin)) { 
     $this->dateBegin = $dateBegin; 
    } else { 
     throw new Exception /*...*/; 
    } 
} 

或有類似的幾個依賴你可以住在一起嗎?

+1

可能更好地驗證器傳遞到創作上,而不是到每個函數的對象。除非你有一個令人信服的理由來避免額外的行李,否則如果SetDateBegin從不被調用,代碼會少得多。 – DampeS8N

+0

但是,在另一方面,如果我有半打不同的驗證十幾atributes,這(通過在創建)將在構造函數中帶來額外的重量,不是嗎? –

+1

@RodrigoAoCubo如果你的類有那麼多的依賴,它需要重新分解,它太多了!話雖如此,你傳遞依賴的地方取決於你的用例。 – vascowhite

回答

4

您的第二個選項將更容易unit test,因爲您將能夠嘲笑驗證程序並注入mocked object而不是真實的。

如果嘗試單元測試你最終測試Thing類加任何東西的第一個選項這取決於,比如驗證。如果單元測試失敗,則必須通過所有依賴關係來跟蹤失敗。

dependency injection點是讓你從他們的依賴讓你在單獨測試每一個類你的類隔離。

因此,從測試來看,你應該注入所有的依賴,始終。

+0

好吧,我明白它(單元測試)是主要的好處。我相信我仍然在試圖去適應這個想法並且背後留下舊的壞習慣...... –

+0

@RodrigoAoCubo單元測試不是主要的好處,它本質上是唯一的好處。其他任何事情都可以通過其他方式更高效地完成,但只有通過DI才能完成所有這些事情,並且還可以輕鬆進行單元測試。 – DampeS8N