代码之家  ›  专栏  ›  技术社区  ›  Adam Kane

全局静态类和方法坏吗?

  •  28
  • Adam Kane  · 技术社区  · 14 年前

    人们普遍认为,应该避免严重依赖全球资源。使用静态类和方法不是一回事吗?

    10 回复  |  直到 14 年前
        1
  •  51
  •   Timothy Baldridge    14 年前

    全局数据不好。但是,使用静态方法可以避免许多问题。

    我将担任 Rich Hickey 在这个问题上这样解释:

    要在C语言中构建最可靠的系统,请使用静态方法和类,但不要使用全局数据。例如,如果您将一个数据对象交给一个静态方法,并且该静态方法不访问任何静态数据,那么您可以确信,给定输入数据,函数的输出将始终是相同的。这是Erlang、Lisp、Clojure和其他人的立场 Functional Programming language

    使用静态方法可以大大简化多线程编码,因为如果编程正确,一次只有一个线程可以访问给定的数据集。这就是问题的症结所在。拥有全局数据是不好的,因为它是一种状态,谁知道哪个线程可以随时更改。然而,静态方法允许非常干净的代码,可以以较小的增量进行测试。

    我知道这会引起激烈的争论,因为它与C#的OOP思想过程背道而驰,但是我发现我使用的静态方法越多,我的代码就越干净和可靠。

    This video 比我能解释的更好,但是展示了不可变数据和静态方法如何产生一些非常线程安全的代码。


    让我再澄清一下全球数据的一些问题。恒定(或只读)全局数据并不像可变(读/写)全局数据那么重要。因此,如果有一个全局数据缓存是有意义的,那么就使用全局数据!在某种程度上,每个使用数据库的应用程序都会有这样的功能,因为我们可以说,所有的SQL数据库都是一个保存数据的巨大全局变量。

    所以,像我上面所说的那样做一个笼统的陈述可能有点强。相反,假设使用全局数据会带来许多问题,而使用本地数据可以避免这些问题。

    一些语言(如Erlang)通过将缓存放在单独的线程中来解决这个问题,该线程处理对该数据的所有请求。这样,您就知道对该数据的所有请求和修改都是原子的,全局缓存不会处于未知状态。

        2
  •  12
  •   Janick Bernet    14 年前

    static 不一定意味着全球性的。类和成员可以是 static private ,因此仅应用于特定类。也就是说,太多了 public static 成员而不是使用适当的方法传递数据(方法调用、回调等)通常是不好的设计。

        3
  •  6
  •   Andrew Anderson    14 年前

    然而,现实世界比理论更混乱,静力学通常是解决一些开发问题的非常有用的方法。在适当的时候适度地使用它们。

        4
  •  3
  •   Dean J    14 年前

    除此之外, final static

        5
  •  3
  •   Jeff Sternal    14 年前

    可变静态 变量 因为他们只是一个全球性的国家。我所知道的关于这个的最好的讨论 is here, under the heading "Why Global Variables Should Be Avoided When Unnecessary" .

    静态 有几个缺点,往往使他们不受欢迎-最大的一个是,他们不能使用多态性。

        6
  •  2
  •   Henk Holterman    14 年前

    这方面没有问题 静态方法

    (变量)。如果你宣布 公众的 类中的静态字段,这将是一个真正的全局变量,这将是不好的。

    但是让静电场 私有的

        7
  •  2
  •   Lajos Arpad    14 年前
    public class Foo
    {
        private static int counter = 0;
    
        public static int getCounterValue()
        {
             return counter;
        }
        //...
        public Foo()
        {
            //other tasks
            counter++;
        }
    }
    

    static关键字不是全局的,它告诉您它在类级别上,这在各种情况下都非常有用。总之,类级的东西是静态的,对象级的东西不是静态的。

        8
  •  2
  •   Jordão    14 年前

    静态方法用于实现 traits part . 正如DCI的支持者所说,这可以看作是 "higher order form of polymorphism"

    另外,静态方法也可以用来实现函数。这就是F#用来实现 modules . (还有 VB.NET )函数对函数编程很有用(毫不奇怪)。有时它们只是一些东西的建模方式(比如 Math 类)。再说一遍,C# comes close 在这里。

        9
  •  1
  •   Eric Petroelje    14 年前

    静态 数据 如果他们是无国籍的话,情况也不会那么糟。

        10
  •  0
  •   GalacticCowboy    14 年前

    不完全是。静态实际上决定了什么时候,什么地方,多久实例化一次,而不是谁有权访问它。