具有静态方法的静态类是否被视为SOLID?


27

SOLID包括Liskov替换原理 ,其概念是“程序中的对象应该可以用其子类型的实例替换,而不会改变该程序的正确性”。

由于带有静态方法的静态类(有点类似于Math该类)根本没有实例,因此,如果我具有带有静态方法的静态类,我的系统是否被视为SOLID?


我认为这个问题很好。让我们看看社区所能提供的。
2011年

1
数学类不包括状态。因此,您永远不会真正传递此类对象。所以我不确定这有什么关系。
马丁·约克

我不认为静态类真的可以说是纯SOLID(出于与上述相同的某些原因),但是我认为它们是DRY原理的强大倡导者和工具。
dreza 2011年

2
为何如此?根据我的经验,对静态类的过度使用通常会导致人们始终用一半的代码永久地重复操作一个全局静态上帝对象​​。
back2dos

1
我想我在考虑实用程序类方面提供更多的通用代码。我同意它们很容易并且经常被滥用,但是仍然认为它可以提供有用的手段来将状态
不重要的

Answers:


27

LSP适用于将类的实例传递到方法中,使该方法对该实例执行某些操作,并经常产生某种结果。这对于静态类无关紧要,因为在C#中,您无法创建静态类的实例。

更重要的是,静态类是密封的,因此不能被继承。这使您的问题在C#范围内无济于事。

您可以说静态类始终与LSP兼容,因为您永远无法生成会违反该原理的子类。您也可以说,出于相同的原因,静态类从不符合LSP。


在Java中,静态类略有不同。您不能将顶级类标记为“静态”,因此,如果要创建类似于C#静态类的实用程序类,则必须将其声明为,final并隐藏其构造函数。但是,一旦这样做,它们的行为就类似于C#-您无法实例化它们或将其子类化。您可以将内部类声明为static,但这并不意味着与C#中的事情相同:它仅表示嵌套的顶级类

据我所知,在这种情况下,VB.NET的行为与C#完全相同。


您没有提到您是否对其他原则感兴趣,但是为了完整起见,我还是将它们包括在内。

小号英格尔责任原则:静态类容易遵循这个原则。
Ø笔/闭原理:因为静态类是密封的,他们不能永远遵循这一原则。
L iskov替代原理:如上所述。
覆盖整个院落隔离原则:不适用于单个类,但分裂一个大的静态类成更小的,更专业的人可能是对这一原则的一个步骤。
d ependency倒置原则:静态类无法实现的接口,因此使用它的任何类总是依赖于任何执行时就存在。因此,静态类违反了该原理。

由于静态类不满足所有5个条件,因此它们不是SOLID。


因为要成为SOLID,则意味着我们必须满足所有5个条件,这并不意味着它们不是SOLID吗?
2011年

1
@Pacerier是的,但是如果不需要的话,不应该一直试图将一个类塞进SOLID中。这取决于类的上下文。如果是实用程序类之类的,IMO可以不要是“ SOLID”,但如果它是具有特定域用法的实际域类,则可以…
Wayne Molina

4

我不会将此类归类为面向对象,因此我会说它不能(也不应该尝试)满足面向对象设计的原则。

这些类只是无法以Java和C#之类的语言在类外部提供代码的变通办法。如果可以的话,应该将它们定义为独立函数,因为它们不会从面向对象中获得任何好处。


我不同意将单独的功能放在课堂之外。使用通用名称对相关功能(无论是否静态)进行分组的简单功能对于提高可读性很有用。数学函数完全符合要求。
jojo 2011年

2
@jojo同意。支持在类外部定义的功能的语言也支持这些功能的逻辑分组,例如C ++中的名称空间。
吉安(Gyan)加里·巴伊(Gary Buy)2011年

2

值得一提的是,由于您未指定任何语言,因此在C ++中,您可以传递仅具有静态成员的类并通过模板访问这些成员,因此可以用仅具有静态成员的类代替方法称为“界面”。


vb.net / C#/ Java的
Pacerier
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.