繁体   English   中英

制作方法全部静态

[英]Making Methods All Static in Class

我的同事基于我的一个类(它是一个实例类)告诉我,如果你的类中没有字段(支持字段),只需在类中使所有方法都是静态的,或者让类成为单例,这样你就可以了不必使用关键字new来调用此BL类中的方法。

我认为这是常见且良好的做法? 基本OOP? 我只是想看看人们对此的看法。

我认为基本上他说的是因为没有状态,所以不需要将方法作为实例方法。

在这种情况下,我不确定每次作为一个选项让它成为一个单身......是他给我的某种模式或好建议吗?

这是我正在讨论的类(请不要在此主题中重新发布任何代码,这是私有的): http//www.elbalazo.net/post/class.txt

调用new和构造类引用几乎没有什么缺点,特别是如果类没有状态。 在.NET中分配速度很快,因此我不会单独使用它作为类静态的理由。

通常情况下,如果类没有特定的上下文,我觉得类应该是静态的 - 如果你将类作为“实用程序”方法或非上下文特定操作的占位符使用,那么成为静态类是有意义的。

如果该类具有特定的上下文需求和具体意义,那么即使它没有状态,它也可能无法证明是静态的(尽管这种情况很少见)。 有时候类的目的是由它的引用本身定义的,它提供了一个排序的“状态”(引用本身)而没有任何局部变量。

话虽如此,静态类和单例之间存在很大差异。 单例是一种不同的动物 - 当你需要一个实例时,你想要使用它,但只需要创建一个类的一个实例。 单例中有状态,但您使用此模式强制只有一个状态副本。 这有着非常不同的含义,我强烈建议避免使用单例来防止需要“调用新”。

当一个类应该是静态的时候没有绝对的规则。 它可能没有状态,但您可能需要它用于引用相等或锁定。 当类的目的适合作为静态类实现时,类应该是静态的。 在这些情况下,你不应该遵循严格的规则; 用你感觉'是对的。

没有状态使它成为静态的候选者,但在进行仲裁重构之前,先看一下它的用途。

单独缺乏状态就没有理由让方法变得静止。 有很多情况下无状态类仍然应该有实例方法。 例如,每当你需要在例程之间传递某些逻辑的特定实现时,使用具有实例方法的类就更容易,因为它允许我们使用接口:

interface IConnectionProvider
{
    object GetConnectedObject();
}

我们可以有上面的十几个实现,并将它们传递给需要IConnectionProvider例程。 在这种情况下,静态是一个非常笨拙的选择。

在无状态类中使用new来使用方法没有任何问题。

只要您不需要从类中创建任何抽象,那么静态方法就可以了。 如果您的类需要被模拟或实现任何类型的接口,那么您最好使该类成为单例,因为您不能在类上模拟静态方法。 您可以使用单例实现接口,并且可以从单例继承实例方法,而不能继承静态方法。

我们通常使用单例而不是静态方法来允许我们的类很容易抽象。 这已经帮助进行了多次单元测试,因为我们遇到了我们想要模拟某些东西的场景,并且很容易这样做,因为行为是作为单例上的实例方法实现的。

实用程序类通常由不需要状态的独立方法组成。 在这种情况下,最好将这些方法设为静态。 您也可以使类静态,因此无法实例化。

使用C#3,您还可以利用扩展方法,这些扩展方法将使用这些方法扩展其他类。 请注意,在这种情况下,需要使类成为静态。

public static class MathUtil
{
    public static float Clamp(this float value, float min, float max)
    {
        return Math.Min(max, Math.Max(min, value));
    }
}

用法:

float f = ...;
f.Clamp(0,1);

我可以想到很多没有成员的非静态类的原因。 例如,它可以实现接口并提供另一个接口的/扩充行为。 对于二,它可能具有允许自定义的虚拟或抽象方法。 基本上使用'静态'方法是程序编程最差,与面向对象设计相反。

话虽如此,通常小的实用程序例程最好用程序实现完成,所以如果有意义的话不要回避。 考虑String.IsNullOrEmpty()是程序静态例程的一个很好的例子,它提供了不作为方法的好处。 (好处是它还可以检查字符串是否为null)

围栏另一侧的另一个例子是序列化例程。 它不需要任何成员。 假设它有两种方法Write(Stream,Object)和对象Read(Stream)。 这不是一个对象,静态方法就足够了; 但是,成为一个对象或接口是有意义的。 作为一个对象,我可以覆盖它的行为,或者稍后更改它的实现,以便它缓存有关它序列化的对象类型的信息。 通过使它成为一个开始的对象,你不要限制自己。

大多数情况下,使类静态化是可以的。 但更好的问题是为什么你没有州的课?

在非常少见的情况下,无状态类是良好的设计。 但无状态类打破了面向对象的设计。 它们通常是功能分解的回归(面向对象技术变得流行之前的所有愤怒)。 在使类静态化之前,请问自己,它正在处理的数据是否应该包含在类中,或者是否应该在可能存在或可能不存在的其他类之间拆分实用程序类中的所有功能。

确保你有充分的理由让类静态化。

根据框架设计指南:

静态类应仅用作框架的面向对象核心的支持类。

不要将静态类视为杂项桶。

班上应该有明确的章程。

静态类,静态方法和Singleton类是三个不同的概念。 静态类和静态方法通常用于实现严格的实用程序类或使它们无状态,因此是线程安全的并且可以同时使用。

静态类不必是单例。 Singleton意味着只有一个类的实例,否则它是可实例化的。 它通常用于封装真实单个资源实例的物理世界表示,例如单个数据库池或单个打印机。

回到你同事的建议 - 我倾向于同意这是一个合理的建议。 如果方法是静态的,当它们可以是静态的时,则不需要实例化类。 它使调用者代码更具可读性,并且调用的方法更容易使用。

听起来你正在谈论一个严格的Utility类,在这种情况下,没有理由有单独的实例。

使这些实用程序方法静态。 如果您愿意,可以将该类保留为常规对象(以允许将来添加实例方法/状态信息)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM