Percebi que quase toda vez que vejo programadores usando classes estáticas em linguagens orientadas a objetos como C #, eles estão fazendo errado. Obviamente, os principais problemas são o estado global e a dificuldade de trocar implementações em tempo de execução ou com zombarias / stubs durante os testes.
Por curiosidade, observei alguns dos meus projetos selecionando aqueles que foram bem testados e quando fiz um esforço para realmente pensar em arquitetura e design. Os dois usos das classes estáticas que encontrei são:
A classe de utilitário - algo que eu preferiria evitar se estivesse escrevendo esse código hoje,
O cache do aplicativo: usar a classe estática para isso é claramente errado. E se eu quiser substituí-lo por
MemoryCache
ou Redis?
Olhando para o .NET Framework, também não vejo nenhum exemplo de uso válido de classes estáticas. Por exemplo:
File
classe estática torna realmente doloroso mudar para alternativas. Por exemplo, e se alguém precisar alternar para Armazenamento Isolado ou armazenar arquivos diretamente na memória ou precisar de um provedor que suporte transações NTFS ou, pelo menos, consiga lidar com caminhos com mais de 259 caracteres ? Ter uma interface comum e várias implementações parece tão fácil quanto usarFile
diretamente, com o benefício de não precisar reescrever a maior parte do código base quando os requisitos mudam.Console
A classe estática torna os testes excessivamente complicados. Como garantir dentro de um teste de unidade que um método produz dados corretos para o console? Devo modificar o método para enviar a saída para um gravávelStream
que é injetado em tempo de execução? Parece que uma classe de console não estática seria tão simples quanto uma classe estática, apenas sem todas as desvantagens de uma classe estática, mais uma vez.Math
classe estática também não é um bom candidato; e se eu precisar mudar para a aritmética de precisão arbitrária? Ou para alguma implementação mais nova e mais rápida? Ou a um esboço que dirá, durante um teste de unidade, que um determinado método de umaMath
classe foi realmente chamado durante um teste?
No Programmer.SE, eu li:
Não use "Static" em C #? Algumas respostas são totalmente contra as classes estáticas. Outros afirmam que “os métodos estáticos são bons de usar e têm um lugar de direito na programação.”, Mas não os envolvam com argumentos.
Quando usar um Singleton e quando usar uma classe estática . As classes de utilidade são mencionadas, dado que eu mencionei acima, as classes de utilidade são problemáticas.
Por que e quando devo tornar a classe 'estática'? Qual é o objetivo da palavra-chave 'estática' nas classes? O único uso válido mencionado é um contêiner para métodos de extensão. Ótimo.
Além dos métodos de extensão, quais são os usos válidos das classes estáticas, ou seja, casos em que a Injeção de Dependência ou os singletons são impossíveis ou resultarão em um design de qualidade inferior e maior extensibilidade e manutenção?
instanceof
) porque, dadas duas instâncias, IFoo
não há garantia de que elas sejam apoiadas pela mesma classe.
YAGNI
, e aceita que, se precisar de um tipo diferente de string, fará com que seu IDE mude todas as instâncias de com.lang.lib.String
para com.someones.elses.String
em toda a base de código.