2011-09-05 101 views
4

我正在寻找解决以下问题的最佳实践方法。Static Helper类与实例类的静态方法vs扩展方法

我想人民的意见是哪种方法(),他们会用,为什么呢,以下场景:

我有这是由工厂已指定日期时被实例化一个Class

我应该使用哪种方法?

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

目前我倾向于更多地转向静态辅助类,因为我从来不采取了在实例类上使用静态工厂方法的方法,但对于我来说,在类上使用静态方法似乎是有意义的。

当谈到单元测试或组织测试时,我应该考虑什么?

因为我读过扩展方法应该谨慎使用,通常如果您无法访问您正在扩展的源代码,我目前已经避开了扩展方法。

干杯,

詹姆斯

+0

在不知道情况下很难回答这个问题,因为如果它们不是特殊情况,你可以使用构造函数。但最后几乎肯定是可怕的。 – mquander

回答

5

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

  1. 静态 “助手” 等级:Class C = ClassHelper.GetClass(日期时间);
  2. 关于实例类型的静态方法:Class c = Class.GetClass(DateTime);
  3. 静态扩展类/方法:Class c = DateTime.GetClass();

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

这意味着要避免扩展和帮助类,并将工厂函数放在Class类定义中。除此之外,人们通常会把工厂功能放在这里。

3

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

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

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