[英]How can I make dependency injection'd code comfortable to both use and test?
我正在使用PHP,因此如果我做錯了什么,請原諒我的代碼。
讓我們看看我對“保險”對象具有的這種方法,它將使我回到所有說過保險的客戶手中:
public function getBeneficiarios() {
$petitionsVariables = array(
PeticionDeCoberturaColumns::COBERTURA_ID => $this->getId()
);
$petitions = (new PeticionDeCoberturaDAO())->getByValues($petitionesVariables);
$clientes = array();
foreach ($petitions as $petition) {
$clientes[] = $petition->getClient();
}
return $clientes;
}
所述代碼顯然不是非常可測試的,因為它已與特定的DAO耦合。 為了正確測試它,我需要模擬DAO並注入模擬。
依賴注入方式可以做到
public function getBeneficiarios($dao) {
$petitionsVariables = array(
PeticionDeCoberturaColumns::COBERTURA_ID => $this->getId()
);
$petitions = $dao->getByValues($petitionesVariables);
$clientes = array();
foreach ($petitions as $petition) {
$clientes[] = $petition->getClient();
}
return $clientes;
}
我可以將DAO注入保險對象構造函數中,但是我不喜歡傳遞不相關的DAO的想法,僅僅是因為它需要在單個方法上使用。
每次我想使用getBeneficiarios方法時,都需要首先創建DAO,這聽起來非常非常反直觀。 未來的編碼人員不必為此煩惱。
我該如何既保持使用舒適的代碼又保持測試代碼的舒適性?
在我看來,您的問題不是類的可測試性,而是應用程序的設計。
在真正的DDD中,您的類不應依賴於DAO,甚至不應該知道它存在。 您可以將其稱為持久性無知。 保險對象唯一應了解的是當事方(客戶,保險公司)和其他業務概念,例如法律條款。
關於封裝的最重要的事情是,您的類的使用者不需要了解其內部工作原理就可以成功使用它。 使保險依賴於靜態DAO對象會破壞封裝,因為其使用者需要知道靜態DAO必須存在於某處,否則將發生異常。
DAO是一個實現細節。 您的域對象不應該依賴於或不知道它, 它應該取決於您的域對象。 IoC是確保更基本的事情的一種手段,例如分離關注點和封裝。 如果設計使您違反了這些規定,那么沒有任何IoC可以解決。 首先,我將從DDD角度看一下我的設計。 看一下以下問題: DDD中的數據訪問層設計
讓我知道是否有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.