發(fā)布于:2021-01-27 11:21:22
0
80
0
在處理遺留代碼時,我經常遇到這樣的問題:必須重構包含靜態(tài)方法或完全是靜態(tài)方法的類。
我之前談到過重構助手類,但這有點不同。
在本例中,我想討論重構類,您希望保留這些類,但這些類具有所有或多個靜態(tài)成員。
這種類是否真的是某個助手類并不總是很清楚,這是一個判斷調用,但是如果你真的找到了助手類,不要把它放在那里。
所以,基本上,如果你已經確定你正在使用的類將繼續(xù)存在,但是它確實有靜態(tài)方法,你需要擺脫它們,因為你正在進行依賴注入或模擬,請繼續(xù)閱讀。
定義兩種方法
我說的分步重構是什么意思?
以下是第一種方法的基本概述:
使您需要的方法成為非靜態(tài)的、非靜態(tài)的。
添加一個只包含該方法的接口。
實現(xiàn)接口。
更改對該方法的引用以使用接口。
我們來看一個例子:
如果我們對GetLostOrders方法感興趣,我們可以應用步驟1-3來獲得:
現(xiàn)在我們可以在代碼中為這一個方法更改引用。
現(xiàn)在讓我們看看第二種技巧,包裝和委派。下面是包裝和委派方法的概要:
創(chuàng)建一個包裝類,用于包裝靜態(tài)類調用。
將靜態(tài)類中的所有方法實現(xiàn)為包裝類中的非靜態(tài)方法。每個方法只委托給靜態(tài)類中的靜態(tài)方法。
創(chuàng)建一個包含所有方法的接口。
擁有包裝器類實現(xiàn)接口。
下面是一個這樣做的示例,給出了與第一個示例相同的原始代碼:
對LostOrderService的引用將被重構,與第一個示例中的重構完全相同,所以這里不包括它。
你可以在這個例子中看到,我們沒有觸及LostOrderService本身,只是你可能想在類上放置一個過時的屬性,告訴用戶不要使用它,而是使用包裝類。
哪個更好?
過去我傾向于使用包裝和授權的方法,但我開始認為分步方法更好,原因有幾個:
對于以后使用該類的人來說,分步方法更為明顯。當您包裝并委托時,必須有人知道有一個包裝類。使用分步方法時,別無選擇。
使用分步方法時,實際上是在擺脫壞的和有害的靜態(tài)方法。當您包裝并委托時,您仍然把它們留在那里,只是把它們藏在包裝袋里。
對我來說,包裝方法更像是我在處理事情,而不是清理它們。我還覺得有人可以看到我開始的東西,然后一步一步地從那里撿起來。如果使用包裝方法,混亂可能永遠不會得到清理,因為有一個解決辦法。
包裝和委派的閃耀之處
如果您無法控制靜態(tài)類或靜態(tài)調用的源代碼,則無法執(zhí)行分步方法。
當您處理代碼中對無法更改的外部庫的靜態(tài)引用時,wrap和delegate方法可以成為救命稻草。您可以簡單地包裝外部庫調用,而不是在代碼中引用包裝器?,F(xiàn)在您可以實際對代碼進行單元測試。
無論何時使用外部庫,您都應該考慮在其周圍放置某種保護性包裝。您永遠不知道何時需要替換它或升級庫。您不想在所有代碼中查找引用。
因此,盡管這兩種方法都可行,但如果我可以訪問靜態(tài)類的源代碼,我更喜歡使用分步方法。
你覺得呢?你還有別的解決辦法嗎?評論區(qū)里告訴我哦!