Pergunta

as classes estáticas são consideradas uma má prática?Eu li um artigo sobre isso há alguns dias (não consigo encontrar, desculpe) que basicamente dizia que ter classes estáticas (especialmente aquelas classes 'auxiliares') normalmente é um sinal de código incorreto.Isto está correto e, em caso afirmativo, por que razões?

Foi útil?

Solução

O abuso de classes estáticas pode ser considerado uma prática ruim. Mas o mesmo acontece com o abuso de qualquer recurso de idioma.

Não faço distinção entre uma classe não estática com apenas métodos estáticos e uma classe estática. Eles são efetivamente a mesma coisa, exceto que as classes estáticas permitem ao compilador fazer cumprir a intenção dos desenvolvedores (sem instanciando esta classe, sintaxe conveniente para acessar sua funcionalidade, etc.).

Como você diz, uma proliferação de aulas de "ajudante" pode causar problemas (design, manutenção, legibilidade, descoberta, outras habilidades ...). Nenhum argumento aqui. Mas você pode argumentar que uma classe "ajudante" é Nunca apropriado? Eu duvido.

De fato, o uso responsável de classes estáticas pode ter grandes benefícios para o seu código:

  • o Enumerable A classe estática fornece um conjunto de métodos de extensão que a maioria de nós adorou. Eles são um conjunto lógico de lógica de funcionalidade / negócios que não está relacionada a uma instância de qualquer tipo específico.
  • Serviços prestados pelo ambiente/contexto: por exemplo, registro, configuração (às vezes)
  • Outros (que eu não consigo pensar no momento :))

Portanto, não, em geral, não é uma prática ruim. Apenas use -os com sabedoria ...

Outras dicas

Isso significa "O uso de classes estáticas está errado" (nesse caso, o artigo está incorreto) ou "As classes estáticas são frequentemente encontradas em código mal escrito" (nesse caso, não está dizendo que as classes estáticas em si são ruins, mas que elas às vezes são usados ​​incorretamente)

Funções estáticas são mais eficientes que não estáticas porque você não precisa criar uma instância de um objeto para usá-las ou passar um ponteiro 'this' nas chamadas de método.

O uso de classes estáticas para armazenar variáveis ​​globais é uma questão diferente - nesse caso, a regra subjacente não é que "a estática é ruim", mas "globais são ruins".

Acho que o argumento geral é contra manter o estado mutável em classes estáticas e basicamente usá-las como variáveis ​​globais.Não há nada de errado com métodos auxiliares estáticos em uma classe estática.

E quanto ao porquê das variáveis ​​globais serem ruins, tenho certeza que aqui e no Google você encontrará meio milhão de páginas e posts sobre isso.

Não, não está realmente correto.

Existem muitas funções que não são específicas para uma instância de um objeto e que não exigem estado. Por exemplo, considere as funções de 'matemática'.

Quase todas as línguas têm algo como:

y = Math.round(x);

Portanto, a função 'redonda' é estática. Você poderia, se você fosse louco, argumentar por algo como (c#):

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

Mas, IMHO, você seria um pouco estranho para fazê -lo.

Certamente, há um tempo em que muitas funções estáticas são um sinal de algo que deu errado, mas, dentro da razão, não é "ruim".

Aqui estão alguns links para algumas postagens do blog do Google Testing sobre por que os métodos estáticos podem prejudicar a testabilidade do seu código, bem como por que os métodos estáticos (que são a parte ruim das classes estáticas) introduzem todos os tipos de acoplamento e interação potencialmente surpreendentes entre os componentes.

Como pensar sobre oo

Singletons

estático-métodos-mortos-death-testability

Existem necessidades em que você tem uma classe de utilidade em que todos os métodos são estáticos. Nesse caso, se você tornar a classe estática, indica claramente sua intenção. E pelo menos em C# você não pode ter métodos não estáticos dentro de uma classe estática.

Eu uso aulas de utilidade estática o tempo todo no meu código para métodos que são chamados com bastante frequência, mas que seriam uma dor de instances. Um exemplo seria uma classe de madeira simples como:

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

Agora, de maneira alguma, eu tenho essas aulas e métodos armazenam qualquer tipo de estado global, pois isso pode levar a enormes problemas de simultaneidade e, em geral, é apenas um design ruim.

Portanto, não evite aulas estáticas, apenas evite que essas aulas estáticas mantenham algum tipo de estado global.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top