Pregunta

Se clases estáticas considera una mala práctica? He leído un artículo sobre esto hace un par de días (no lo encuentra, lo siento) que básicamente dice que tienen clases estáticas (especialmente las clases de ayuda '') son generalmente un signo de mal código. Si esto es correcto, y si es así, por qué razones?

¿Fue útil?

Solución

El abuso de clases estáticas puede ser considerada una mala práctica. Pero lo que puede el abuso de cualquier característica del lenguaje.

No hago ninguna distinción entre una clase no estática con sólo métodos estáticos y una clase estática. Ellos son efectivamente lo mismo, excepto que las clases estáticas permiten que el compilador para hacer cumplir los desarrolladores intención (sin instanciar esta clase, la sintaxis conveniente para acceder a su funcionalidad, etc ).

Como usted dice, una proliferación de clases "ayudante" se puede meter en problemas (diseño, facilidad de mantenimiento, facilidad de lectura, de descubrimiento, otros-habilidades ...). No hay discusión aquí. Sin embargo, se puede argumentar que una clase de "ayudante" es no apropiado? Lo dudo.

De hecho, el uso responsable de las clases estáticas puede tener grandes beneficios a su código:

  • La clase estática Enumerable proporciona un conjunto de métodos de extensión mayoría de nosotros hemos llegado a amar. Son un conjunto lógico de la lógica funcionalidad / negocio que no está relacionada una instancia de cualquier tipo particular.
  • Los servicios proporcionados por el entorno / contexto: por ejemplo, registro, configuración (a veces)
  • Otros (que no puedo pensar en la actualidad))

Así que no, en general, no es una mala práctica. Sólo tiene que utilizar con prudencia ...

Otros consejos

Qué significa "El uso de clases estáticas está mal" (en cuyo caso el artículo es incorrecto) o "clases estáticas se encuentran a menudo en código mal escrito" (en cuyo caso no es decir que las clases estáticas en sí mismos son malos, pero que a veces se utilizan de forma incorrecta)

funciones estáticas son más eficientes que no estático, ya que no es necesario crear una instancia de un objeto de utilizarlos o pasar un puntero 'this' en las llamadas de método.

El uso de clases estáticas para contener las variables globales es un asunto diferente - en cuyo caso la regla subyacente no es que "la estática son malos", pero "globales son malas"

.

Creo que el argumento general es en contra de mantener el estado mutable en las clases estáticas, y, básicamente, utilizando como variables globales. No hay nada malo con métodos auxiliares estáticos en una clase estática.

Y por qué variables globales son malas, estoy seguro que entre aquí y Google encontrará medio millones de páginas y entradas de blog al respecto.

No, en realidad no es correcta.

Hay un montón de funciones que no son específicos de una instancia de un objeto, y que no requieren de estado. Por ejemplo, consideremos las funciones 'matemáticas'.

Casi todas las lenguas tienen algo como:

y = Math.round(x);

Así que la función 'redondo' es estático. Se podría, si estuviera loco, discutes por algo así como (C #):

class RoundFunction<T> : GeneralMathFunction<T>
{
    public override T Operate (params object[] variables) {
        ..
    }
}

Pero, en mi humilde opinión, que sería un poco raro para hacerlo.

Es cierto que es un momento en que demasiadas funciones estáticas son un signo de algo que salió mal, pero, dentro de lo razonable, no es 'malo'.

Aquí hay algunos enlaces a algunas entradas del blog de exámenes de Google sobre qué métodos estáticos pueden perjudicar a la capacidad de prueba de su código, así como por qué los métodos estáticos (que son la parte mala de clases estáticas) introducir todo tipo de acoplamiento potencialmente sorprendente e interacción entre los componentes.

cómo pensar oo

únicos

-métodos estáticos-son- -muerte-a la capacidad de prueba

Hay necesidades donde se tiene una clase de utilidad donde todos los métodos son estáticos. En ese caso, si se hace la clase estática que indica claramente su intención. Y al menos en C # no se puede tener métodos no estáticos dentro de una clase estática.

Yo uso clases de utilidad estática todo el tiempo en mi código para los métodos que se llaman muy a menudo, pero sería un dolor para instanciar. Un ejemplo sería una clase de registro simple como:

public static class Logging
{
  public static UpdateAction(int id, object data)
  {
     SqlConnection connection = new SqlConnection("conn string from config file");
     // more logic here...
  }
}

Ahora, de ninguna manera hace nunca tengo esas clases y métodos de almacenar cualquier tipo de estado global, ya que puede dar lugar a enormes problemas concurrancy y en general es sólo un mal diseño.

Así que no evite clases estáticas, simplemente evitar tener esas clases estáticos mantienen algún tipo de estado global.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top