全局静态类和方法都不好吗?

Ada*_*ane 29 .net c# language-agnostic oop

人们普遍认为应该避免严重依赖全球性的东西.不会使用静态类和方法是一回事吗?

Tim*_*dge 46

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

我将把Rich Hickey的位置放在这个位置并解释如下:

要在C#中构建最可靠的系统,请使用静态方法和类,而不是全局数据.例如,如果您将数据对象交给静态方法,并且该静态方法不访问任何静态数据,那么您可以放心,给定输入数据,函数的输出将始终相同.这是Erlang,Lisp,Clojure以及其他所有函数式编程语言所采取的立场.

使用静态方法可以大大简化多线程编码,因为如果编程正确,一次只有一个线程可以访问给定的数据集.而这正是它归结为的.拥有全局数据是不好的,因为它是一个可以由谁知道什么线程,任何时候都可以改变的状态.然而,静态方法允许非常干净的代码,可以以较小的增量进行测试.

我知道这会引起激烈的争论,因为它面对C#的OOP思维过程,但我发现我使用的静态方法越多,我的代码越干净,越可靠.

这个视频比我能更好地解释它,但展示了不可变数据和静态方法如何产生一些极其线程安全的代码.


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

所以像我上面那样做一个全面的陈述可能有点强.相反,让我们说拥有全局数据会引入许多问题,而这些问题可以通过使用本地数据来避免.

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

  • +1的全局数据很糟糕.但是,使用静态方法可以避免许多问题.这将静态数据与静态方法区分开来. (7认同)
  • 在不使用全局数据的情况下,您能否详细说明一下如何不浪费IIS服务器上的内存,在该服务器上每个请求都会生成数十个查找,映射和字典,每个连接可能占用10-20 MB?我认为笼统的声明“全局数据不好”将导致Web开发人员做出一些糟糕的设计选择。 (2认同)

Jan*_*net 11

static并不一定意味着全球化.类和成员可以是static private,因此仅适用于特定类.也就是说,拥有太多public static成员而不是使用适当的方法来传递数据(方法调用,回调等)通常是糟糕的设计.

  • 我非常了解私有静态意味着什么.私有静态成员并不是全局访问的(即,除了声明之外的任何其他类).当然,它的数据是全球性的,但没有hackery,它不具备全球**. (10认同)
  • 但它仍然存在与全局数据相同的问题,即访问该数据的任何内容都将修改每个其他线程/方法调用所使用的相同数据.这是全局或静态数据的真正问题,它破坏了代码的确定性,并使调试和维护变得更加困难,因为您无法知道修改代码的方法.C#对象中的静态私有数据实际上与C中的文件全局变量不同.两者都有相同的缺点 (5认同)
  • `static private`数据仍然是全局的,尽管它只对相关类可见. (4认同)
  • 您在此处的目标更多是并行数据访问问题而非静态成员问题.不同线程使用的同一条数据的问题与静态或非静态数据无关.公共静态数据的问题在于,通常会错过在类/对象之间传递一些信息,而不是将相应的数据作为参数传递给方法.在静态"注册表"上引入了一些对该存储库的高耦合/依赖.这是我用public static看到的问题,肯定不适用于私有静态. (4认同)

And*_*son 6

如果你试图对你的面向对象开发纯粹主义,那么静力学可能不适合模具.

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