2009-07-03 47 views
6

情況如下:我有一個課程太多了。它主要用於訪問配置信息,但它也具有數據庫連接。它是作爲一個單例實現的,所以這也使得單元測試變得困難,因爲大部分代碼都與它緊密耦合。這更成問題,因爲它會創建一個導入時間依賴項(我們正在使用Python進行此操作),這意味着某些模塊必須以特定順序導入。理想情況下,我想分成兩個班級,並將其設置爲非單身人士。哪個更邪惡:一個不必要的單身人士還是一個上帝的對象?

幸運的是,我的僱主已經預熱這樣一種事實,即這種測試是好的,並且願意允許我這樣做,如果它使代碼更易於測試。但是,我懷疑他們會願意讓我花費太多的時間。我寧願逐漸修復,而不是試圖過激。

所以,我在這裏看到三個選擇:

  1. 打破配置對象爲(單)配置對象和(非單)的數據庫對象。這至少會允許我刪除數據庫作爲導入時間依賴項。
  2. 使配置對象成爲非單例並將其傳遞給需要它的對象。我認爲這更好地解決了我們的短期需求,但我認爲這需要更多的時間。
  3. 做一些我沒有想到的,你在你的答案建議。 :-)

那麼我該怎麼做?

回答

5

我認爲你有望分成兩個班。您可能需要考慮使用工廠根據需要創建數據庫上下文/連接。通過這種方式,您可以將連接視爲一個工作單元,它根據需要進行創建/處理,而不是在對象的整個生命週期內保持單一連接。 YMMV,但。

至於配置,這是一種情況,我發現一個單身人士可以是正確的選擇。我不一定會轉儲它,因爲它很難進行單元測試。不過,您可能需要考慮構建它,以實現一個接口。然後,您可以使用依賴注入在測試期間提供接口的模擬實例。如果注入的值爲空或注入單例實例,您的生產代碼將被構建爲使用單例實例。或者,您可以構建該類以允許通過私有方法重新初始化,並在設置/拆卸測試方法中調用此方法,以確保它具有適合您測試的正確配置。我更喜歡前者對後者的實現,儘管當我沒有直接控制接口時,我也使用它。

逐步進行更改絕對是您的選擇。如果可能的話,用測試包裝當前的功能,並確保那些測試在你修改後仍然通過(但是,當然不是直接與你的修改進行處理的測試)是確保你不打破其他代碼的好方法。

5

很難知道沒有看到你的代碼,但爲什麼不做你說的 - 逐步地做?首先做第1步,拆分數據庫。

如果這很快就回去了,現在你只有一個較小的對象不再是一個單身而不是2個。所以步驟2應該更快。或者在這個階段,你可能會看到一些其他代碼可以從單例中重構出來。

希望你可以一步一步地減少單身人士的東西,直到它消失爲止,而無需在任何一個階段支付鉅額時間稅。

例如,如果配置的各個部分是獨立的,那麼配置的一部分可能一次成爲單例。所以,也許GUI配置保留單身,而文件配置重構,或類似的?

+0

我想*是*我沒有想到的東西。通過打破這個對象,它變得更容易去單身(如果這是一個詞)。 – 2009-07-03 15:44:51

+0

desingulate怎麼樣? – 2009-07-03 15:52:49

2

選項1是我在所有應用程序中所做的:配置對象單例和數據庫對象,按需創建或注入。

將cofiguration對象作爲單例對象一直是我的最佳選擇。只有一個配置文件,我總是希望在應用程序啓動時讀取它。

2

藉口的事實,我不知道任何的Python,所以我希望任何僞代碼是有道理的......

我首先拆分對象爲兩個部分,以便您單的責任較小,那麼我會採取其餘的配置單身人士,並將其更改爲一個普通的類(就像你要執行你的第二個建議)。

一旦我得到了那麼遠我想創建一個新的,包裝單暴露出配置類的方法:

class ConfigurationWrapper : IConfigurationClass 
{ 
    public static property ConfigurationWrapper Instance; 

    public property IConfigurationClass InnerClass; 

    public method GetDefaultWindowWidth() 
    { 
     return InnerClass.GetDefaultWindowWidth(); 
    } 

    etc... 
} 

現在,應用程序做的第一件事是注入的一個實例將ConfigurationClass放入包裝中。

ConfigurationClass config = new ConfigurationClass() 
ConfigurationWrapper.Instance.InnerClass = config; 

最後,您可以將當前依賴單例的類移到包裝單例(應該是快速查找和替換)。現在,您可以一次轉換一個類,通過它們的構造函數接受配置對象以完成階段2.任何你沒有時間做的事情都可以使用包裝單例。一旦你將它們全部移開,你可以擺脫包裝。

另一方面,您可以忽略重用的用法,只需將一個模擬配置類注入單例包裝器進行測試 - 實質上是一個窮人的依賴注入。

相關問題