簡體   English   中英

如何使依賴注入代碼易於使用和測試?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM