Perché abbiamo bisogno di enumeri nelle lingue digitate dinamicamente?

31

Stavo leggendo un codice qui e ho visto che un enum viene utilizzato per memorizzare i nomi dei tag html. Perché abbiamo mai bisogno di fare questo? Quale beneficio ottengo usando questa strategia?

So bene quanto siano utili le enumerazioni nelle lingue compilate o tipizzate staticamente, ma quando vedo le enumerazioni in lingue digitate dinamicamente mi incuriosisco, come il codice di esempio che ho mostrato sopra. Quindi, la domanda si riduce fondamentalmente a perché abbiamo bisogno di enumerazioni in un linguaggio digitato in modo dinamico o ne abbiamo davvero bisogno?

    
posta CodeYogi 09.05.2016 - 18:28
fonte

5 risposte

55

Un vantaggio è che il compilatore può farti sapere se digiti accidentalmente "ADRESS" o "FEILDSET" e ti permette di correggerlo immediatamente invece di comportarti in modo non sensato durante il runtime.

Sebbene il vantaggio sia molto più utile in linguaggi tipizzati in modo statico che dinamico, è comunque utile anche se si tratta di un errore di runtime poiché si otterrà un messaggio che indica un problema con la dichiarazione del caso piuttosto che i dati.

    
risposta data 09.05.2016 - 18:34
fonte
22

Le enumerazioni sono utili per situazioni in cui hai un insieme fisso di valori / entità che sono sensibili. Sono auto-documentanti e consentono al compilatore di convalidare le cose che altrimenti verrebbero lasciate in fase di esecuzione. Non dovrebbero mai essere usati se l'insieme di valori significativi non è noto o non strettamente limitato.

Un esempio più utile sarebbe qualcosa come i codici di risposta HTTP. Invece di avere un metodo che prende un numero e fornisce il nome e / o la descrizione dell'errore, puoi avere un insieme di enumerazioni con nomi significativi, un codice e una descrizione, ecc. In un pacchetto pulito che è autorevole in quali valori sono consentito e deve essere gestito.

    
risposta data 09.05.2016 - 18:57
fonte
11

Le enumerazioni non hanno nulla a che fare con OOP e JavaScript non ha enumerazioni. Invece, le enumerazioni vengono utilizzate ogni volta che è possibile scegliere tra un insieme fisso di valori. Ad esempio, un booleano è una scelta tra true e false, che potrebbe essere implementata come enum Bool { False, True } . In una libreria della GUI, potremmo avere un enum per gli allineamenti: enum HAlignment { LEFT = -1, CENTER = 0, RIGHT = 1 } .

Di solito è irrilevante il modo in cui l'enum viene implementato, la parte importante è che ogni possibile valore è distinto. Molte lingue usano interi per le enumerazioni, sebbene alcuni come Java supportino oggetti arbitrari.

Fino ad ora, avremmo potuto usare anche le costanti, ad es. %codice%. Tuttavia, un compilatore sa che i valori enum appartengono insieme. Quindi, quando cambio i valori enum const int LEFT = -1, CENTER = 0, RIGHT = 1 , il compilatore può avvisarmi che ho dimenticato il caso switch(value) {case LEFT: ...; case RIGHT: ...;} . Questo può essere un sostanziale risparmio di tempo. Nelle lingue senza enumerazione o senza un costrutto switch-case, questo può essere simulato con il pattern Visitor, sebbene ciò sia più utile in presenza di tipizzazione statica.

L'altro vantaggio è che le enumerazioni possono essere trattate come un tipo separato. Per esempio. Posso dichiarare che un metodo accetta un parametro CENTER , piuttosto che un numero intero. Il codice non riuscirà quindi a compilare se fornisco qualcosa tranne uno dei tre possibili valori di HAlignment. Tuttavia, le enumerazioni di C non sono ben incapsulate e le costanti di enum possono essere utilizzate in modo intercambiabile con gli interi. Altre lingue sono più rigide qui.

In JavaScript, non otteniamo nessuno di questi vantaggi. L'esempio indicato dichiara un oggetto che viene considerato come enumerazione. Questo ha alcuni vantaggi per il programmatore, ad es. facilita la documentazione, raggruppa tutte le "costanti" in un singolo oggetto, ... Tuttavia, è solo una convenzione che tale oggetto è simile all'enum.

Il punto qui è che HTML ha solo un insieme finito e conosciuto di tag. Puoi guardare le specifiche HTML5 e inserire questi nomi di elementi come enum nel tuo codice, e quindi rendere più difficile introdurre un tag HAlignment nel tuo programma. È meglio codificare questa conoscenza in un unico posto in cui copiare il codice con speciali string letterali (o peggio, numeri magici).

    
risposta data 09.05.2016 - 19:02
fonte
3

Anche se la tua lingua non richiede la compilazione, probabilmente utilizzerai una sorta di IDE o strumenti di sviluppo, che possono fornire un supporto molto migliore per qualcosa di simile a un enumerico che non solo per le stringhe.

Se ad esempio usi un enum come object letteral in javascript, il tuo editor ti darà il completamento del codice e il tuo correttore del codice come JSHint o JSLint ti avviserà, se per sbaglio utilizzi il valore sbagliato.

    
risposta data 10.05.2016 - 14:39
fonte
2

Il punto di tale enumerazione potrebbe essere quello di fornire a Js Api (goog) un set / bundle di tag consentiti. Quale? Quelli definiti da W3C HTML 4.01 ( consultare la documentazione di enum ). Quindi sono i limiti delle impostazioni.

Potrebbe o potrebbe non essere questo il vero obiettivo, tuttavia funzionerebbe perfettamente per tale scopo.

Se sai come funziona Javascript, il codice che sta facendo è definire una matrice indicizzata dalle stringhe :-). Quale valore è una stringa, ma potrebbe essere qualsiasi altro componente con attributi, funzioni, ecc ... Lascia libera la tua immaginazione e vedrai benefici ovunque.

A parte Javascript, uso molto le enumerazioni per modellare e gestire macchine di stato .

START > IN_PROGRESS > CONFERMATO > FINITO > ...

In java switch consente enum, quindi è abbastanza semplice convalidare gli stati in una macchina di stato , per fare un ciclo su enum, per definire priorità facendo enumerazioni complesse,. ..

Li uso anche per definire costanti dattiloscritte e non modificabili:

  • Sì, No

Anche enumerazioni complesse (che consente di eseguire trasformazioni / parser sicuri)

  • Sì (1, vero), No (0, falso)

A causa delle enumerazioni spesso appartiene al mio livello di modello (core), le sue funzionalità sono accessibili a tutto il sistema, quindi diventa un modello funzionale e mantengo un accoppiamento basso.

Quale enumerazione dà (tra le altre cose) è boundaries e typification

    
risposta data 09.05.2016 - 22:38
fonte

Leggi altre domande sui tag