实例类与扩展方法的静态助手类与静态方法

时间:2011-09-05 22:14:45

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

我正在寻找针对以下问题的最佳做法。

我希望各国人民对于他们将使用哪种方法以及为什么会出现以下情况:

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

我应该使用哪种方法?

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

目前我更倾向于使用静态助手类,因为我以前从未采用过在实例类上使用静态工厂方法的方法,但是对于我来说,使用静态方法对它进行操作似乎是有意义的。类?

在进行单元测试或组织测试时,我是否应该考虑哪些因素?

当我读到扩展方法应该谨慎使用时,我已经避开了扩展方法,通常如果你无法访问你正在扩展的源?

干杯,

詹姆斯

2 个答案:

答案 0 :(得分:5)

  

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

  1. static“helper”类:Class c = ClassHelper.GetClass(DateTime);
  2. 实例类型的静态方法:Class c = Class.GetClass(DateTime);
  3. 静态扩展类/方法:类c = DateTime.GetClass();
  4. 我的建议是遵循the simplest thing that could possibly workcode cohesion的原则。

    这意味着避免扩展和辅助类,只需将工厂函数放在Class类定义中。除此之外,人们通常也会提供工厂功能。

答案 1 :(得分:3)

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

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

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