替代无状态对象的静态类

时间:2009-07-20 09:19:46

标签: .net design-patterns

在过去一年左右的时间里,我遵循的想法是,如果一个方法可以是静态的,那么使它成为静态的,因为这可以带来性能上的好处,因此我在应用程序中最终得到了一些静态类。 / p>

我已经了解到,性能优势通常不足以使其值得,而且可以使静态方法的区别,也许不应该从设计的角度来看,如果它们更具体的话对象,而不是类型 - related question

作为一个例子,我最近创建了一个FileRepository类,它实现了我们自己的File类的存储库模式(例如导入文件)。此类不是静态的,必须首先创建存储库对象才能访问它。

我的问题是,所有我的旧静态调用,现在是2行(除非我可以在本地范围内重用该对象)。存储库对象(尚未)没有状态,因为它通过线程静态变量使用数据库访问。

我的问题是,人们对在类上拥有线程静态Current属性的看法是什么,get访问器在第一次调用时初始化对象?据我了解,这仍然可以避免静态类的缺陷,例如无法通过接口实现通用功能,但仍然提供对存储库对象的单行调用的简易性?

只是尝试更好地调整我的做法和心态。

3 个答案:

答案 0 :(得分:5)

静态趋势会影响可测试性。

特别是,你会发现测试使用存储库的任何东西都比较困难。它不是在每次调用时创建 new 存储库,而应该是需要它的任何事物的状态的一部分。使用依赖注入来提供存储库,该存储库实现适当的接口。然后,您可以通过模拟它来测试使用存储库的任何内容。

当然,这是一种理想主义的解决方案,可能不是您案例的实用解决方案 - 但它通常是面向对象的解决方案。

可以拥有“当前”存储库并且仍然可以合理地测试,但它仍然需要静态状态,这通常是不受欢迎的。这是一种轻微的代码味道,但它至少会比静态方法更好。

答案 1 :(得分:1)

使用静态内容并始终保持对依赖项的直接引用的一个好处是能够轻松地模拟和单元化测试对象。如果直接引用静态类或当前属性,则会失去此功能。

答案 2 :(得分:0)

您需要解释您所谈论的性能下降程度。我们在谈论微秒吗?

通常,运行探查器并查找有问题的代码可以提高应用程序性能。以ANTS分析器为例。

我常常发现70%的时间都是数据库访问的罪魁祸首。