【问题标题】:Is it a good practice to have static variables to store global, changing information?使用静态变量来存储全局的、不断变化的信息是一种好习惯吗?
【发布时间】:2011-04-09 15:18:13
【问题描述】:

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

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

【问题讨论】:

    标签: c# java oop static


    【解决方案1】:

    一般不是一个好主意,不...它确实可以简化一些事情,但它使测试变得更加困难(并且意味着你不能并行运行测试,例如)。

    日志记录等某些方面通常是这样实现的,但我倾向于尽量不这样做。在测试方面,依赖注入使生活更加简单。 (当您需要将依赖项传递给类 Foo 只是为了将其传递给 Bar,然后将其传递给 Baz 等时,这可能会变得很痛苦。我认为在依赖注入方面我们仍然不是很“有”。我认为一些更高级的东西围绕范围/生命周期将作为语言的一部分有用,但我们会看到......我看不到它发生在 C# 本身,请注意。)

    【讨论】:

      【解决方案2】:

      显然你的意思是Singletons。答案是:这通常不是一个好主意,因为它会在代码中创建难以遵循的依赖关系。这反过来又使您的代码难以理解、维护和扩展。更重要的是,它使单元测试变得困难。

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

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

      【讨论】:

      • 我也希望看到一个理由来否决我个人认为值得勾选的内容
      • 不知道谁投了反对票,但为了补偿我投了赞成票:P
      【解决方案3】:

      静态变量一般用final之类表示固定值

      public final static String JANUARY="january";
      

      【讨论】:

        【解决方案4】:

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

        但是它不会是一个好的 OOP。

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

        但是对于私有方法为了相同功能而从多个地方调用的方法,保持方法静态是一个好习惯,同样是FxCop 也建议。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  【解决方案9】:

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

                  【讨论】:

                  • 不,它不会 - 有关详细信息,请参阅其他答案。
                  • 值得商榷,因为单身人士通常定义良好的 OOD code.google.com/p/google-singleton-detector/wiki/…
                  • @Rune,您引用的消息来源似乎与您所说的相反。
                  • @Grozz,我喜欢编写单元测试,所以对我来说确实如此...... YMMV。关键是没有单个实例,例如一个配置类,但是你如何访问它。您可以随意使用依赖注入来传递单个实例,这不会像单点访问那样产生问题。
                  • @Peter 是的,但这只是因为我犯了一个有趣的错字。它应该说defy not 定义。在我的书中,Singleton 是一种反模式
                  猜你喜欢
                  • 2013-10-13
                  • 1970-01-01
                  • 2014-12-23
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-02-25
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多