Métodos estáticos privados em C # prejudicam alguma coisa?

10

Criei um método de validação particular para uma determinada validação que ocorre várias vezes na minha classe (não consigo armazenar os dados validados por vários motivos). Agora, o ReSharper sugere que a função pode se tornar estática. Estou um pouco relutante em fazê-lo devido a problemas conhecidos com métodos estáticos. Seria um método estático privado . Minha pergunta é: métodos estáticos privados podem causar problemas semelhantes de acoplamento e teste, como métodos estáticos públicos? É uma prática ruim? Eu acho que não, mas não tenho certeza se existe uma armadilha aqui.

Tamás Szelei
fonte
10
Quais são os "problemas conhecidos" com métodos estáticos?
Robert Harvey
3
@ Ed: Certo. Métodos estáticos escritos corretamente não devem tocar em APIs ou estados externos. Manipular o estado interno encapsulado dentro de uma classe parece perfeitamente aceitável para mim, e o método não precisaria ser testado em unidade, pois o teste de unidade testa o comportamento externo da classe.
Robert Harvey
11
Os métodos estáticos são propensos a modificar o estado global e também matam a herança (a qualquer momento que você desejar estender a funcionalidade, será necessário modificar o código de chamada porque não é possível substituir o método em uma classe derivada). Você está vinculado a essa implementação. Os métodos estáticos não podem ser ridicularizados, o que os torna muito difíceis de testar em unidade. Eles escondem dependência . Tenho certeza de que há mais. Não apenas para evitá-los cegamente, estou pedindo para tomar uma decisão informada.
Tamás Szelei
2
@ Os métodos estáticos Tamás só modificam o estado global se você os escrever dessa maneira, o que eu nunca faço. De um modo geral, só uso métodos estáticos em classes de utilidade, métodos que pegam um ou mais objetos e retornam um objeto sem efeitos colaterais. Esses tipos de métodos não têm nenhum dos problemas que você descreve.
Robert Harvey
11
@ TamásSzelei Como eles estão propensos a modificar o estado global? Eles nem conseguem encontrar o estado global, a menos que você o transmita em um parâmetro.
CodesInChaos 23/03

Respostas:

16

Eu pensava: "Preciso testar isso?"

Se seu método é privado de qualquer maneira, o que significa que você não deseja testar a lógica do próprio método, então, no que diz respeito à testabilidade e manutenção, sua classe é uma caixa preta de qualquer maneira, o funcionamento interno da sua classe é o seu negócio. e está sozinho. A refatoração também não será afetada, o que também é algo a considerar.

Então, na minha opinião: não, tornar um método "privado" "privado estático" não terá implicações a longo prazo.

Ed James
fonte
17

Métodos estáticos privados são a coisa mais fácil possível, do meu ponto de vista.

DataIn -> Método -> DataOut

Não há dependências em objetos externos, nem efeitos colaterais. Por que você os considera ruins?

Codificador
fonte
Obrigado. Expliquei minhas preocupações nos comentários da pergunta.
Tamás Szelei
2
O que você descreve está correto apenas para métodos estáticos, não dependendo de variáveis ​​estáticas de membros - isso é o que pode fazer a diferença entre um método estático "bom" e "ruim".
Doc Brown
2

Testar classes que usam métodos estáticos públicos pode ser difícil, pois não é (particularmente) fácil stub / fake / mock os métodos estáticos. Os métodos de instância, por outro lado, podem ser ridicularizados facilmente, especialmente se forem virtuais ou satisfizerem uma interface.

No entanto, não vejo nenhum motivo para não usar métodos estáticos privados. De fato, há um pequeno benefício de desempenho, pois você não precisa de uma instância da classe para ocupar memória.

Por outro lado, qualquer coisa estática é um pouco de cheiro de código. Isso é realmente uma "classe auxiliar"? Será que o método poderia residir de maneira mais útil em uma das classes passadas como parâmetro? A resposta para essas perguntas geralmente é "está bem como estática", mas vale a pena lembrar.

Jeremy McGee
fonte
A classe que contém o método estático já está ocupando memória de qualquer maneira. Seu medo da staticpalavra - chave parece infundado.
Robert Harvey