Por que precisamos de enums em linguagens dinamicamente tipadas?

31

Eu estava lendo um código aqui e vi um enum é usado para armazenar nomes de tags html. Por que precisamos fazer isso? Qual o benefício que eu recebo usando essa estratégia?

Eu sei que as enums são úteis em linguagens compiladas ou estaticamente tipadas, mas quando vejo enums em linguagens dinamicamente tipadas eu fico curioso, como o código de exemplo que mostrei acima. Então, a questão basicamente se resume a por que precisamos de enums em linguagem tipada dinamicamente ou precisamos deles em tudo?

    
por CodeYogi 09.05.2016 / 18:28
fonte

5 respostas

55

Um benefício é que o compilador pode informá-lo se você acidentalmente digitar "ADRESS" ou "FEILDSET", e permitir que você o corrija imediatamente, em vez de se comportar de uma maneira absurda durante a execução.

Embora o benefício seja muito mais útil em linguagens com tipagem estática do que dinâmico, ele ainda é útil mesmo se for um erro de tempo de execução, pois você receberá uma mensagem indicando um problema com sua declaração de caso e não com seus dados.

    
por 09.05.2016 / 18:34
fonte
22

Enums são úteis para situações em que você tem um conjunto fixo de valores / entidades que são sensatos. Eles são auto-documentados e permitem que o compilador valide coisas que seriam deixadas em execução. Eles nunca devem ser usados se o conjunto de valores significativos não for conhecido ou não for estritamente limitado.

Um exemplo mais útil seria algo como códigos de resposta HTTP. Em vez de ter um método que leva um número e fornece o nome e / ou descrição do erro, você pode ter um conjunto de enums com nomes significativos, um código e uma descrição etc. em um pacote limpo que é autoritativo em quais valores são permitido e precisa ser tratado.

    
por 09.05.2016 / 18:57
fonte
11

Os enums não têm nada a ver com o OOP e o JavaScript não tem enums. Em vez disso, enums são usados sempre que houver uma escolha entre um conjunto fixo de valores. Por exemplo, um booleano é uma opção entre true e false, que pode ser implementada como enum Bool { False, True } . Em uma biblioteca de GUIs, podemos ter um enum para alinhamentos: enum HAlignment { LEFT = -1, CENTER = 0, RIGHT = 1 } .

Geralmente é irrelevante como o enum é implementado, a parte importante é que cada valor possível é distinto. Muitas linguagens usam inteiros para enums, embora algumas, como Java, suportem objetos arbitrários.

Até agora, poderíamos também ter usado constantes, por exemplo %código%. No entanto, um compilador sabe que os valores enum pertencem juntos. Então, quando eu troco os valores enum const int LEFT = -1, CENTER = 0, RIGHT = 1 , o compilador pode me avisar que esqueci o caso switch(value) {case LEFT: ...; case RIGHT: ...;} . Isso pode economizar bastante tempo. Em linguagens sem enums ou sem uma construção switch-case, isso pode ser simulado com o Visitor Pattern, embora seja mais útil na presença de tipagem estática.

A outra vantagem é que as enums podem ser tratadas como um tipo separado. Por exemplo. Eu posso declarar que um método usa um parâmetro CENTER , em vez de qualquer inteiro. O código não será compilado se eu fornecer qualquer coisa, exceto um dos três valores possíveis de HA. No entanto, as enumerações de C não são bem encapsuladas e as constantes de enum podem ser usadas de forma intercambiável com números inteiros. Outras línguas são mais rigorosas aqui.

Em JavaScript, não recebemos nenhum desses benefícios. O exemplo dado declara um objeto que é tratado como um enum. Isto tem algumas vantagens para o programador, e. facilita a documentação, agrupa todas as “constantes” em um único objeto,…. No entanto, é apenas uma convenção que tal objeto é como um enum.

O ponto aqui é que o HTML só tem um conjunto de tags finito e conhecido. Você pode examinar a especificação HTML5 e colocar esses nomes de elemento como um enum em seu código e, portanto, dificultar a introdução de uma tag HAlignment em seu programa. É melhor codificar esse conhecimento em um lugar para que o seu código fique com literais de cadeia especiais (ou, pior ainda, números mágicos).

    
por 09.05.2016 / 19:02
fonte
3

Mesmo que o seu idioma não precise de compilação, você provavelmente usará algum tipo de IDE ou ferramentas de desenvolvimento, que podem oferecer um suporte muito melhor para algo como um enum do que apenas para strings.

Se você usar um enum como literal de objeto em javascript, por exemplo, seu editor fornecerá a conclusão de código e seu verificador de código, como JSHint ou JSLint, avisará você, se acidentalmente usar o valor errado.

    
por 10.05.2016 / 14:39
fonte
2

O ponto desse enum pode ser fornecer ao Js Api (goog) um conjunto / pacote de tags permitidas. Quais? Os definidos pelo HTML 4.01 do W3C ( confira a documentação do enum ). Portanto, são limites de configurações.

Pode ou não ser esse o objetivo real, mas funciona bem para esse fim.

Se você sabe como o Javascript funciona, o que o código está fazendo é definir um array indexado por strings :-). Qual valor é uma string, mas poderia ser qualquer outro componente com atributos, funções, etc ... Deixe sua imaginação correr livremente e você verá benefícios em todos os lugares.

Javascript de lado, eu uso enums muito para modelar e gerenciar máquinas de estado .

START > IN_PROGRESS > CONFIRMADO > TERMINADO > ...

No java switch permite enums, então é muito fácil validar estados em uma máquina de estado , fazer um loop em todo o enum, definir prioridades fazendo enums complexados,. ..

Eu também os uso para definir constantes digitadas e não modificáveis:

  • Sim, não

Enums também complexos (que permitem fazer transformações / analisadores seguros)

  • Sim (1, verdadeiro), Não (0, falso)

Devido a enums geralmente pertencerem à minha camada de modelo (core), seus recursos são acessíveis a todo o sistema, então ele se torna um modelo funcional e eu mantenho um baixo acoplamento.

O que enums dá (entre outras coisas) é limites e tipificação

    
por 09.05.2016 / 22:38
fonte