img

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

Перечисления, или перечисляемые типы данных, - это список постоянных значений с именами, которые удобны для разработчиков. В программировании они нужны для того, чтобы определить набор предопределенных значений, которые может принимать переменная. https://www.howtogeek.com/wp-content/uploads/csit/2021/04/a868be70-5.png?width=1198&trim=1,1&bg-color=000&pad=1,1

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

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

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

https://www.howtogeek.com/wp-content/uploads/csit/2021/04/a868be70.png?trim=1,1&bg-color=000&pad=1,1

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

https://www.howtogeek.com/wp-content/uploads/csit/2021/04/a868be70-1.png?trim=1,1&bg-color=000&pad=1,1

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

https://www.howtogeek.com/wp-content/uploads/csit/2021/04/a868be70-2.png?trim=1,1&bg-color=000&pad=1,1

Они могут преобразовываться из значения в перечисление и наоборот с помощью простого приведения типов:

https://www.howtogeek.com/wp-content/uploads/csit/2021/04/a868be70-3.png?trim=1,1&bg-color=000&pad=1,1

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

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

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

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

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

Перечисления как флаги

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

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

https://www.howtogeek.com/wp-content/uploads/csit/2021/04/a868be70-5.png?width=1198&trim=1,1&bg-color=000&pad=1,1

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

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
Еще по теме:
img
SQL или NoSQL, вот в чём вопрос! И как раз с этим вопросом мы поможем сегодня разобраться. Что использовать в каких случаях, где есть какие преимущества и как возможно использовать их все вместе.
img
Вебхуки позволяют различным системам обмениваться данными в реальном времени. В этой статье мы разберём, что такое вебхук, как он работает, где и зачем его использовать, а также как настроить.
img
Redis — один из самых популярных инструментов для хранения данных. В статье разбираем, что такое Redis и как его можно использовать.
img
Маска подсети помогает определить, какие устройства находятся в одной сети, а какие – за её пределами. В этой статье разберём, что такое маска подсети, зачем она нужна и как её использовать.
img
Деплой (развертывание) приложения — это этап разработки, на котором приложение размещается и запускается на сервере. Это позволяет начать его использование. В статье разберемся, как это происходит.