是在我可以很好地练习的时候使用静态类

本文关键字:候使用 静态类 练习 我可以 很好 | 更新日期: 2023-09-27 17:58:53

让我更准确一点。在我的winforms项目中,我创建类来管理/创建程序的每一部分。我这样做是为了更好地控制我的代码。例如,我有一个管理DataGridView控件的类。我把它命名为gridManager,在里面我设置了所有的属性、颜色等等,我还有一些方法可以更改这些设置(例如changeBackgroundColor()等)。对于splitContainer中的每个Panel,我也有这种类型的类。在这些类中,我初始化每个作为面板子级的控件,并将它们添加到该面板中,设置所有属性等等

我写这一切是为了让你更好地了解这些课程的目的。

现在我的问题是:将这些类设置为静态是否是一种好的做法?里面的所有控件和方法都是静态的?

起初我让它们是非静态的,但当我想调用方法(例如)从选项Form更改颜色时,我必须将MainForm作为参数传递,或者这样做:

(Application.OpenForm[0] as MainForm).gridManager.changeColor();

它的静态版本使它变得容易得多。但这让我怀疑这是否是一件好事。呃,很多解释,我希望我不完美的英语不会让它更难理解

是在我可以很好地练习的时候使用静态类

全局可变状态通常是个坏主意。

静态方法/类适用于简单的无副作用函数。CCD_ 1和CCD_。

另一方面,您希望控件位于静态字段中。这些都是可变状态,因此应该避免。例如,如果您明天想要有两个表单实例,则需要两个manager类实例。但是它是静态的,您现在需要使用它重写所有代码。

与任何东西一样,静态类也有权衡。脑海中浮现的两个"负面"因素是

  1. 不能从静态类继承
  2. 你不能(轻易)模拟静态类进行测试

但听起来在您的情况下,您无论如何都不会对这些类进行任何继承,所以在这种情况下,也许这是可以的。

编辑这是假设您正在做类似于控制工厂的事情
例如:var grid = GridManager.CreateGrid(options);

如果你正在做类似的事情

var data = GridManager.GetDataFromGrid(myGrid)

我可能会重新考虑。

静态类有自己的位置,但这可能不是其中之一,除非它是一个快速而肮脏的应用程序。如果您想对代码进行自动化测试,那么如果测试中的代码使用静态类作为首选项,那么这几乎是不可能的。

使用singleton模式可能会更好。通过这种方式,您可以在自动测试期间替换实现。

最好使用链接到该网格对象的普通类。如果您需要另一个网格对象,则可能需要实例化另一个实例。控制器不是静态类的最佳候选者。

它既不是好的也不是坏的做法,它只是某些任务的常见模式。

一般来说,对于与类类型相关但不依赖任何实例数据工作的功能,您会使用静态方法,典型的使用方法类似于工厂类型方法,它返回其所附类的初始化实例。

public SomeClass = SomeClass.CreateWithSomeInit(parms);

静态类当然有自己的位置,但我认为尽可能使用它们是一个糟糕的建议。

OOP的整个概念是围绕实例构建的,因此大多数时候应该使用非静态类。原因是什么?主要是灵活性。您可以让两个实例根据其内部状态以稍微不同的方式执行相同的操作。您可以有更多相同概念的实现,并且可以轻松地切换它们。您可以使用类似反转控制容器的东西。等等。