Поиск по сайту:

Что такое перечисления (нумерованные типы) в программировании и почему они полезны?


Перечисления или перечисляемые типы представляют собой список постоянных значений с удобными для разработчиков именами. Они используются в программировании, чтобы установить набор предопределенных значений, которые может принимать переменная.

Определение списка значений

Перечисления — это список значений, каждое из которых всегда уникально. В перечислении не может быть двух значений с одинаковым именем. Это делает их весьма полезными для определения всех возможных состояний значений, которые может обрабатывать функция.

Например, у вас может быть перечисление под названием «Фрукты» со списком возможных фруктов, которые понимает приложение. В этом ключевое отличие между использованием string для представления этой переменной — string может иметь бесконечное количество возможных значений, а это перечисление может иметь только три.

Затем вы можете использовать это перечисление в своем коде. Например, проверить, соответствует ли тип пользовательского ввода Apple, или даже передать его в качестве аргумента оператору switch/case, выполняя определенные действия для каждого типа возможного значения.

Под капотом перечисления сами имеют значения. Это будет зависеть от языковой реализации, но, например, в C# перечисления имеют целые значения по умолчанию. Значения по умолчанию начинаются с 0, 1, 2, 3 и т. д., но их можно изменить вручную, чтобы установить для каждой записи перечисления определенное значение. Например, коды состояния HTTP:

Затем его можно преобразовать туда и обратно в значение и тип перечисления, используя базовое приведение:

Помимо того, что они полезны для определения наборов элементов, перечисления отлично подходят для разработчиков. Даже если вы конвертируете в строку или целое перед отправкой данных в API, использование перечислений в вашей кодовой базе обеспечивает большую гибкость и приводит к более чистому коду.

Кроме того, наличие выпадающих списков возможных значений с автозаполнением поможет не только вам, но и всем, кто будет работать над вашей кодовой базой в будущем. Вы не хотите поддерживать код, который принимает строки в качестве аргументов и выполняет случайные действия на основе ввода. Вместо этого использование перечисления строго определяет поведение приложения.

Недостатки использования перечислений

Основным недостатком перечислений является то, что они покидают вашу кодовую базу и теряют свое особое значение. Например, если у вас есть API, в который вы сохраняете и отправляете данные, вы должны сначала сериализовать перечисление, которое по умолчанию, вероятно, принимает базовое число 0, 1, 2 и т. д. Некоторые языки поддерживают перечисления с базовой строкой. значения или пользовательские правила сериализации перечисления, которые могут помочь решить эту проблему.

Это также может быть проблемой, если ваши перечисления меняются. Как только вы начнете использовать перечисление, вы не сможете изменить его порядок, только добавьте новые элементы в конце. В противном случае данные, хранящиеся с использованием старой версии перечисления, устареют и будут искажены.

Типы Enum как флаги

Еще одно распространенное использование перечислений — определение побитовых флагов. Это довольно продвинутая концепция, но в основном каждое значение перечисления представляет собой одно логическое значение. Вместе все перечисление можно хранить в одном целом и использовать для быстрого поиска логических данных.

Это работает, потому что каждое значение перечисления устанавливается на другой бит в базовом числе. Для двоичного кода это означает, что значения перечисления будут 0, 1, 2, 4, 8, 16 и т. д. Затем вы можете сложить их вместе, чтобы представить список логических значений.

Почему это, а не несколько логических значений? Ну, во-первых, это экономит место, что в некоторых ситуациях (когда вы храните их много) может быть преимуществом. Но что еще более важно, очень быстро получить доступ к каждому значению, особенно при доступе к нескольким значениям. Например, если вы хотите проверить, выходные ли сейчас, вы можете проверить, суббота | Воскресенье, все из того же байта, который был загружен в память. ЦП нужно получить только один элемент, чтобы получить список всех состояний флагов.