【问题标题】:Static Helper Class vs Static Method on an Instance Class vs Extension Method实例类上的静态助手类与静态方法与扩展方法
【发布时间】:2011-11-10 21:45:49
【问题描述】:

我正在寻找解决以下问题的最佳实践方法。

我希望人们对他们将使用哪种方法以及为什么使用以下方案提出意见:

我有一个 Class,它在指定 DateTime 时由工厂实例化。

我应该使用哪种方法?

静态“助手”类:Class c = ClassHelper.GetClass(DateTime);
实例类型的静态方法:Class c = Class.GetClass(DateTime);
静态扩展类/方法:Class c = DateTime.GetClass();

目前我更倾向于静态辅助类,因为我以前从未在实例类上使用静态工厂方法,但对我来说,在实例类上使用静态方法似乎很有意义上课?

在单元测试或组织测试方面我应该考虑什么?

目前我已经避开了扩展方法,因为我读到应该谨慎使用扩展方法,通常是在您无法访问要扩展的源代码的情况下?

干杯,

詹姆斯

【问题讨论】:

  • 在不了解情况的情况下很难回答这个问题,因为如果不是异常情况,您可以使用构造函数。不过,最后一个几乎肯定很糟糕。

标签: c# oop extension-methods static-methods helpers


【解决方案1】:

当指定 DateTime 时,我有一个由工厂实例化的类。 我应该使用哪种方法?

  1. 静态“助手”类:类 c = ClassHelper.GetClass(DateTime);
  2. 实例类型的静态方法:Class c = Class.GetClass(DateTime);
  3. 静态扩展类/方法:类 c = DateTime.GetClass();

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

这意味着避免扩展和辅助类,只需将工厂函数放在Class 类定义中。除此之外,这是人们通常放置工厂函数的地方。

【讨论】:

    【解决方案2】:

    任何静态解决方案的问题是其他类可能与您的类紧密耦合。

    假设 ClassB 想要一个 Class 的实例。它在其方法中调用静态方法Class.GetClass(DateTime)。现在假设您想独立于 Class 测试 ClassB。 (或者,如果您不进行测试,您想在其他地方使用 ClassB 的不同实现来重用 ClassB,并且您不想引用整个层次结构。)您是如何做到的?

    这个问题有多种解决方案。 IoC Containersabstract factory pattern 是两个。通常它们涉及接口(这是你的朋友)。他们也可能矫枉过正。这取决于你的类做什么以及如何使用它。

    【讨论】:

      猜你喜欢
      • 2015-08-12
      • 2012-01-29
      • 2012-11-12
      • 2011-01-17
      • 2011-06-06
      • 2017-06-22
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      相关资源
      最近更新 更多