Question

Resharper aime souligner plusieurs fonctions par page asp.net qui pourraient être rendues statiques. Est-ce que cela m'aide de les rendre statiques? Devrais-je les rendre statiques et les déplacer vers une classe d'utilitaires?

Était-ce utile?

La solution

Méthodes statiques et méthodes d'instance
10.2.5 Membres statiques et d'instance du C # La spécification de la langue explique la différence. En règle générale, les méthodes statiques peuvent apporter une très petite amélioration des performances par rapport aux méthodes d’instance, mais uniquement dans des situations quelque peu extrêmes (voir cette réponse pour plus de détails. plus de détails à ce sujet).

La règle CA1822 dans les états FxCop ou d'analyse de code:

  

"Après [avoir marqué les membres comme statiques]], le compilateur émettra des sites d'appels non virtuels à ces membres, ce qui empêchera toute vérification à   runtime pour chaque appel garantissant que le pointeur d'objet actuel est   non nul. Cela peut entraîner un gain de performance mesurable pour   code sensible à la performance. Dans certains cas, l’absence d’accès à la   L'instance d'objet en cours représente un problème de correction. "

Classe d'utilitaire
Vous ne devriez pas les déplacer vers une classe d'utilitaires à moins que cela ne soit logique dans votre conception. Si la méthode statique concerne un type particulier, comme une méthode ToRadians (double degrés) se rapporte à une classe représentant des angles, il est logique que cette méthode existe en tant que membre statique de ce type (note, ceci est un exemple compliqué aux fins de démonstration).

Autres conseils

Les performances, la pollution des espaces de noms, etc. sont, à mon avis, tous secondaires. Demandez-vous ce qui est logique. La méthode fonctionne-t-elle logiquement sur une instance du type ou est-elle liée au type lui-même? Si c'est le dernier cas, faites-en une méthode statique. Déplacez-le uniquement dans une classe d'utilitaires s'il est lié à un type qui n'est pas sous votre contrôle.

Parfois, certaines méthodes agissent logiquement sur une instance mais n'utilisent pas l'état de l'instance pour le moment . Par exemple, si vous construisiez un système de fichiers et que vous aviez le concept de répertoire, mais que vous ne l'aviez pas encore implémenté, vous pourriez écrire une propriété renvoyant le type d'objet du système de fichiers, et ce serait toujours juste. " fichier " - mais elle est liée logiquement à l'instance et devrait donc être une méthode d'instance. Cela est également important si vous voulez rendre la méthode virtuelle - votre implémentation particulière peut ne nécessiter aucun état, mais des classes dérivées peuvent en avoir besoin. (Par exemple, demander à une collection si elle est en lecture seule ou non - vous n’avez peut-être pas encore implémenté de formulaire en lecture seule, mais c’est clairement une propriété de la collection elle-même, pas du type.)

En marquant une méthode comme static dans une classe, il est évident qu’elle n’utilise aucun membre d’instance, ce qui peut être utile de savoir lorsque vous parcourez le code.

Vous n'avez pas nécessairement besoin de le déplacer dans une autre classe, sauf s'il est censé être partagé par une autre classe aussi étroitement associée, conceptuellement.

Je suis sûr que cela ne se produit pas dans votre cas, mais un "mauvaise odeur". J'ai vu dans certains codes que j'ai dû subir plusieurs méthodes statiques.

Malheureusement, il s’agissait de méthodes statiques supposant un état d’application particulier. (Pourquoi bien sûr, nous n’aurons qu’un seul utilisateur par application! Pourquoi ne pas laisser la classe User en tenir compte dans les variables statiques?) C’était un moyen glorifié d’accéder aux variables globales. Ils avaient aussi des constructeurs statiques (!), Ce qui est presque toujours une mauvaise idée. (Je sais qu’il existe quelques exceptions raisonnables).

Cependant, les méthodes statiques sont très utiles lorsqu'elles factorisent une logique de domaine qui ne dépend pas réellement de l'état d'une instance de l'objet. Ils peuvent rendre votre code beaucoup plus lisible.

Assurez-vous simplement de les placer au bon endroit. Les méthodes statiques manipulent-elles de manière intrusive l'état interne d'autres objets? Peut-on affirmer que leur comportement appartient plutôt à l'une de ces classes? Si vous ne séparez pas correctement les problèmes, vous risquez des maux de tête plus tard.

C'est une lecture intéressante:

http://thecuttingledge.com/?p=57

ReSharper ne vous suggère pas réellement de rendre votre méthode statique. Vous devriez vous demander pourquoi cette méthode est dans cette classe par opposition à l'une des classes qui apparaît dans sa signature ...

mais voici ce que dit la documentation de resharper: http://confluence.jetbrains.net/display/ReSharper/Member + peut + être + rendu + statique

Juste pour ajouter au de Jason True répondre , il est important de réaliser que le simple fait de mettre «statique» sur une méthode ne garantit pas que la méthode sera «pure». Il sera sans état en ce qui concerne la classe dans laquelle il est déclaré, mais il peut très bien accéder à d'autres objets "statiques" ayant un état (configuration de l'application, etc.). Ce n'est peut-être pas toujours une mauvaise chose, mais c'est l'une des raisons pour lesquelles Personnellement, j’ai tendance à préférer les méthodes statiques quand je le peux, c’est que si elles sont pures, vous pouvez les tester et les raisonner de manière isolée, sans avoir à vous soucier de l’environnement.

Vous devez faire ce qui est le plus lisible et intuitif dans un scénario donné.

L'argument de performance n'est pas bon, sauf dans les situations les plus extrêmes, car la seule chose qui se passe réellement est qu'un paramètre supplémentaire ( this ) est en train de tomber sur la pile pour les méthodes d'instance.

Pour la logique complexe dans une classe, j'ai trouvé des méthodes statiques privées utiles pour créer une logique isolée, dans lesquelles les entrées d'instance sont clairement définies dans la signature de la méthode et aucun effet secondaire d'instance ne peut se produire. Toutes les sorties doivent être via la valeur de retour ou les paramètres out / ref. Diviser la logique complexe en blocs de code sans effets secondaires peut améliorer la lisibilité du code et la confiance de l'équipe de développement.

Par contre, cela peut conduire à une classe polluée par une prolifération de méthodes utilitaires. Comme d'habitude, la dénomination logique, la documentation et l'application cohérente des conventions de codage en équipe peuvent remédier à ce problème.

ReSharper ne vérifie pas la logique. Il vérifie uniquement si la méthode utilise des membres d'instance. Si la méthode est privée et n’est appelée que par (peut-être une seule) méthode d’instance, c’est un signe pour lui laisser une méthode d’instance.

Si les fonctions sont partagées sur plusieurs pages, vous pouvez également les placer dans une classe de page de base, puis en faire hériter toutes les pages asp.net utilisant cette fonctionnalité (les fonctions peuvent également être statiques).

Rendre une méthode statique signifie que vous pouvez appeler la méthode de l’extérieur de la classe sans créer au préalable une instance de cette classe. Ceci est utile lorsque vous travaillez avec des objets fournisseurs tiers ou des add-ons. Imaginez si vous deviez d'abord créer un objet console & con; con " avant d'appeler con.Writeline ();

Il est utile de contrôler la pollution des espaces de noms.

Just my tuppence: L'ajout de toutes les méthodes statiques partagées à une classe d'utilitaires vous permet d'ajouter

using static className; 

à vos instructions using, ce qui rend le code plus rapide à taper et plus facile à lire. Par exemple, j'ai un grand nombre de ce que l'on pourrait appeler des "variables globales". dans certains codes, j'ai hérité. Plutôt que de créer des variables globales dans une classe qui était une classe d'instance, je les ai toutes définies comme des propriétés statiques d'une classe globale. Il fait le travail, si mal, et je peux simplement référencer les propriétés par nom car j'ai l'espace de noms statique déjà référencé.

Je ne sais pas si c'est une bonne pratique ou non. J'ai tellement de choses à apprendre sur le C 4/5 et un code hérité à refactoriser que j'essaie simplement de laisser les conseils de Roselyn me guider.

Joey

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top