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?
J'utilise des méthodes statiques chaque fois que je le peux. Avantages:
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.)
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.
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
.
Ç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.
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!
(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.