2011-09-05 120 views
4

我正在尋找解決以下問題的最佳實踐方法。Static Helper類與實例類的靜態方法vs擴展方法

我想人民的意見是哪種方法(),他們會用,爲什麼呢,以下場景:

我有這是由工廠已指定日期時被實例化一個Class

我應該使用哪種方法?

靜態的「助手」類:Class c = ClassHelper.GetClass(DateTime);
的實例類型的靜態方法:Class c = Class.GetClass(DateTime);
靜態擴展類/方法:Class c = DateTime.GetClass();

目前我傾向於更多地轉向靜態輔助類,因爲我從來不採取了在實例類上使用靜態工廠方法的方法,但對於我來說,在類上使用靜態方法似乎是有意義的。

當談到單元測試或組織測試時,我應該考慮什麼?

因爲我讀過擴展方法應該謹慎使用,通常如果您無法訪問您正在擴展的源代碼,我目前已經避開了擴展方法。

乾杯,

詹姆斯

+0

在不知道情況下很難回答這個問題,因爲如果它們不是特殊情況,你可以使用構造函數。但最後幾乎肯定是可怕的。 – mquander

回答

5

我有一個由工廠實例化的類,當DateTime被指定時。 我應該使用哪種方法?

  1. 靜態 「助手」 等級:Class C = ClassHelper.GetClass(日期時間);
  2. 關於實例類型的靜態方法:Class c = Class.GetClass(DateTime);
  3. 靜態擴展類/方法:Class c = DateTime.GetClass();

我的建議是遵循the simplest thing that could possibly workcode cohesion的原則。

這意味着要避免擴展和幫助類,並將工廠函數放在Class類定義中。除此之外,人們通常會把工廠功能放在這裏。

3

的問題與任何靜態的解決方案是,其他類可能成爲緊耦合到您的類。

說ClassB想要Class的一個實例。它在其方法中調用靜態方法Class.GetClass(DateTime)。現在說你想要獨立於Class測試ClassB。 (或者,如果你沒有進行測試,你希望在其他地方使用ClassB,而不需要引用整個層次結構。)你怎麼做?

這個問題有多種解決方案。 IoC Containersabstract factory pattern是兩個。通常它們涉及接口(這是你的朋友)。它們也可能是過度殺傷性的;這取決於你的班級做什麼以及如何使用它。