102 votes

Les méthodes C# qui *peuvent* être statiques doivent-elles être statiques ?

Les méthodes C# qui peut être statique être statique ?

Nous en avons discuté aujourd'hui et je suis un peu en désaccord. Imaginez que vous avez une longue méthode dont vous refactorez quelques lignes. La nouvelle méthode prend probablement quelques variables locales de la méthode parente et renvoie une valeur. Cela signifie qu'elle podría être statique.

La question est la suivante : debe est-il statique ? Il n'est pas statique par conception ou par choix, simplement par sa nature en ce qu'il ne fait référence à aucune valeur d'instance.

59voto

Scott Wisniewski Points 14420

Cela dépend. Il existe réellement 2 types de méthodes statiques :

  1. Les méthodes qui sont statiques parce qu'elles peuvent être
  2. Les méthodes qui sont statiques parce qu'elles DOIVENT l'être

Dans une base de code de taille petite à moyenne, vous pouvez vraiment traiter les deux méthodes de manière interchangeable.

Si vous avez une méthode qui appartient à la première catégorie (can-be-static) et que vous devez la modifier pour accéder à l'état de la classe, il est relativement simple de déterminer s'il est possible de transformer la méthode statique en méthode d'instance.

Dans une grande base de code, cependant, le nombre de sites d'appel peut rendre trop coûteuse la recherche pour voir s'il est possible de convertir une méthode statique en méthode non statique. Souvent, les gens verront le nombre d'appels, et diront "ok.... Je ferais mieux de ne pas modifier cette méthode, mais d'en créer une nouvelle qui réponde à mes besoins".

Cela peut aboutir à l'un ou l'autre :

  1. Beaucoup de duplication de code
  2. Une explosion du nombre d'arguments de méthode

Ces deux choses sont mauvaises.

Ainsi, si vous avez une base de code supérieure à 200 000 LOC, je vous conseille de ne rendre les méthodes statiques que si elles doivent l'être.

Le refactoring de non-statique à statique est relativement facile (il suffit d'ajouter un mot-clé), donc si vous voulez faire d'une can-be-static une statique réelle plus tard (lorsque vous avez besoin de sa fonctionnalité en dehors d'une instance) alors vous pouvez. Cependant, le refactoring inverse, qui consiste à transformer une can-be-static en une méthode d'instance, est BEAUCOUP plus coûteux.

Avec de grandes bases de code, il est préférable de se tromper sur la facilité d'extension, plutôt que sur la pureté idéologique.

Ainsi, pour les grands projets, ne rendez pas les choses statiques à moins que vous n'ayez besoin qu'elles le soient. Pour les petits projets, faites ce que vous préférez.

43voto

Joel Coehoorn Points 190579

Je voudrais no en faire un public membre statique de cette classe . La raison en est que le fait de le rendre public static dit quelque chose sur le type de la classe : non seulement que "ce type sait comment faire ce comportement", mais aussi que "c'est la responsabilité de ce type de réaliser ce comportement". Et il y a fort à parier que le comportement n'a plus aucune relation réelle avec le type plus large.

Cela ne signifie pas pour autant que je ne la rendrais pas statique du tout. Posez-vous la question suivante : la nouvelle méthode pourrait-elle logiquement avoir sa place ailleurs ? Si vous pouvez répondre "oui" à cette question, vous voulez probablement la rendre statique (et la déplacer également). Même si ce n'est pas le cas, vous pouvez toujours la rendre statique. Il suffit de ne pas la marquer public .

Pour des raisons de commodité, vous pourriez au moins le marquer internal . Cela permet généralement d'éviter de déplacer la méthode si vous n'avez pas un accès facile à un type plus approprié, tout en la laissant accessible là où elle est nécessaire, de manière à ce qu'elle n'apparaisse pas comme faisant partie de l'interface publique aux utilisateurs de votre classe.

20voto

Michael Points 34110

Pas nécessairement.

Faire passer les méthodes publiques de statiques à non-statiques est un changement radical, qui nécessiterait des modifications de tous vos appelants ou consommateurs. Si une méthode semble être une méthode d'instance, mais qu'il se trouve qu'elle n'utilise aucun membre d'instance, je suggérerais d'en faire une méthode d'instance par mesure de sécurité pour l'avenir.

13voto

JP Alioto Points 33482

Oui. La raison pour laquelle "elle peut être statique" est qu'elle n'agit pas sur l'état de l'objet sur lequel elle est appelée. Il ne s'agit donc pas d'une méthode d'instance, mais d'une méthode de classe. Si elle peut faire ce qu'elle doit faire sans jamais accéder aux données de l'instance, alors elle doit être statique.

12voto

Jabe Points 1158

Oui, elle devrait. Il y a plusieurs métriques de couplage qui mesurent comment votre classe dépend d'autres choses, comme d'autres classes, méthodes, etc. Rendre les méthodes statiques est un moyen de maintenir le degré de couplage à un niveau bas, puisque vous pouvez être sûr une méthode statique ne fait pas référence à des membres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X