静态类被认为是不好的做法吗?几天前我读过一篇关于此的文章(抱歉找不到),该文章基本上说拥有静态类(尤其是那些“帮助程序”类)通常是糟糕代码的标志。这是正确的吗?如果是,原因是什么?

有帮助吗?

解决方案

滥用静态类可以被认为是不好的做法。但滥用任何语言功能也是如此。

我不区分仅具有静态方法的非静态类和静态类。它们实际上是同一件事,除了静态类允许编译器强制执行开发人员的意图(没有实例化此类,访问其功能的方便语法, ETC).

正如你所说,“Helper”类的激增会给你带来麻烦(设计、可维护性、可读性、可发现性、其他能力......)。这里没有争论。但是你能说“Helper”类是 绝不 合适的?我对此表示怀疑。

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

  • Enumerable 静态类提供了一组我们大多数人都喜欢的扩展方法。它们是一组逻辑功能/业务逻辑,与任何特定类型的实例无关。
  • 环境/背景提供的服务:例如日志记录、配置(有时)
  • 其他(我暂时想不起来:))

所以不,总的来说,这不是坏习惯。只要明智地使用它们...

其他提示

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

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

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

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

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

不,这不是真的正确。

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

几乎所有的语言都类似:

y = Math.round(x);

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

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

不过,恕我直言,你会有点怪异这样做。

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

下面是一些链接到一些谷歌测试博客文章为什么静态方法可以伤害你的代码的可测试性,以及为什么静态方法(它是静态类的坏的部分)引进各类潜在的令人吃惊的联结与互动组件之间。

如何思考OO

单身

静态方法-为─死亡至可测试性

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

我使用静态实用工具类所有的时间,我对于那些所谓的经常方法的代码,但会是一个痛苦的实例化。一个例子是一个简单的日志类,如:

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top