我的同事基于我的一个类(它是一个实例类)告诉我,如果你的类中没有字段(支持字段),只需在类中使所有方法都是静态的,或者使类成为单例这样您就不必在此BL类中使用关键字new来调用方法。
我认为这是常见且良好的做法?基本OOP?我只是想看看人们对此的看法。
我认为基本上他说的是因为没有状态,所以不需要将方法作为实例方法。
我不确定在这种情况下每次作为一个选项让它成为一个单身......是他给我的某种模式或好建议吗?
这是我正在讨论的课程(请不要在此主题中重新发布任何此代码,这是私有的):http://www.elbalazo.net/post/class.txt
答案 0 :(得分:13)
调用new和构造类引用几乎没有什么缺点,特别是如果类没有状态。在.NET中分配很快,所以我不会单独使用它作为一个静态类的理由。
通常情况下,如果类没有特定的上下文,我认为类应该是静态的 - 如果你将类作为“实用程序”方法或非上下文特定操作的占位符使用,那么它是有意义的静态类。
如果该类具有特定的上下文需求和具体意义上的含义,那么即使它没有状态,它也可能无法证明是静态的(尽管这种情况很少见)。有时候类的目的是由它的引用本身定义的,它提供了一种排序的“状态”(引用本身)而没有任何局部变量。
话虽如此,静态类和单例之间存在很大差异。单例是一种不同的动物 - 当你需要一个实例时,你想要使用它,但只需要创建一个类的一个实例。单例中有状态,但您使用此模式强制只有一个状态副本。这有着非常不同的含义,我强烈建议避免使用单例来防止需要“调用新”。
答案 1 :(得分:7)
当一个类应该是静态的时候没有绝对的规则。它可能没有状态,但您可能需要它用于引用相等或锁定。当类的目的适合作为静态类实现时,类应该是静态的。在这些情况下,你不应该遵循严格的规则;使用你'感觉'是正确的。
没有状态使它成为静态的候选者,但在进行任意重构之前,先看一下它的用途。
答案 2 :(得分:5)
单独缺乏状态是没有理由使方法静态。在很多情况下,无状态类仍然应该有实例方法。例如,每当你需要在例程之间传递某些逻辑的特定实现时,使用具有实例方法的类就更容易,因为它允许我们使用接口:
interface IConnectionProvider
{
object GetConnectedObject();
}
我们可以有上面的十几个实现,并将它们传递给需要IConnectionProvider
的例程。在这种情况下,静态是一种非常笨拙的选择。
使用new
在无状态类中使用方法没有任何问题。
答案 3 :(得分:2)
只要您不需要从类中创建任何抽象,那么静态方法就可以了。如果您的类需要被模拟或实现任何类型的接口,那么您最好使该类成为单例,因为您不能在类上模拟静态方法。您可以使用单例实现接口,并且可以从单例继承实例方法,而不能继承静态方法。
我们通常使用单例而不是静态方法来轻松地抽象我们的类。这已经帮助进行了多次单元测试,因为我们遇到了我们想要模拟某些东西的场景,并且很容易这样做,因为行为是作为单例上的实例方法实现的。
答案 4 :(得分:1)
实用程序类通常由不需要状态的独立方法组成。在这种情况下,最好将这些方法设为静态。你也可以使类静态,因此无法实例化。
使用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);
答案 5 :(得分:0)
我可以想到很多没有成员的非静态类的原因。例如,它可以实现接口并提供另一个接口的/扩充行为。对于二,它可能具有允许自定义的虚拟或抽象方法。基本上使用'静态'方法是程序编程最差,与面向对象设计相反。
话虽如此,通常小的实用程序例程最好用程序实现完成,所以如果有意义的话不要回避。考虑String.IsNullOrEmpty()是程序静态例程的一个很好的例子,它提供了不作为方法的好处。 (好处是它还可以检查字符串是否为空)
围栏另一侧的另一个例子是序列化例程。它不需要任何成员。假设它有两种方法Write(Stream,Object)和对象Read(Stream)。这不是一个对象,静态方法就足够了;但是,成为一个对象或接口是有意义的。作为一个对象,我可以覆盖它的行为,或者稍后更改它的实现,以便它缓存有关它序列化的对象类型的信息。通过让它成为一个开始的对象,你不要限制自己。
答案 6 :(得分:0)
大多数情况下,使类静态化是可以的。但更好的问题是为什么你没有州的班级呢?
非常少见的情况是无状态类是好的设计。但无状态类打破了面向对象的设计。它们通常是功能分解的回归(面向对象技术变得流行之前的所有愤怒)。在使类静态化之前,请问自己,它正在处理的数据是否应该包含在类中,或者是否应该在可能存在或可能不存在的其他类之间拆分实用程序类中的所有功能。
答案 7 :(得分:0)
确保您有充分的理由让类静态化。
根据框架设计指南:
静态类只能用作 支持班级 面向对象的框架核心。
不要将静态类视为杂项存储桶。
应该有明确的章程 上课。
答案 8 :(得分:0)
静态类,静态方法和Singleton类是三个不同的概念。静态类和静态方法通常用于实现严格的实用程序类或使它们成为无状态,因此是线程安全的并且可以同时使用。
静态类不一定是单身人士。 Singleton意味着只有一个类的实例,否则它是可实例化的。它通常用于封装真实单个资源实例的物理世界表示,例如单个数据库池或单个打印机。
回到你同事的建议 - 我倾向于同意这是一个合理的建议。如果方法是静态的,当它们可以是静态的时,则不需要实例化类。它使调用者代码更具可读性,并且调用的方法更容易使用。
答案 9 :(得分:-1)
听起来你正在谈论一个严格的Utility类,在这种情况下,没有理由有单独的实例。
将这些实用程序方法设为静态。如果您愿意,可以将该类保留为常规对象(以允许将来添加实例方法/状态信息)。