重复方法还是一个代表?

时间:2013-11-25 15:25:05

标签: c# .net coding-style delegates dry

当变量重复多次时,我们使用局部变量来“解决”这个问题。当然,也有时候重复方法(调用)。例如,检查应用程序设置时如下所示。

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");
}

重复该方法不是很DRY (Don't Repeat Yourself)所以代表可以在这里帮忙吗?起初,我想把它放到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可能看起来像是一个重复的问题,但它仍然有所不同,如果只是结果。

1 个答案:

答案 0 :(得分:2)

可能只是我,但我不认为这违反了DRY原则。您正在调用一种方法来获取基于名称和默认值的设置。即使您用代表或其他任何东西替换它,您仍然会打电话给代表 - 您正在用另一个单线呼叫替换单线呼叫。

出于好奇,为什么Setting.UseReflectionOptimizer不是一个带有调用Settings.Get的getter的属性,以及一个调用Settings.Set或其他什么的setter?