你应该避免静态类?(Should you avoid static classes?)

2019-07-03 10:52发布

在静态类被认为是不好的做法? 我读到这一篇文章,几天前(找不到了,抱歉)基本上说,有静态类(尤其是那些“助手”类)通常的错误代码的标志。 这是正确的,如果是这样,为了什么原因呢?

Answer 1:

静态类的滥用可以被认为是不好的做法。 但是,这样可以在任何语言功能的滥用。

我把仅有静态方法非静态类和静态类之间没有区别。 他们实际上是相同的事情,除了静态类让编译器强制开发商意图(没有实例化这个类,用于访问其功能方便的语法, 等等 )。

至于你说的“助手”类的激增可以让你陷入困境(设计,可维护性,可读性,可发现,另一能力......)。 这里没有说法。 但是你可以争辩说,一个“助手”类是从来没有合适? 我对此表示怀疑。

事实上,负责任地使用静态类可以有你的代码很大的好处:

  • Enumerable静态类提供了一组扩展方法,我们大多数人来爱。 它们的功能/业务逻辑的逻辑组不涉及任何特定类型的实例。
  • 由环境/上下文提供的服务:如日志,配置(有时)
  • 其他(我不能在此刻:)想)

所以,不,一般来说它不是不好的做法。 只需使用它们明智地...



Answer 2:

这是否意味着“静态类的用法是错误的”(在这种情况下,该物品是不正确的)或“静态类通常在糟糕的代码中发现”(在这种情况下,它不是说本身是静态类是坏的,但他们有时使用不正确)

静态函数比非静态更有效率,因为你并不需要创建一个对象的实例使用它们或this指针传递到方法调用。

使用静态类的持有全局变量是一个不同的问题 - 在这种情况下,潜规则是不是“静不好”,但“全局是不好的”。



Answer 3:

我觉得一般的说法是针对保持在静态类可变状态,基本上使用它们作为全局变量。 这没有什么错,在一个静态类的静态辅助方法。

而至于为什么全局变量是坏的,我敢肯定,在这里与和谷歌,你会发现一半的关于它的数以百万计的网页和博客文章。



Answer 4:

不,这不是真的正确。

有很多的不特定于对象的实例功能,并且不要求状态。 例如,考虑“数学”的功能。

几乎所有的语言都类似:

y = Math.round(x);

所以,“圆”的功能是静态的。 你可以,如果你是疯了,认为这样的事情(C#):

class RoundFunction<T> : GeneralMathFunction<T>
{
    public override T Operate (params object[] variables) {
        ..
    }
}

但是,恕我直言,你会有点怪异这样做。

当然,还有的时候,过多的静态函数的一些误入歧途的迹象,但是,在合理范围内,它不是“坏”。



Answer 5:

这里有一些链接到一些谷歌测试博客文章为什么静态方法可以伤害你的代码的可测试性,以及为什么静态方法(它是静态类的坏的部分)引进各种部件之间可能令人惊讶的连接和互动。

如何看待OO

单身

静态的方法,是死亡到可测试性



Answer 6:

在有些情况下你有一个实用工具类,所有的方法都是静态的需求。 在这种情况下,如果你让类的静态它清楚地表明你的意图。 而至少在C#中,你不能有一个静态内部类非静态方法。



Answer 7:

我使用静态实用工具类所有的时间在我的代码,这个被称为经常而是将实例化一个疼痛的方法。 一个例子是一个简单的日志类,如:

public static class Logging
{
  public static UpdateAction(int id, object data)
  {
     SqlConnection connection = new SqlConnection("conn string from config file");
     // more logic here...
  }
}

现在,没有办法我曾经有那些类和方法存储任何类型的全局状态,因为这样会导致巨大concurrancy问题,一般只是糟糕的设计。

所以,不要回避静态类,只是避免那些静态类保持某种全局状态。



文章来源: Should you avoid static classes?