Se a função é "pura", não vejo problemas. Uma função pura opera apenas nos parâmetros de entrada e fornece um resultado com base nisso. Não depende de nenhum estado global ou contexto externo.
Se eu olhar para o seu próprio exemplo de código:
public class Class1
{
public static string GetSomeString()
{
// do something
}
}
Esta função não aceita nenhum parâmetro. Portanto, provavelmente não é puro (a única implementação pura dessa função seria retornar uma constante). Suponho que este exemplo não seja representativo do seu problema real, estou apenas apontando que essa provavelmente não é uma função pura.
Vamos dar um exemplo diferente:
public static bool IsOdd(int number) { return (number % 2) == 1; }
Não há nada errado com esta função ser estática. Podemos até transformar isso em uma função de extensão, permitindo que o código do cliente se torne ainda mais legível. As funções de extensão são basicamente apenas um tipo especial de funções estáticas.
Telastyn menciona corretamente a simultaneidade como um problema potencial com membros estáticos. No entanto, como essa função não usa o estado compartilhado, não há problemas de simultaneidade aqui. Mil threads podem chamar essa função simultaneamente sem problemas de simultaneidade.
Na estrutura do .NET, os métodos de extensão já existem há algum tempo. O LINQ contém muitas funções de extensão (por exemplo, Enumerable.Where () , Enumerable.First () , Enumerable.Single () , etc.). Nós não vemos isso tão ruim, não é?
O teste de unidade geralmente pode se beneficiar quando o código usa abstrações substituíveis, permitindo que o teste de unidade substitua o código do sistema por um teste duplo. As funções estáticas proíbem essa flexibilidade, mas isso é principalmente importante nos limites da camada de arquitetura, onde queremos substituir, por exemplo, uma camada de acesso a dados real por uma camada de acesso a dados falsa .
No entanto, ao escrever um teste para um objeto que se comporte de maneira diferente, dependendo se algum número é ímpar ou par, não precisamos realmente substituir a IsOdd()
função por uma implementação alternativa. Da mesma forma, não vejo quando precisamos fornecer uma Enumerable.Where()
implementação diferente para fins de teste.
Então, vamos examinar a legibilidade do código do cliente para esta função:
Opção a (com a função declarada como um método de extensão):
public void Execute(int number) {
if (number.IsOdd())
// Do something
}
Opção b:
public void Execute(int number) {
var helper = new NumberHelper();
if (helper.IsOdd(number))
// Do something
}
A função estática (extensão) torna o primeiro trecho de código muito mais legível e a legibilidade é muito importante; portanto, use funções estáticas sempre que apropriado.