Улучшение JavaScript с помощью перечислений

Перечисления (Enums) — распространенная функция структуры данных во многих языках программирования. Хотя JavaScript не имеет такой возможности изначально, мы можем быстро и легко добавить их.

Что такое перечисление?

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

const errors = ['Data Error', 'Lunch Error', 'Mom Error'];
Вход в полноэкранный режим Выход из полноэкранного режима

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

console.log( errors[0] );
//if you remember that zero refers to 'DataError'
//then you get the right value.
Вход в полноэкранный режим Выход из полноэкранного режима

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

Таким образом, это может быть более точно воспроизведено с помощью объекта JavaScript.

const errors = {
  DATAERROR: 'Data Error',
  LUNCHERROR: 'Lunch Error',
  MOMERROR: 'Mom Error'
}
Вход в полноэкранный режим Выход из полноэкранного режима

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

console.log( errors['DATAERROR'] );
Вход в полноэкранный режим Выход из полноэкранного режима

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

Таким образом, перечисление — это список пар ключ-значение, которые не могут быть изменены во время выполнения программы.

Создание перечислений JavaScript

Согласившись с тем, что объект является лучшим выбором, чем массив, для воспроизведения перечисления, нам нужно решить проблему readonly. Это приводит нас к методу Object.freeze.

Метод Object.freeze позволяет нам взять любой объект и изменить настраиваемые и записываемые дескрипторы свойств каждого свойства так, чтобы ни ключ, ни значение не могли быть изменены.

const errors = Object.freeze({
  DATAERROR: 'Data Error',
  LUNCHERROR: 'Lunch Error',
  MOMERROR: 'Mom Error'
});

console.log( errors['LUNCHERROR'] );
//we can use either square bracket syntax 
//or dot notation to access the values
console.log( errors.MOMERROR );
Вход в полноэкранный режим Выход из полноэкранного режима

Использование const также предотвратит присвоение любого нового значения errors и замену исходного объекта.

Применение перечислений

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

Promise.resolve(123)
  .then(async (id)=>{
    let url = `https://example.com/users/${id}`;
    let resp = await fetch(url)
    if(!resp.ok) throw new Error(errors['DATAERROR']);
    return 'burger';
  })
  .then(async (food) => {
    let isGood = await enjoyAsyncLunch(food);
    if(!isGood) throw new Error(errors['LUNCHERROR']);
    return true;
  })
  .then((ready) => {
    if( !askMomForPermission() ) throw new Error(errors.MOMERROR);
  })
  .catch((err)=> {
    console.error(`Reason for failure is ${err.message}`);
  });
Вход в полноэкранный режим Выход из полноэкранного режима

Приятным дополнительным преимуществом создания нашего объекта Enum является то, что теперь большинство IDE, таких как VSCode, смогут использовать code-complete, чтобы показать возможные значения для ошибок.

Оцените статью
devanswers.ru
Добавить комментарий