web-dev-qa-db-fra.com

Si une classe "Utilitaires" est mauvaise, où dois-je mettre mon code générique?

Je respecte généralement la règle selon laquelle les variables/fonctions globales sont mauvaises et que chaque morceau de code doit vivre dans la classe à laquelle il appartient.

Il s'agit d'une règle très facile à suivre, et je crois que je n'ai jamais rencontré de problème avec cette règle jusqu'à présent.

Aujourd'hui, cependant, j'ai besoin d'ajouter une fonction à mon assembly plutôt qu'à une classe spécifique. Autrement dit, presque toutes mes classes pourraient avoir une utilisation pour cette fonction particulière.

Où dois-je mettre cette fonction (+1 surcharge)?

Si je le mets dans une classe "Utilitaires", je me sens sale. Si je le cloue dans une classe semi-liée et que je laisse les autres classes l'appeler directement, je me sens pire.

Ce morceau de code particulier coupe essentiellement un IList<PointF> dans une liste normalisée. Je pense en ce moment que l'ajouter comme méthode d'extension sur IList<PointF> peut être le meilleur choix ...

67
John Gietzen

S'il s'agit d'une opération sur un IList<PointF>, alors ce devrait être une méthode d'extension sur IList<PointF>.

En règle générale, les classes de type Utils et Helper doivent être évitées. Plus souvent qu'autrement, vous constaterez que ce que vous pouvez pensez est une méthode utilitaire, est en fait une méthode assez spécifique qui appartient probablement à une classe à part (comme vous le dites). Cependant, il y aura des cas spécifiques au domaine où les classes de type Util (classes qui regroupent les méthodes utiles liées) sont des entités valides.

29
Håvard S

Il n'y a rien de mal avec les variables et méthodes "globales". Vous les utilisez tout le temps. Le framework aime les appeler classes "statiques" ou méthodes "statiques".

J'en ai rarement besoin, mais j'ajoute généralement une classe statique interne Util dans l'espace de noms que la méthode/variable est nécessaire pour C # et un module pour VB.NET.

Exemples de .NET Framework

  • System.Collections.Specialized.CollectionsUtil
  • System.Net.WebUtility
  • Vérifiez le code source de Microsoft pour .NET Framework. Vous trouverez de nombreuses classes d'utilitaires internes.
12
AMissico

Vous devez le mettre dans une classe 'ListUtilities' ou PointListUtilities, bien sûr. Ensuite, vous ne brisez pas le principe de responsabilité unique, qui est le principal problème avec une classe "Utilitaires" fourre-tout.

4
Ben Voigt