J'ai écrit mes réflexions sur les classes statiques dans une réponse antérieure à Stack Overflow : Classe avec une seule méthode - meilleure approche ?
J'adorais les classes utilitaires remplies de méthodes statiques. Elles permettaient de consolider les méthodes d'aide qui, autrement, auraient été inutilisées, ce qui aurait entraîné une redondance et une maintenance infernale. Elles sont très faciles à utiliser, pas d'instanciation, pas d'élimination, il suffit de les lancer et de les oublier. Je suppose que c'était ma première tentative involontaire de créer une architecture orientée service - beaucoup de services sans état qui faisaient juste leur travail et rien d'autre. Cependant, au fur et à mesure qu'un système se développe, les dragons arrivent.
Polymorphisme
Supposons que nous ayons la méthode UtilityClass.SomeMethod qui se porte bien. Soudain, nous avons besoin de modifier légèrement sa fonctionnalité. La plupart des fonctionnalités sont les mêmes, mais nous devons tout de même en modifier quelques parties. S'il ne s'agissait pas d'une méthode statique, nous pourrions créer une classe dérivée et modifier le contenu de la méthode selon les besoins. Comme il s'agit d'une méthode statique, nous ne pouvons pas le faire. Bien sûr, si nous avons juste besoin d'ajouter une fonctionnalité avant ou après l'ancienne méthode, nous pouvons créer une nouvelle classe et appeler l'ancienne à l'intérieur de celle-ci - mais c'est juste grossier.
Les problèmes d'interface
Les méthodes statiques ne peuvent pas être définies par le biais d'interfaces pour des raisons logiques. Et puisque nous ne pouvons pas surcharger les méthodes statiques, les classes statiques sont inutiles lorsque nous avons besoin de les faire circuler par leur interface. Il est donc impossible d'utiliser les classes statiques dans le cadre d'un modèle de stratégie. Nous pouvons résoudre certains problèmes en passer des délégués au lieu d'interfaces .
Essais
Cela va de pair avec les problèmes d'interface mentionnés ci-dessus. Comme notre capacité à interchanger les implémentations est très limitée, nous aurons également du mal à remplacer le code de production par du code de test. Encore une fois, nous pouvons les envelopper, mais cela nous obligera à modifier de grandes parties de notre code juste pour pouvoir accepter les enveloppes au lieu des objets réels.
Fosters blobs
Comme les méthodes statiques sont généralement utilisées comme des méthodes utilitaires et que les méthodes utilitaires ont généralement des objectifs différents, nous nous retrouverons rapidement avec une grande classe remplie de fonctionnalités non cohérentes - idéalement, chaque classe devrait avoir un objectif unique au sein du système. Je préférerais avoir cinq fois plus de classes, tant que leurs objectifs sont bien définis.
Fluctuation des paramètres
Au début, cette petite méthode statique mignonne et innocente peut prendre un seul paramètre. Au fur et à mesure que la fonctionnalité se développe, quelques nouveaux paramètres sont ajoutés. Bientôt, d'autres paramètres facultatifs sont ajoutés, et nous créons donc des surcharges de la méthode (ou ajoutons simplement des valeurs par défaut, dans les langages qui les prennent en charge). Très vite, nous avons une méthode qui prend 10 paramètres. Seuls les trois premiers sont réellement requis, les paramètres 4 à 7 sont facultatifs. Mais si le paramètre 6 est spécifié, les paramètres 7 à 9 doivent également être renseignés... Si nous avions créé une classe dans le seul but de faire ce que cette méthode statique fait, nous pourrions résoudre ce problème en prenant les paramètres requis dans le constructeur, et en permettant à l'utilisateur de définir des valeurs optionnelles par le biais de propriétés, ou de méthodes pour définir plusieurs valeurs interdépendantes en même temps. De plus, si une méthode a atteint un tel niveau de complexité, elle doit très probablement faire partie de sa propre classe.
Demander aux consommateurs de créer une instance de classe sans raison valable
L'un des arguments les plus courants est le suivant : Pourquoi demander aux consommateurs de notre classe de créer une instance pour invoquer cette seule méthode, alors qu'ils n'ont aucune utilité de cette instance par la suite ? La création d'une instance d'une classe est une opération très très bon marché dans la plupart des langages, la vitesse n'est donc pas un problème. Ajouter une ligne de code supplémentaire au consommateur est un faible coût pour poser les bases d'une solution beaucoup plus facile à maintenir à l'avenir. Enfin, si vous voulez éviter de créer des instances, il suffit de créer un wrapper singleton de votre classe qui permet une réutilisation facile - bien que cela exige que votre classe soit sans état. Si elle n'est pas apatride, vous pouvez toujours créer des méthodes de wrapper statiques qui gèrent tout, tout en vous donnant tous les avantages à long terme. Enfin, vous pouvez également créer une classe qui masque l'instanciation comme s'il s'agissait d'un singleton : MyWrapper.Instance est une propriété qui retourne simplement new MyClass();
Seul un Sith traite avec des absolus.
Bien sûr, il y a des exceptions à mon aversion pour les méthodes statiques. Les véritables classes utilitaires qui ne présentent aucun risque de gonflement sont d'excellents cas pour les méthodes statiques - System.Convert par exemple. Si votre projet est unique et ne nécessite pas de maintenance future, l'architecture globale n'est pas vraiment importante - statique ou non statique, cela n'a pas vraiment d'importance - mais la vitesse de développement, si.
Les normes, les normes, les normes !
L'utilisation de méthodes d'instance ne vous empêche pas d'utiliser également des méthodes statiques, et vice versa. Tant qu'il y a un raisonnement derrière la différenciation et que celle-ci est standardisée. Il n'y a rien de pire que de regarder une couche d'entreprise qui s'étale avec différentes méthodes de mise en œuvre.
19 votes
En tant que débutant en C#, il serait utile d'expliquer pourquoi cette question a été marquée comme faisant double emploi avec la question de l'année précédente. singleton et classe statique et comment les deux sont liés l'un à l'autre.
1 votes
mr5, singleton et classe statique sont fondamentalement la même chose. Singleton est un modèle de conception utilisé dans d'autres langages pour simuler une classe statique, puisque d'autres langages (comme Java) n'ont pas de classes statiques intégrées, vous devez donc compter sur le modèle de conception Singleton pour créer une telle classe. La classe statique est une classe qui ne peut pas être instanciée et qui peut être utilisée directement (comme la classe Console par exemple). tutorialspoint.com/design_pattern/singleton_pattern.htm si vous vérifiez cela, vous verrez que lorsque vous utilisez le Singleton, vous ne créez pas une nouvelle instance...
0 votes
... vous utilisez celui qui a déjà été créé dans la classe Singleton, et vous y accédez par la méthode .getInstance(). Le C# résout tout cela par un simple mot-clé "static".
5 votes
Les classes singleton et statiques sont fondamentalement des choses exactement opposées. L'une peut être instanciée, l'autre est interdite d'instanciation.
0 votes
IMHO lors de la conception des attributs de l'objet, pensez à l'instanciation pour l'intérieur de la boîte et à la classe statique pour l'extérieur de la boîte.