視頻來源:不要查找需要的東西
概述:
不要問中間人查找或者索要需要的東西,而是直接要需要的東西(迪米特原則)
啟發(fā):
高質(zhì)量的可測試的code來自創(chuàng)建過程和業(yè)務(wù)邏輯的分離。
將對象的創(chuàng)建過程和 業(yè)務(wù)邏輯分開有利于寫出干凈的代碼:業(yè)務(wù)主邏輯清晰,而不是一堆新對象的創(chuàng)建過程和if else邏輯混合在一起。
我們可以使用建造者模式:factory,builder,provider等將對象的創(chuàng)建過程和業(yè)務(wù)邏輯分離開。
使用DI 依賴注入的方式向需要測試的模塊注入直接依賴,這樣在測試的時候就可以mock數(shù)據(jù),也同時直接聚焦在主邏輯上寫出可讀性很好的代碼,提高代碼質(zhì)量。
注意:在對象的初始化的時候盡量不要Null check,因為這會增加創(chuàng)建對象的困難,因為有時候確實需要傳入Null參數(shù),或者dummy來進行測試,如果參數(shù)不能為Null就意味著不許創(chuàng)建這個對象,而這些參數(shù)對象可能對于本次測試來說并沒有意義,但是卻因為Null check導致不能構(gòu)造測試,這樣會很讓人痛苦。
依賴注入時的生命周期問題:
構(gòu)造函數(shù)創(chuàng)建方式依賴注入:通常注入的參數(shù)對象的生命周期等于或者大于被注入方,這樣不會內(nèi)存泄露——因為被注入方被銷毀的時候?qū)τ?注入的參數(shù)生命周期沒有影響,注入的參數(shù)對象被銷毀的時候,被注入方可能早就已經(jīng)銷毀了
方法參數(shù)類型注入:在運行時注入,通常注入的對象的生命周期比被注入方法所屬對象生命周期短,這樣方法運行完畢,參數(shù)對象可以被及時的垃圾回收,而不是長期被持有,導致長期占用內(nèi)存。
反模式(通過中間人來查找信息):
- registry
- Locator
- Context
- Manager
- Handler
- Environment
- Pricinple