Les méthodes statiques privées en C # font-elles du mal?

10

J'ai créé une méthode de validation privée pour une certaine validation qui se produit plusieurs fois dans ma classe (je ne peux pas stocker les données validées pour diverses raisons). Maintenant, ReSharper suggère que la fonction pourrait être rendue statique. Je suis un peu réticent à le faire en raison de problèmes connus avec les méthodes statiques. Ce serait une méthode statique privée . Ma question est la suivante: les méthodes statiques privées peuvent-elles provoquer des problèmes de couplage et de test similaires, comme les méthodes statiques publiques? Est-ce une mauvaise pratique? Je suppose que non, mais je ne sais pas s'il y a un écueil ici.

Tamás Szelei
la source
10
Quels sont les "problèmes connus" avec les méthodes statiques?
Robert Harvey
3
@Ed: C'est vrai. Les méthodes statiques correctement écrites ne doivent en aucun cas toucher les API externes ni l'état. La manipulation de l'état interne encapsulé dans une classe me semble parfaitement correcte, et la méthode n'aurait pas besoin d'être testée unitaire, car le test unitaire teste le comportement externe de la classe.
Robert Harvey
1
Les méthodes statiques sont susceptibles de modifier l'état global et elles tuent également l'héritage (chaque fois que vous souhaitez étendre les fonctionnalités, vous devrez modifier le code appelant car vous ne pouvez pas remplacer la méthode dans une classe dérivée). Vous êtes lié à cette seule implémentation. On ne peut pas se moquer des méthodes statiques, ce qui les rend très difficiles à tester unitairement. Ils cachent la dépendance . Je suis sûr qu'il y a plus. Non seulement pour les éviter aveuglément, je demande de prendre une décision éclairée.
Tamás Szelei
2
@ Les méthodes statiques de Tamás ne modifient l'état global que si vous les écrivez de cette façon, ce que je ne fais jamais. D'une manière générale, j'utilise uniquement des méthodes statiques dans les classes utilitaires, des méthodes qui prennent un ou plusieurs objets et retournent un objet sans effets secondaires. Ces types de méthodes ne présentent aucun des problèmes que vous décrivez.
Robert Harvey
1
@ TamásSzelei Comment sont-ils enclins à modifier l'état global? Ils ne peuvent même pas trouver l'état global à moins que vous ne le passiez dans un paramètre.
CodesInChaos

Réponses:

16

Je pense: "Dois-je tester cela?"

Si votre méthode est de toute façon privée, ce qui signifie que vous ne voulez pas tester la logique de la méthode elle-même, alors en ce qui concerne la testabilité et la maintenabilité, votre classe est une boîte noire de toute façon, le fonctionnement interne de votre classe est son affaire. et son seul. La refactorisation ne sera pas affectée non plus, ce qui est également quelque chose à considérer.

Donc, à mon avis: Non, rendre une méthode "privée" "statique privée" n'aura aucune ramification à long terme.

Ed James
la source
17

Les méthodes statiques privées sont la chose la plus simple possible, de mon point de vue.

DataIn -> Méthode -> DataOut

Il n'y a pas de dépendances sur les objets externes, pas d'effets secondaires. Pourquoi les considérez-vous comme mauvais?

Codeur
la source
Je vous remercie. J'ai expliqué mes préoccupations dans les commentaires sous la question.
Tamás Szelei
2
Ce que vous décrivez n'est correct que pour les méthodes statiques ne dépendant pas des variables membres statiques - c'est ce qui peut faire la différence entre une "bonne" et une "mauvaise" méthode statique.
Doc Brown
2

Tester des classes qui utilisent des méthodes statiques publiques peut être difficile, car il n'est pas (particulièrement) facile de bloquer / simuler / simuler les méthodes statiques. Les méthodes d'instance, en revanche, peuvent être facilement moquées, surtout si elles sont virtuelles ou satisfont une interface.

Cependant, je ne vois aucune raison de ne pas utiliser de méthodes statiques privées. En effet, les performances sont légèrement améliorées, car vous n'avez pas besoin d'une instance de la classe pour occuper la mémoire.

D'un autre côté, tout ce qui est statique est un peu une odeur de code. S'agit-il en fait d'une "classe d'aide"? Se pourrait-il que la méthode puisse résider plus utilement sur l'une des classes passées en paramètre? La réponse à ces questions est souvent "c'est bien comme statique" mais ça vaut la peine de se souvenir.

Jeremy McGee
la source
De toute façon, la classe contenant la méthode statique occupe déjà de la mémoire. Votre crainte du staticmot - clé ne semble pas fondée.
Robert Harvey