web-dev-qa-db-fra.com

Pourquoi avons-nous besoin d'énumérations dans des langues typées dynamiquement?

Je lisais du code ici et j'ai vu qu'une énumération est utilisée pour stocker les noms des balises html. Pourquoi devons-nous jamais faire cela? Quels avantages puis-je tirer de cette stratégie?

Je sais à quel point les énumérations sont utiles dans les langues compilées ou typées statiquement, mais quand je vois des énumérations dans des langues typées dynamiquement, je suis curieux, comme l'exemple de code que j'ai montré ci-dessus. Donc, la question se résume essentiellement à pourquoi avons-nous besoin d'énumérations dans un langage typé dynamiquement ou en avons-nous besoin?

33
CodeYogi

Un avantage est que le compilateur peut vous faire savoir si vous tapez accidentellement "ADRESS" ou "FEILDSET", et vous permet de le corriger immédiatement au lieu de se comporter de manière absurde lors de l'exécution.

Bien que l'avantage soit beaucoup plus utile dans les langages de type statique que dynamique, il est toujours utile même s'il s'agit d'une erreur d'exécution car vous obtiendrez un message indiquant un problème avec votre déclaration de cas plutôt qu'avec vos données.

57
whatsisname

Les énumérations sont utiles dans les situations où vous avez un ensemble fixe de valeurs/entités qui sont sensibles. Ils sont auto-documentés et permettent au compilateur de valider les choses qui seraient autrement laissées à l'exécution. Ils ne doivent jamais être utilisés si l'ensemble de valeurs significatives n'est pas connu ou n'est pas strictement limité.

Un exemple plus utile serait quelque chose comme les codes de réponse HTTP. Au lieu d'avoir une méthode qui prend un nombre et fournit le nom et/ou la description de l'erreur, vous pouvez avoir un ensemble d'énumérations avec des noms significatifs, un code et une description, etc. dans un package propre faisant autorité dans les valeurs autorisés et doivent être traités.

22
JimmyJames

Les énumérations n'ont rien à voir avec la POO et JavaScript n'a pas d'énumérations. Au lieu de cela, les énumérations sont utilisées chaque fois qu'il existe un choix entre un ensemble fixe de valeurs. Par exemple, un booléen est un choix entre vrai et faux, qui pourrait être implémenté comme enum Bool { False, True }. Dans une bibliothèque GUI, nous pourrions avoir une énumération pour les alignements: enum HAlignment { LEFT = -1, CENTER = 0, RIGHT = 1 }.

Peu importe la façon dont l'énumération est implémentée, l'important est que chaque valeur possible soit distincte. De nombreux langages utilisent des entiers pour les énumérations, bien que certains comme Java prennent en charge les objets arbitraires.

Jusqu'à présent, nous aurions tout aussi bien pu utiliser des constantes, par ex. const int LEFT = -1, CENTER = 0, RIGHT = 1. Cependant, un compilateur sait que les valeurs d'énumération vont de pair. Ainsi, lorsque je bascule sur les valeurs d'énumération switch(value) {case LEFT: ...; case RIGHT: ...;}, le compilateur peut m'avertir que j'ai oublié le cas CENTER. Cela peut être un gain de temps substantiel. Dans les langues sans énumérations ou sans construction de casse de commutation, cela peut être simulé avec le modèle de visiteur, bien que cela soit plus utile en présence de typage statique.

L'autre avantage est que les énumérations peuvent être traitées comme un type distinct. Par exemple. Je peux déclarer qu'une méthode prend un paramètre HAlignment, plutôt que n'importe quel entier. Le code ne pourra alors pas être compilé si je fournis autre chose qu'une des trois valeurs de HAlignment possibles. Cependant, les énumérations de C ne sont pas bien encapsulées et les constantes d'énumération peuvent être utilisées de manière interchangeable avec des entiers. D'autres langues sont plus strictes ici.

En JavaScript, nous n'obtenons aucun de ces avantages. L'exemple donné déclare un objet qui est traité comme une énumération. Cela présente certains avantages pour le programmeur, par exemple il facilite la documentation, regroupe toutes les "constantes" en un seul objet,…. Cependant, c'est juste une convention qu'un tel objet ressemble à une énumération.

Le point ici est que HTML n'a qu'un ensemble fini et connu de balises. Vous pouvez regarder la spécification HTML5 et mettre ces noms d'élément sous forme d'énumération dans votre code, et donc rendre plus difficile l'insertion d'une balise <blink> Dans votre programme. Il est préférable de coder ces connaissances en un seul endroit pour surcharger votre code avec des littéraux de chaîne spéciaux (ou pire, des nombres magiques).

11
amon

Même si votre langue ne nécessite pas de compilation, vous utiliserez probablement une sorte de IDE ou outils de développement, qui peuvent fournir un bien meilleur support pour quelque chose comme une énumération que juste pour les chaînes.

Si vous utilisez par exemple un littéral d'objet enum en javascript, votre éditeur vous donnera un code complet et votre vérificateur de code comme JSHint ou JSLint vous avertira si vous utilisez accidentellement la mauvaise valeur.

3
hansmaad

Le point d'une telle énumération pourrait être de fournir à Js Api (goog) un ensemble/ensemble de balises autorisées. Lesquels? Ceux définis par W3C HTML 4.01 ( consultez la documentation d'énumération ). Ce sont donc les limites des paramètres.

Cela pourrait ou non être le véritable objectif, mais cela fonctionnerait bien à cette fin.

Si vous savez comment Javascript fonctionne, ce que fait le code est de définir un tableau indexé par des chaînes :-). Quelle valeur est une chaîne, mais il peut s'agir de n'importe quel autre composant avec des attributs, des fonctions, etc ... Laissez libre cours à votre imagination et vous verrez des avantages partout.

Mis à part Javascript, j'utilise beaucoup d'énumérations pour la modélisation et la gestion machines d'état.

START> IN_PROGRESS> CONFIRMED> FINISHED> ...

Dans Java le commutateur permet les énumérations, il est donc assez facile de valider les états dans un machine d'état , pour boucler sur toute l'énumération, pour définir les priorités en faisant des énumérations complexes, ...

Je les utilise également pour définir des constantes typées et non modifiables:

  • Oui, non

Énumérations aussi complexes (qui permettent de faire des transformations/analyseurs sécurisés)

  • Oui (1, vrai), Non (0, faux)

Étant donné que les énumérations appartiennent souvent à ma couche de modèle (noyau), ses fonctionnalités sont accessibles à tout le système, il devient donc un modèle fonctionnel et je garde un faible couplage.

Ce que l'énumération donne (entre autres choses) est limites et typification

2
Laiv