簡體   English   中英

依賴注入僅用於測試嗎?

[英]Dependency injection is only for testing?

我讀過很多遍,硬編碼對象不是一個好習慣:

class Session
{
    private $user;

    function __construct()
    {
        $this->user = new User();
    }
}

它的壞處僅是因為其無法測試的行為? 我只是覺得這種硬編碼更容易閱讀。 當然,我可以將這些方法添加為類似於DI的方法:

    public function setUser (User $userObj)
    {
        $this->user = $userObj;
    }

    public function getUser()
    {
        return $this->user;
    }

但是,它就像一間甚至可以更改桁架的房屋。 做什么的?

與房屋不同,房屋是一個物理對象,並且無法更改其桁架,這與代碼不同,因為代碼的永久性較低。

老實說,使用DI多年,我認為它已經被濫用。 很簡單:一幫一類的依賴不會改變,如果他們這樣做,這是很容易申請DI給他們。

堅持房屋類比,我的立場是“現在不必建造整個房屋,也不必在可能需要開門的地方建造承重牆”。 我會在構造函數中創建依賴對象,因此,如果有必要使它們互換,添加構造函數arg並在需要時通過DI框架開始傳遞依賴關系就足夠了。

那時,您要放開自己的一件事是,然后將用DI友好版本替換創建該類的每個實例,這意味着需要大量重構,並因此需要進行大量回歸測試。 這是很大的風險。 如果您確定自己擁有非常全面的自動化測試范圍,則可以減輕很多此類風險。

另一方面...從一開始就使用DI框架,即使沒有立即注入依賴項,當需要注入它們時,它仍將進一步減輕這種考慮。

使用DI確實可以使您的測試容易得多,這反過來又會提高您實現更高測試覆蓋率的能力。 但是我也不認為應該專門為測試編寫代碼。

因此,在做出此決定時,需要權衡一些因素並將其應用於您的特定樣式和要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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