当变量重复多次时,我们使用局部变量来“解决”这个问题。当然,也有时候重复方法(调用)。例如,检查应用程序设置时如下所示。
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可能看起来像是一个重复的问题,但它仍然有所不同,如果只是结果。
答案 0 :(得分:2)
可能只是我,但我不认为这违反了DRY原则。您正在调用一种方法来获取基于名称和默认值的设置。即使您用代表或其他任何东西替换它,您仍然会打电话给代表 - 您正在用另一个单线呼叫替换单线呼叫。
出于好奇,为什么Setting.UseReflectionOptimizer不是一个带有调用Settings.Get的getter的属性,以及一个调用Settings.Set或其他什么的setter?