2013-11-25 23 views
-1

當變量重複多次時,我們使用局部變量來「解決」這個問題。當然,還有時間重複方法(調用)。例如,如下所示檢查應用程序設置時。重複該方法還是一個委託?

static T Get<T>(NHibernateSetting key, T defaultValue) { 
    // Do something 
} 

void setApplicationSettings() { 
    var logFileName = Settings.Get(Setting.LogFileName, "default.log"); 
    if (/* Do some check */) 
     configuration.LogFile(logFileName); 

    var adoNetBatchSize = Settings.Get<int?>(Setting.AdoNetBatchSize, null); 
    if (adoNetBatchSize.HasValue) 
     configuration.AdoNetBatchSize(adoNetBatchSize.Value); 

    if (Settings.Get(Setting.UseReflectionOptimizer, true)) 
     configuration.UseReflectionOptimizer(); 

    if (Settings.Get(Setting.GenerateStatistics, false)) 
     configuration.Raw("generate_statistics", "true"); 
} 

重複的方法不是很所以委託人可以幫忙嗎?起初,我想把它放入如下的Func<in T1, in T2, out T3>。在性能方面,這將等於該方法的原始本地調用,對吧?

var typedGetter = new Func<NHibernateSetting, String, String>(Settings.Get); 

然後,我碰到了下一個問題,因爲String是不是正在使用,所以我想通過輸入了所有需要的類型揹負的唯一T。我嘗試了以下,但它沒有奏效。有關如何解決這個問題的任何信息?

var genericGetter = new Func<NHibernateSetting, T, T>(Settings.Get); 

重複。問題Delegate to replace repeating code可能看起來像一個重複的問題,但它不同,但如果只是結果。

+0

對於downvote的人,請張貼原因和/或(建設性)反饋來改進。 –

回答

2

這可能只是我,但我不認爲這違反了DRY原則。您正在調用一種方法來根據名稱和默認值獲取設置。即使你用委託或其他東西代替它,你仍然會打電話給委託人 - 你正在用另一個單線電話取代單線電話。

只是出於好奇,爲什麼Setting.UseReflectionOptimizer的一個屬性沒有調用Settings.Get的getter和一個調用Settings.Set的setter?

+0

DRY:也許你對DRY部分是正確的,儘管使用委託我們只需要在功能發生變化(並且沒有自動重構)時更改委託。 **我仍然想要一個通用的Func,有可能嗎?** 關於'Setting.UseReflectionOptimizer',這是一個複製粘貼錯誤;-)我在你的評論後編輯我的帖子 –

+0

你可以有一個通用的Func作爲泛型靜態類的字段,例如。 static class Getter {static Func GenericGetter; }。 然後,運行時將根據請求爲所有各種TS創建類。 – Luaan

+0

我喜歡'GenericGetter',但它不能推斷出類型,所以你必須**來指定類型。 P.S.你可以用代碼將你的代碼包圍起來,將它們格式化爲代碼,這會增加你的帖子的可讀性。 –