web-dev-qa-db-fra.com

Quand rendre une méthode statique?

Je voudrais savoir comment les gens décident de définir une méthode comme statique. Je suis conscient qu'une méthode ne peut être définie comme statique que si elle ne nécessite pas l'accès aux champs d'instance. Supposons donc que nous ayons une méthode qui n'accède pas aux champs d'instance, définissez-vous toujours une telle méthode comme statique, ou seulement si vous devez l'appeler de manière statique (sans référence à une instance).

Peut-être une autre façon de poser la même question est de savoir si vous utilisez statique ou non statique par défaut?

45
Dónal

J'utilise des méthodes statiques chaque fois que je le peux. Avantages:

  • Lorsque vous appelez une méthode statique à partir d'une méthode d'instance, vous pouvez être sûr qu'il n'y a pas d'effets secondaires sur l'état de l'objet actuel.
  • De l'intérieur d'une méthode statique, vous pouvez être sûr de ne pas modifier accidentellement aucun état de l'instance d'objet.
  • Vous pouvez utiliser une méthode statique depuis l'extérieur de la classe sans construire d'instance. S'il était possible de rendre la méthode statique, elle n'a clairement pas besoin d'une instance, il n'est donc pas nécessaire d'en exiger une.
  • Les méthodes statiques peuvent être légèrement plus efficaces car aucun pointeur "this" n'a besoin d'être transmis et aucune répartition dynamique n'est nécessaire.
47
Thomas

Kevin Bourrillion a écrit une réponse perspicace sur ce sujet il y a quelque temps (certes d'un Java perspective, mais je pense que cela s'applique aussi à d'autres langues).

Il fait valoir que vous devez essentiellement uniquement utiliser des méthodes statiques pour fonctions pures.

Une " fonction pure " est toute méthode qui ne modifie aucun état et dont le résultat ne dépend que des paramètres qui lui sont fournis. Ainsi, par exemple, toute fonction qui effectue des E/S (directement ou indirectement) n'est pas une fonction pure, mais Math.sqrt (), bien sûr, l'est.

J'ai tendance à être d'accord. (Bien que dans mon propre code, traditionnellement, j'ai probablement utilisé beaucoup trop de méthodes d'assistance statique partout ... :-P Et cela a sûrement rendu le code qui utilise ces méthodes plus difficile à tester.)

25
Jonik

Si ce que la méthode dépend uniquement de ses arguments, vous pouvez la rendre statique. Si la méthode n'instancie aucune autre de vos classes définies par l'utilisateur, vous pouvez la rendre statique. Par défaut, cependant, il doit être non statique.

5
Otávio Décio

Utilisez des méthodes statiques lorsque vous effectuez des opérations qui ne fonctionnent pas sur les instances de la classe.

Un exemple parfait serait une méthode sqrt d'une classe Math.

5
Jacob Relkin

Ça dépend. Dans les langues où les fonctions non membres sont possibles, je dirais que la plupart du temps, si la méthode pourrait être rendue statique, elle devrait plutôt devenir une fonction non membre, non amie si possible . Vous pouvez dire que j'ai une formation principalement en C++.

Dans "pure" OO langages où les fonctions non-membres ne sont pas possibles, cela dépendrait du fait que la méthode est seulement "accessoirement" statique (c'est-à-dire qu'elle n'a simplement pas besoin d'accéder aux membres de l'instance), ou est vraiment logiquement statique - c'est une méthode de la classe entière plutôt que pour une instance particulière.

3
Joris Timmermans

Non statique par défaut, statique lorsque j'ai besoin que la fonctionnalité soit disponible dans au moins deux classes différentes, et je ne veux pas gaspiller un constructeur.

ps. Archimède règne!

0
David Rutten

(C #) Par défaut, j'utilise des méthodes statiques dans les classes statiques et des méthodes non statiques dans les classes non statiques.

Au fur et à mesure que j'élabore une classe, je me retrouve naturellement à converger pour la rendre entièrement statique ou entièrement non statique. En pratique, si je commence à vouloir définir des membres statiques au sein d'une classe non statique, je trouve souvent qu'il sera finalement plus judicieux de les décomposer en une classe statique distincte - soit une classe utilitaire comme Math ou une application globale (comme ConfigurationManager de .NET).

D'un point de vue orienté objet, une méthode fait quelque chose vers/avec un objet. Donc, si vous utilisez un objet instancié, il est plus logique pour moi de considérer les méthodes de cet objet comme non statiques. Techniquement, vous pouvez techniquement faire en sorte qu'une classe non statique ait des membres statiques si elle n'a pas besoin d'accéder à une instance. Mais ostensiblement, au moins, les méthodes d'une classe seraient toujours faisant quelque chose vers/avec cette classe, donc je les rendrais toujours non statiques. Toutes choses étant égales par ailleurs.

0
Calvin Fisher