Si la fonction est "pure", je ne vois aucun problème. Une fonction pure ne fonctionne que dans les paramètres d'entrée et fournit un résultat basé sur cela. Cela ne dépend d'aucun état global ou contexte externe.
Si je regarde votre propre exemple de code:
public class Class1
{
public static string GetSomeString()
{
// do something
}
}
Cette fonction ne prend aucun paramètre. Ainsi, elle n'est probablement pas pure (la seule implémentation pure de cette fonction serait de renvoyer une constante). Je suppose que cet exemple n'est pas représentatif de votre problème réel, je souligne simplement que ce n'est probablement pas une fonction pure.
Prenons un exemple différent:
public static bool IsOdd(int number) { return (number % 2) == 1; }
Il n'y a rien de mal à ce que cette fonction soit statique. Nous pourrions même en faire une fonction d'extension, permettant au code client de devenir encore plus lisible. Les fonctions d'extension ne sont fondamentalement qu'un type spécial de fonctions statiques.
Telastyn mentionne correctement la concurrence comme un problème potentiel avec les membres statiques. Cependant, puisque cette fonction n'utilise pas l'état partagé, il n'y a pas de problème de concurrence ici. Un millier de threads peuvent appeler cette fonction simultanément sans aucun problème de concurrence.
Dans le framework .NET, les méthodes d'extension existent depuis un certain temps. LINQ contient de nombreuses fonctions d'extension (par exemple Enumerable.Where () , Enumerable.First () , Enumerable.Single () , etc.). Nous ne les considérons pas comme mauvais, n'est-ce pas?
Les tests unitaires peuvent souvent bénéficier lorsque le code utilise des abstractions remplaçables, ce qui permet au test unitaire de remplacer le code système par un double de test. Les fonctions statiques interdisent cette flexibilité, mais cela est surtout important aux limites de la couche architecturale, où nous voulons remplacer, par exemple, une véritable couche d'accès aux données par une fausse couche d'accès aux données.
Cependant, lors de l'écriture d'un test pour un objet qui se comporte différemment, selon qu'un nombre impair ou pair, nous n'avons pas vraiment besoin de pouvoir remplacer la IsOdd()
fonction par une implémentation alternative. De même, je ne vois pas quand nous devons fournir une Enumerable.Where()
implémentation différente à des fins de test.
Examinons donc la lisibilité du code client pour cette fonction:
Option a (avec la fonction déclarée comme méthode d'extension):
public void Execute(int number) {
if (number.IsOdd())
// Do something
}
Option b:
public void Execute(int number) {
var helper = new NumberHelper();
if (helper.IsOdd(number))
// Do something
}
La fonction statique (extension) rend le premier morceau de code beaucoup plus lisible et la lisibilité est très importante, utilisez donc les fonctions statiques le cas échéant.