Je lisais du code ici et j'ai vu qu'une énumération est utilisée pour stocker les noms des balises HTML. Pourquoi avons-nous jamais besoin de faire cela? Quel est le bénéfice de cette stratégie?
Je sais à quel point les énumérations sont utiles dans les langages compilés ou à typage statique, mais lorsque je vois des énumérations dans des langages à typage dynamique, 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'énums dans un langage typé dynamiquement ou en avons-nous besoin du tout?
enum People { YOU, NPC, FOO, BAR }
et une fonction qui veut un (People)int
, vous pouvez connecter n'importe quoi, au lieu d'utiliser un nombre.Réponses:
Un avantage est que le compilateur peut vous avertir si vous tapez accidentellement "ADRESS" ou "FEILDSET", et vous permet de le corriger immédiatement au lieu de vous comporter de façon absurde au moment de l'exécution.
Bien que l'avantage soit beaucoup plus utile dans les langages statiques que dynamique, il reste 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 que vos données.
la source
"PROF1LE_"
$1
quand je veux dire$i
. (Certes, je ne tape jamais à laf1le
place defile
- l'$1
erreur est amorcée par le fait qu'il$1
est très courant en Perl - mais néanmoins, des erreurs de toutes sortes sont courantes. Peut-être que le développeur avait un mot de passeprof1le
dans celui-ci, les amorçant ainsi à entrer malprofile
dans des contextes autres que les mots de passe.)Les énumérations sont utiles dans les situations où vous avez un ensemble fixe de valeurs / entités sensibles. Elles se documentent d'elles-mêmes et permettent au compilateur de valider des tâches 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'énums avec des noms significatifs, un code et une description, etc. dans un seul paquet propre faisant autorité en ce qui concerne les valeurs autorisés et doivent être manipulés.
la source
status === GEOLOCATION_ACQUIRED
questatus === 3
, de sorte que la personne qui soutient que le logiciel comprend ce qui se passe. Comme vous l'avez dit, cela évite également les valeurs invalides.Les énumérations n’ont rien à voir avec la programmation orientée objet et JavaScript n’a pas d’énumération. Au lieu de cela, les énumérations sont utilisées chaque fois que vous avez le choix entre un ensemble fixe de valeurs. Par exemple, un booléen est un choix entre vrai et faux, qui pourrait être implémenté en tant que
enum Bool { False, True }
. Dans une bibliothèque graphique, nous pourrions avoir un ENUM pour les alignements:enum HAlignment { LEFT = -1, CENTER = 0, RIGHT = 1 }
.La manière dont l’énum est mis en œuvre n’est généralement pas pertinente, l’important étant que chaque valeur possible soit distincte. De nombreuses langues utilisent des entiers pour les énumérations, bien que certaines, comme Java, prennent en charge des objets arbitraires.
Jusqu'à présent, nous aurions tout aussi bien pu utiliser des constantes, par exemple
const int LEFT = -1, CENTER = 0, RIGHT = 1
. Cependant, un compilateur sait que les valeurs enum vont ensemble. Ainsi, lorsque je permute les valeurs d’énumérationswitch(value) {case LEFT: ...; case RIGHT: ...;}
, le compilateur peut me prévenir que j’ai oublié leCENTER
cas. Cela peut vous faire gagner beaucoup de temps. Dans les langues sans énums ou sans construction switch-case, ceci 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 enums peuvent être traités comme un type séparé. Par exemple, je peux déclarer qu'une méthode prend un
HAlignment
paramètre plutôt qu'un entier. La compilation du code échouera si je ne fournis rien d’autre qu’une des trois valeurs possibles de HAlignment. Cependant, les énumérations de C ne sont pas bien encapsulées et les constantes d'énumération peuvent être utilisées indifféremment avec des entiers. Les autres langues sont plus strictes ici.En JavaScript, nous n'obtenons aucun de ces avantages. L'exemple donné déclare un objet traité comme une énumération. Cela présente certains avantages pour le programmeur: par exemple, cela facilite la documentation, regroupe toutes les «constantes» dans un seul objet,…. Cependant, il est juste une convention qu'un tel objet est semblable à une énumération.
Le point ici est que HTML n'a qu'un ensemble de balises fini et connu. Vous pouvez consulter la spécification HTML5 et insérer ces noms d'éléments dans votre code en tant qu'énumération, et ainsi rendre plus difficile l'insertion d'une
<blink>
balise dans votre programme. Il est préférable d’encoder ces connaissances à un endroit donné que de mélanger votre code avec des littéraux de chaîne spéciaux (ou pire, des nombres magiques).la source
<blink>
à une méthode en JavaScript, rien ne peut m'arrêter, non? mais dansjava
bonjour se déchaîne :)foo(TagName.STRONG)
étant un peu meilleur. Ce serait encore mieux si JS se plaignait si le champ n’existait pas, mais ici nous n’obtenons qu’un échecundefined
si j’essaieTagName.BLINK
. Cela ne vaut pas grand chose chez JS, mais c'est un début.Même si votre langage ne nécessite pas de compilation, vous utiliserez probablement une sorte d’EDI ou d’outils de développement, ce qui peut fournir un meilleur support pour quelque chose comme une énumération que pour des chaînes.
Si vous utilisez par exemple une énumération comme littéral d'objet en javascript, votre éditeur vous indiquera l'achèvement du code et votre vérificateur de code, tel que JSHint ou JSLint, vous en avertira si vous utilisez accidentellement la mauvaise valeur.
la source
L'intérêt d'une telle énumération pourrait être de fournir à Js Api (goog) un ensemble / un ensemble de balises autorisées. Lesquels? Celles définies par W3C HTML 4.01 ( consultez la documentation d’enum ). Donc, ce sont les limites des paramètres.
C’est peut-être l’objectif réel ou non, mais cela fonctionnerait très bien à cette fin.
Si vous savez comment fonctionne Javascript, le code définit un tableau indexé par des chaînes :-). Quelle valeur est une chaîne, mais il pourrait s'agir de tout autre composant doté d'attributs, de fonctions, etc. Laissez libre cours à votre imagination et vous verrez des avantages partout.
Mis à part le Javascript, j'utilise beaucoup énums pour la modélisation et la gestion des machines à états .
START> IN_PROGRESS> CONFIRMED> FINISHED> ...
En Java, switch autorise les enums, il est donc assez facile de valider des états dans une machine à états , de les parcourir en boucle, de définir des priorités en effectuant des enums complexes, ...
Je les utilise également pour définir des constantes dactylographiées et non modifiables:
Également complexes (ce qui permet de faire des transformations / parseurs sécurisés)
En raison des enums appartenant souvent à ma couche de modèles (noyau), ses fonctionnalités sont accessibles à l’ensemble du système, ce qui en fait un modèle fonctionnel tout en conservant un faible couplage.
Ce que les énumérations donnent (entre autres), ce sont des limites et une typification
la source