【问题标题】:Repeat the method or one delegate?重复方法还是一个委托?
【发布时间】:2013-11-25 15:25:04
【问题描述】:

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

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&lt;in T1, in T2, out T3&gt; 中,如下所示。就性能而言,这将等于方法的原始本机调用,对吧?

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 可能看起来像一个重复的问题,但它仍然不同,如果只是结果。

【问题讨论】:

  • 对于不赞成投票的人,请发布原因和/或(建设性)反馈以进行改进。

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


【解决方案1】:

可能只有我一个人,但我不认为这违反了 DRY 原则。您正在调用一种方法来获取基于名称和默认值的设置。即使您将其替换为委托或其他任何东西,您仍将调用委托 - 您正在将单线呼叫替换为另一个单线呼叫。

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

【讨论】:

  • DRY:也许您对 DRY 部分的看法是正确的,尽管使用委托我们只需要在函数更改时更改委托(并且您没有自动重构)。 我仍然想要一个通用的 Func,可以吗? 关于Setting.UseReflectionOptimizer,这是一个复制粘贴错误;-) 我在您发表评论后编辑了我的帖子
  • 您可以将泛型 Func 作为泛型静态类的字段,例如。静态类 Getter { 静态 Func GenericGetter; }。然后,运行时将根据请求为所有不同的 T 创建类。
  • 我喜欢GenericGetter,但它不会推断类型,因此您有义务指定类型。附言您可以在您的代码周围加上一个严重的 ` 以将其格式化为代码,这会增加您帖子的可读性。
  • 是的,要进行自动类型推断,您必须有一个方法来返回该字段。但这几乎把你带到了你开始的地方。在 NHibernateSetting 上创建一个扩展方法怎么样?而不是Setting.Get,您只需调用Setting.GenerateStatistics.Get(false)。附言感谢代码提示:)
猜你喜欢
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
相关资源
最近更新 更多