使用静态变量存储全局变化信息是一种好习惯吗?

时间:2010-09-08 09:20:05

标签: c# java oop static

使用静态变量来存储不同类所需的全局变化信息是一种很好的OOP实践吗?

而不是传递参数,以便被调用的类可以访问它。

9 个答案:

答案 0 :(得分:7)

它通常不是一个好主意,不是......它绝对可以简化一些事情,但它会使测试更加困难(例如,意味着您无法并行运行测试)。 / p>

某些方面(例如日志记录)通常是这样实现的,但我会倾向于尝试不这样做。依赖注入使得生活很多在测试方面更简单。 (当你需要将依赖关系传递给类Foo时,将它传递给Bar,然后将其传递给Baz等,这会变得很痛苦。我认为在依赖注入方面我们仍然没有“那里”。我认为某些事情围绕范围/生命周期更先进将是有用的语言的一部分,但我们会看到......我不能在C#本身看到它发生,请注意。)

答案 1 :(得分:6)

显然你的意思是Singletons。答案是:一般来说这不是一个好主意,因为它会导致很难跟踪代码中的依赖关系。这反过来又使您的代码难以理解,维护和扩展。更重要的是,它使单元测试变得困难。

如果方法正在使用全局对象,除了查看源代码之外,您无法知道它。但是,如果该方法仅使用其参数和类成员,则可以通过查看其签名和封闭类的定义来了解其依赖关系。

为使用全局对象的方法设置单元测试要比“普通”方法困难得多。此外,在每次测试之后,有人会忘记重置全局状态,这会导致全局状态转移到其他单元测试。这使得您的测试秘密依赖于执行顺序,这可能会产生奇怪的测试结果。

答案 2 :(得分:3)

  

静态变量通常用于表示final的固定值,如

public final static String JANUARY="january";

答案 3 :(得分:1)

根据我的观察,由于静态成员只被初始化一次,因此每次访问成员时都不会重新分配内存。

然而,这不是一个好的OOP。

这种方法的危险有时是,如果某人试图访问并修改错误的属性,您可能会得到一些意想不到的结果。

但是对于私有方法从多个地方调用以实现相同功能的方法,将方法保持为静态是一个很好的做法,同样是由FxCop建议。

答案 4 :(得分:0)

谁拥有这些信息?通常最好将信息包装到拥有它的类中,并且通过该类的静态函数访问它,我相信。

这也使得解决多线程访问问题变得更加容易,因为您可以将同步化机制放入这些函数中来控制访问。

答案 5 :(得分:0)

静态变量的使用为多线程应用程序带来了复杂性,因此通常不被认为是一个好主意。在单例类中包装此类数据允许您设置合适的锁定机制来管理对共享数据的访问。

答案 6 :(得分:0)

我认为更好的做法是使用包含所有可配置参数的* .properties文件。您还可以实现类似单线程的类*Configurator,它会将所有参数加载到您的应用程序中。

有很多开源库可以帮助您管理应用程序参数。 如果是Java:http://commons.apache.org/configuration/index.html

答案 7 :(得分:0)

不,尝试尽可能多地使用松耦合装置。如果您希望代码作为单独的内聚实体执行,则强烈建议不要使用静态变量共享全局信息。然而,你可以用它们来保持价值。但是,Enums在Java中存在。所以,我建议不要使用它们。

答案 8 :(得分:-2)

将它们组合在某些属性类中并将它们作为单例实现它们将是一种可接受的OOP实践。