Question

sont des classes statiques considérées comme mauvaises pratiques? J'ai lu un article à ce sujet il y a quelques jours (ne peut pas trouver, désolé) qui dit essentiellement que les classes ayant statiques (en particulier les classes « d'aide ») sont généralement un signe de mauvais code. Est-ce exact, et si oui, pour quelles raisons?

Était-ce utile?

La solution

L'abus des classes statiques peut être considéré comme une mauvaise pratique. Mais si l'abus peut de toute fonction de la langue.

Je ne fais pas de distinction entre une classe non statique avec uniquement des méthodes statiques et une classe statique. Ils sont effectivement la même chose, sauf que les classes statiques permettent au compilateur d'appliquer les développeurs d'intention (pas instancier cette classe, pour accéder à la syntaxe pratique sa fonctionnalité, etc ).

Comme vous le dites, une prolifération de classes « aide » peut vous causer des problèmes (conception, maintenabilité, la lisibilité, la possibilité de découvrir, d'autres capacités-...). Aucun argument ici. Mais pouvez-vous arguer qu'une classe « aide » est jamais approprié? Je doute.

En effet, l'utilisation responsable des classes statiques peut avoir de grands avantages à votre code:

  • La classe statique Enumerable fournit un ensemble de méthodes d'extension plupart d'entre nous ont appris à aimer. Ils sont un ensemble logique de fonctionnalité / la logique métier qui ne concerne pas une instance d'un type particulier.
  • Les services fournis par l'environnement / contexte: par exemple, la journalisation, la configuration (parfois)
  • D'autres (que je ne peux pas penser au moment:))

Donc non, en général sa pratique pas mal. Il suffit de les utiliser à bon escient ...

Autres conseils

Est-ce que cela signifie « Utilisation des classes statiques est mauvaise » (dans ce cas, l'article est incorrect) ou « classes statiques sont souvent trouvées dans le code mal écrit » (dans ce cas, il ne dit pas que les classes statiques en elles-mêmes sont mauvaises, mais ils sont parfois utilisés de manière incorrecte)

Les fonctions statiques sont plus efficaces que non statique parce que vous n'avez pas besoin de créer une instance d'un objet pour les utiliser ou passer un pointeur « this » dans les appels de méthode.

Utilisation des classes statiques pour contenir les variables globales est une autre question - dans ce cas, la règle sous-jacente est pas « sont mauvaises statics », mais « sont mauvaises GLOBALS »

.

Je pense que l'argument général est contraire à conserver l'état mutable dans les classes statiques, et de les utiliser essentiellement comme des variables globales. Il n'y a rien de mal avec des méthodes d'aide statiques dans une classe statique.

Et la raison pour laquelle les variables globales sont mauvaises, je suis sûr entre ici et Google, vous trouverez un demi-millions de pages et messages de blog à ce sujet.

Non, ce n'est pas vraiment correct.

Il y a beaucoup de fonctions qui ne sont pas spécifiques à une instance d'un objet, et qui ne nécessitent pas l'État. Par exemple, considérons les fonctions « mathématiques ».

Presque toutes les langues ont quelque chose comme:

y = Math.round(x);

Ainsi, la fonction « tour » est statique. Vous pouvez, si vous étiez fou, disputez quelque chose comme (C #):

class RoundFunction<T> : GeneralMathFunction<T>
{
    public override T Operate (params object[] variables) {
        ..
    }
}

Mais, à mon humble avis, vous seriez un peu bizarre de le faire.

Certes, il y a un moment où trop de fonctions statiques sont un signe de quelque chose qui a mal tourné, mais, dans la raison, il n'est pas « mauvais ».

Voici quelques liens vers certains postes de blog de test google sur pourquoi les méthodes statiques peuvent nuire à la testabilité de votre code, ainsi que pourquoi les méthodes statiques (qui sont la mauvaise partie des classes statiques) introduisent toutes sortes de couplage et une interaction potentiellement surprenante entre les composants.

comment penser oo

singletons

statiques-méthodes sont- mort à-testabilité

Il y a des besoins où vous avez une classe utilitaire où toutes les méthodes sont statiques. Dans ce cas, si vous faites la classe statique, il indique clairement votre intention. Et au moins en C # vous ne pouvez pas avoir des méthodes non statiques dans une classe statique.

J'utilise des classes utilitaires statiques tout le temps dans mon code pour les méthodes que l'on appelle assez souvent, mais serait une douleur à instancier. Un exemple serait une simple classe d'enregistrement comme:

public static class Logging
{
  public static UpdateAction(int id, object data)
  {
     SqlConnection connection = new SqlConnection("conn string from config file");
     // more logic here...
  }
}

Maintenant, en aucun cas dois-je jamais ces classes et méthodes stocker toute sorte d'état global car cela peut conduire à d'énormes problèmes de concurrancy et en général est tout simplement une mauvaise conception.

Alors, ne pas éviter les classes statiques, juste éviter d'avoir ces classes statiques garder une sorte d'état global.

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