代码之家  ›  专栏  ›  技术社区  ›  aberrant80

全局常量是反模式的吗?

  •  11
  • aberrant80  · 技术社区  · 16 年前

    我一直认为,仅仅为了保持常量而创建一个类是一个糟糕的设计。但最近,我在google上搜索,发现 界面 因为常量是坏的反模式——更不用说使用一类常量了。

    我的观点是,由于一类常量与全局变量的差别不大,所以我反对它,并倾向于将此类类重构掉。它创建了一类绝对没有上下文的数据。这些常量最好与实际使用它们的任何对象绑定,以赋予它们上下文和意义,并使它们封装在一个类中。

    其他人怎么想?

    7 回复  |  直到 15 年前
        1
  •  14
  •   gustafc    16 年前

    全球常数并不是坏事,只要它们是…

    1. …不可变-全局的, final / readonly 引用一个可变对象(如Java) ArrayList<T> 或C List<T> )不是常量,而是全局状态。
    2. …>1类需要。如果只有一个类需要您的常量,请将这些常量直接放到该类中。(注意:适当平衡干燥与雅格尼。)

    布洛赫在“有效Java”中覆盖“常量接口”与“常数类”问题,并提倡“常数类”方法。您不希望在接口中使用常量的原因是,它诱使客户机类“实现”该接口(以便访问常量,而不使用接口名称前缀它们)。不过,您不应该这样做——接口实际上不是对象功能的接口,而是类的外部类型中固有的编译时便利性。考虑一下:

    interface C { public static final int OMGHAX = 0x539; }
    class A implements C { ... }
    class B { private A a; }
    

    等级 B 现在不必要地依赖于 C . 如果执行 A 更改以使它不需要来自 C ,不能删除 implements C 在不破坏其外部接口的情况下-某人(可以说是一个非常愚蠢的人,但这样的人很多)可能会引用 对象通过 C 参考文献!

    通过将常量放入类中,并使该类不可实例化,可以通知客户机常量类实际上只是作为子命名空间工作。在C中,您将类标记为 static ,在Java中,你想让它 最终的 并给出一个不可访问的构造函数:

    final class C { 
        private C() { throw new AssertionError("C is uninstantiable"); }
        public static final int OMGHAX = 0x539; 
    }
    

    如果您在爪哇编程,并且希望常数不预先用常数类名预先装入,则可以使用 import static 功能。

    是的,它是稍微多余的,被迫创建一个新的类型,只是有地方放你的常量,但这是一个疣的语言,如Java和C,我们必须处理-我们 把我们的常数 在某处 而我们的最佳选择恰好是一个不可实例化的类。

        2
  •  25
  •   yfeldblum    16 年前

    全局常量是可以的。

    全局(非常量)变量是魔鬼的工作。

        3
  •  10
  •   Jim Ferrans    15 年前

    全局变量是有问题的,因为它们在模块之间引入了大量不必要的依赖关系。这些依赖性使得调试问题和重用代码变得更加困难。

    我想说 真正地 由于同样的原因,全局常量也是有问题的,因此不要让一个名为myglobals的单例常量包含像myglobals.http_success_ok这样的常量,而是将类似常量打包在自己的类中,例如httpstatus.success_ok。

        4
  •  5
  •   Samuel Carrijo    16 年前

    我认为全局变量的问题在于它们创造了全局状态。全局常量不这样做,但它们确实负责某些无上下文常量,这可能很糟糕。

    如果您需要这样的东西,我建议您创建枚举(如果您有int常量),或者为常量创建静态类,这样您就可以为它们提供一些上下文(例如math.pi)。

        5
  •  4
  •   Jason Baker    16 年前

    我想有一件事没有被提及,那就是更务实的问题。如果您使用的是编译语言,请记住必须重新编译才能更改常量的值。如果这是一个您可能希望经常更改的值,那么您可能还需要考虑配置文件。

        6
  •  2
  •   Erich Kitzmueller    16 年前

    在某些情况下,全局常量是真正保持不变的最佳方式(不仅对于程序的一个构建是恒定的,而且应该在软件产品的整个生命周期以及之后)。

    例如,您不希望有几个类分别为pi、e或http_成功声明自己的常量。

    另一方面,如果全局变量是可以更改的任意值(例如,由于需求的变化),则全局常量可能会产生许多全局变量的问题。也就是说,如果将这些常量放入配置文件似乎是一个合理的选项,那么它不应该是全局常量。

        7
  •  0
  •   SwDevMan81    16 年前

    全局变量已被广泛认为是一件坏事,一般应予以避免。这就是为什么这么多人对单例模式有异议。全局变量的问题在于它们是可传递的。