Я читал некоторый код здесь и увидел, что enum используется для хранения имен тегов html. Почему мы когда-либо должны это делать? Какую выгоду я получу от этой стратегии?
Я знаю, насколько полезны перечисления в скомпилированных или статически типизированных языках, но когда я вижу перечисления в динамически типизированных языках, мне становится любопытно, как пример кода, который я показал выше. Итак, вопрос в основном сводится к тому, зачем нам нужны перечисления в динамически типизированном языке или они вообще нужны?
enum People { YOU, NPC, FOO, BAR }
и функция, которая хочет (Люди)int
, вы можете подключить что угодно, вместо использования числа.Ответы:
Преимущество заключается в том, что компилятор может сообщить вам, если вы случайно набрали «ADRESS» или «FEILDSET», и позволить вам исправить это немедленно, а не вести себя бессмысленным образом во время выполнения.
Хотя это преимущество гораздо полезнее в статически типизированных языках, чем в динамическом, оно все же полезно, даже если это ошибка времени выполнения, поскольку вы получите сообщение, указывающее на проблему с вашим оператором case, а не с вашими данными.
источник
"PROF1LE_"
$1
когда имею в виду$i
. (Конечно, я никогда не печатаюf1le
вместоfile
-$1
ошибка вызвана тем, что$1
это очень часто встречается в Perl - но, тем не менее, ошибки всех видов встречаются часто. Может быть, у разработчика был пароль сprof1le
ним, тем самым вводя их в опечаткуprofile
в не-парольном контексте.)Перечисления полезны для ситуаций, когда у вас есть фиксированный набор значений / сущностей, которые являются разумными. Они самодокументированы и позволяют компилятору проверять вещи, которые иначе были бы оставлены во время выполнения. Они никогда не должны использоваться, если набор значимых значений неизвестен или не строго ограничен.
Более полезным примером будет что-то вроде HTTP-кода ответа. Вместо того, чтобы иметь метод, который принимает число и предоставляет имя и / или описание ошибки, вы можете иметь набор перечислений со значимыми именами, код, описание и т. Д. В одном чистом пакете, который является авторитетным в том, что значения разрешено и должно быть обработано.
источник
status === GEOLOCATION_ACQUIRED
чемstatus === 3
, чтобы человек, который поддерживает это программное обеспечение, понимал, что происходит. Как вы сказали, это также предотвращает недопустимые значения.Перечисления не имеют ничего общего с ООП, а в JavaScript нет перечислений. Вместо этого перечисления используются всякий раз, когда есть выбор между фиксированным набором значений. Например, логическое значение - это выбор между истиной и ложью, который может быть реализован как
enum Bool { False, True }
. В библиотеке GUI, мы могли бы иметь перечисление для выравнивания:enum HAlignment { LEFT = -1, CENTER = 0, RIGHT = 1 }
.Как правило, не имеет значения, как реализовано перечисление, важная часть заключается в том, что каждое возможное значение отличается. Многие языки используют целые числа для перечислений, хотя некоторые, такие как Java, поддерживают произвольные объекты.
До сих пор мы могли бы использовать константы, например
const int LEFT = -1, CENTER = 0, RIGHT = 1
. Однако компилятор знает, что значения перечисления принадлежат друг другу. Поэтому, когда я переключаю значения enumswitch(value) {case LEFT: ...; case RIGHT: ...;}
, компилятор может предупредить меня, что я забылCENTER
регистр. Это может существенно сэкономить время. На языках без перечислений или без конструкции переключателя это можно смоделировать с помощью шаблона посетителя, хотя это более полезно при наличии статической типизации.Другое преимущество состоит в том, что перечисления могут рассматриваться как отдельный тип. Например, я могу объявить, что метод принимает
HAlignment
параметр, а не любое целое число. Затем код не будет компилироваться, если я предоставлю что-либо, кроме одного из трех возможных значений HAlignment. Однако перечисления C плохо инкапсулированы, и константы перечисления могут использоваться взаимозаменяемо с целыми числами. Другие языки здесь строже.В JavaScript мы не получаем ни одного из этих преимуществ. В данном примере объявляется объект, который обрабатывается как перечисление. Это имеет некоторые преимущества для программиста, например, облегчает документирование, группирует все «константы» в один объект,…. Тем не менее, это просто соглашение, что такой объект подобен перечислению.
Дело в том, что HTML имеет только конечный и известный набор тегов. Вы можете взглянуть на спецификацию HTML5 и вставить эти имена элементов в код как перечисление, и, следовательно, усложнить внедрение
<blink>
тега в вашу программу. Лучше закодировать эти знания в одном месте, чтобы засорять ваш код специальными строковыми литералами (или, что еще хуже, магическими числами).источник
<blink>
к какому-либо методу в javascript, ничто не сможет остановить меня, верно? но вjava
foo(TagName.STRONG)
что немного лучше. Было бы еще лучше, если бы JS пожаловался, если поле не существует, но здесь мы получим только,undefined
если я попытаюсьTagName.BLINK
. В JS это ничего не стоит, но это начало.Даже если ваш язык не требует компиляции, вы, вероятно, будете использовать какую-то среду IDE или инструменты разработки, которые могут дать гораздо лучшую поддержку для чего-то вроде enum, чем просто для строк.
Например, если вы используете объектный литерал типа enum в javascript, ваш редактор сообщит вам о завершении кода, а программа проверки кода, такая как JSHint или JSLint, предупредит вас, если вы случайно используете неправильное значение.
источник
Смысл такого перечисления может состоять в том, чтобы предоставить Js Api (goog) набор / набор разрешенных тегов. Какие? Те, которые определены в W3C HTML 4.01 ( ознакомьтесь с документацией enum ). Так что это настройки границ.
Может быть, а может и не быть настоящей целью, однако для этой цели она отлично работает.
Если вы знаете, как работает Javascript, код выполняет определение массива, индексированного по строкам :-). Какое-либо значение является строкой, но это может быть любой другой компонент с атрибутами, функциями и т. Д. Пусть ваше воображение будет свободным, и вы увидите преимущества везде.
Помимо Javascript, я часто использую перечисления для моделирования и управления конечными автоматами .
START> IN_PROGRESS> ПОДТВЕРЖДЕНО> ЗАВЕРШЕНО> ...
В java switch позволяет перечисления, так что довольно легко проверять состояния в конечный автомат , циклически проходить по всему перечислению, определять приоритеты, выполняя сложные перечисления, ...
Я также использую их для определения типизированных и немодифицируемых констант:
Также сложные перечисления (что позволяет делать безопасные преобразования / парсеры)
Из-за того, что перечисления часто принадлежат моему уровню модели (ядру), его функции доступны для всей системы, поэтому он становится функциональной моделью, и я сохраняю слабую связь.
Что перечисление дает (среди прочего), это границы и типизация
источник