¿Las clases estáticas con métodos estáticos se consideran SOLIDAS?

27

SOLID incluye el principio de sustitución de Liskov que tiene la noción de que "los objetos en un programa deben ser reemplazables con instancias de sus subtipos sin alterar la corrección de ese programa".

Dado que las clases estáticas con métodos estáticos (un poco como la Mathclase) no tienen instancias, ¿mi sistema se considera SOLIDO si tengo clases estáticas con métodos estáticos?

Pacerier
fuente
Creo que esta pregunta es genial. Veamos qué ofrece la comunidad.
Saeed Neamati
1
Una clase de matemáticas no incluye estado. Así que nunca estás pasando objetos de este tipo. Así que no estoy seguro de cómo esto es relevante.
Martin York
No creo que se pueda decir que las clases estáticas sean SÓLIDAS puras (por muchas de las mismas razones que ya se mencionaron), sin embargo, las consideraría un gran defensor y una herramienta para el principio DRY.
dreza
2
¿Cómo es eso? Según mi experiencia, el uso excesivo de clases estáticas en su mayoría da como resultado que las personas se repitan todo el tiempo con la mitad del código manipulando permanentemente un objeto de dios estático global.
back2dos
1
Supongo que estoy pensando más en términos de clases de utilidad para proporcionar código común. Estoy de acuerdo en que son fácilmente y con frecuencia son mis-utilizadas, pero todavía piensan que la pueden proporcionar medios Utiles para agrupar juntas código común donde el estado no es un problema
dreza

Respuestas:

27

LSP se aplica a pasar una instancia de una clase a un método, hacer que el método haga algunas cosas con esa instancia y, a menudo, produce algún tipo de resultado. Esto no importa para las clases estáticas, ya que en C # no puede crear una instancia de una clase estática.

Aún más importante, las clases estáticas están selladas y, por lo tanto, no se pueden heredar. Esto hace que su pregunta sea discutible en lo que respecta a C #.

Se podría decir que las clases estáticas siempre cumplen con LSP, ya que nunca se puede producir una subclase que viole ese principio. También se podría decir que las clases estáticas nunca son compatibles con LSP por la misma razón.


En Java, las clases estáticas son ligeramente diferentes. No puede marcar una clase de nivel superior como "estática", por lo que si desea crear una clase de utilidad similar a las clases estáticas de C #, debe declararla finaly ocultar su constructor. Sin embargo, una vez que haces eso, se comportan de manera similar a C #: no puedes crear instancias de ellos ni subclasificarlos. Puede declarar una clase interna como static, pero eso no significa lo mismo que en C #: simplemente denota una clase anidada de nivel superior .

VB.NET se comporta exactamente de la misma manera que C # en este caso, que yo sepa.


No mencionó si está interesado en los otros principios, pero los incluiré de todos modos para completar.

S principio de responsabilidad ingle : una clase estática seguir fácilmente este principio.
O lápiz / principio cerrado : como las clases estáticas están selladas, no pueden seguir este principio. Principio de sustitución de
L iskov : como arriba.
Me principio de la segregación Nterface : no se aplica a una sola clase, pero la división una gran clase estática en los más pequeños, más especializado que podría ser un paso para dar continuidad a este principio.
D principio ependency inversión : clases estáticas no pueden implementar interfaces, por lo que cualquier clase de usarlo siempre dependerá de lo que sea puesta en práctica existe en el momento. Las clases estáticas, por lo tanto, violan este principio.

Como las clases estáticas no satisfacen los 5 criterios, no son SÓLIDAS.

Adam Lear
fuente
Dado que ser SÓLIDOS significa que tenemos que cumplir los 5 criterios, ¿no significa eso que no son SÓLIDOS?
Pacerier
1
@Pacerier Sí, pero uno no debería tratar de calzar una clase en SOLID todo el tiempo si no es necesario; Depende del contexto de la clase. Si es una clase de utilidad o algo así, está bien IMO no ser "SÓLIDO", pero si es una clase de dominio real que tiene un uso de dominio específico ...
Wayne Molina
4

No clasificaría una clase como orientada a objetos y, por lo tanto, diría que no puede (y no debería tratar de) cumplir con los principios del diseño orientado a objetos.

Estas clases son simplemente una solución a la incapacidad de proporcionar código fuera de una clase en lenguajes como Java y C #. Si pudieran serlo, deberían definirse como funciones independientes ya que no obtienen ningún beneficio de la orientación a objetos.

Gyan alias Gary Buyn
fuente
No estaría de acuerdo con poner funciones independientes fuera de la clase. La capacidad simple de agrupar funciones relacionadas (estáticas o no) bajo un nombre común es útil para facilitar la lectura. Las funciones matemáticas se ajustan perfectamente.
jojo
2
@jojo De acuerdo. Los lenguajes que admiten funciones definidas fuera de las clases también admiten la agrupación lógica de estas funciones, por ejemplo, espacios de nombres en C ++.
Gyan, alias Gary Buyn, el
2

Vale la pena mencionar, ya que no especificó ningún lenguaje, que en C ++ puede pasar clases que solo tienen miembros estáticos y acceder a esos miembros a través de la plantilla, y por lo tanto, es posible sustituir una clase con solo miembros estáticos, y posiblemente, los métodos llamado forma es "interfaz".

DeadMG
fuente
vb.net / c # / java
Pacerier