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

🐍💬 «Кто, я?»

Обзор

ВОТ ЭТО! Я собираюсь это сделать. Я собираюсь бросить перчатку на это. Я проведу свою линию на песке, чтобы ее никогда не пересекали!

Правило стиля №1.) Константы всегда должны иметь вид кричащей змеи.

🐍💬 “Чехол с кричащей змеей?”

SCREAMING_SNAKE_CASE

🐍💬«Мои глаза!»

А как насчет перечислений? В TypeScript это объединения, но во время выполнения они являются объектами. Вопрос в том, должны ли перечисления, являющиеся константами времени выполнения, быть змеиным случаем?

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

🐍💬«Слушай, я не имею к этому никакого отношения…»

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

🐍💬«Хорошо, мистер Тезаурус…»

В любом случае, перечисления — это просто объекты, простые объекты поиска (двунаправленные поиски для их числового варианта). В них нет ничего особенного, что отличает их от других объектов. У них просто есть некоторый вспомогательный код, который вводится для числового варианта, и некоторые трюки с объединением, которые TypeScript делает за кулисами на ключах перечисления.

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

🐍💬 *смеется*"Ссс... Ссс... Ссс..."

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

Мы будем строить игру в защиту замка, в которой мы сбрасываем змей со стен нашего замка во врага.

🐍💬 *мигает*

Мы будем использовать архитектуру Entity Component System (ECS). Мы будем определять множество сущностей для нашего игрового движка, поэтому мы можем начать с создания числового перечисления, представляющего уникальный идентификатор для каждой из наших сущностей.

export enum Entity {
  Scene,
  Item,
  Container,
  Character,
}

Теперь мы хотим определить типы для каждого из основных разделов нашей системы.

interface Component {
  update(): void;
}

interface Entity {
  type: Entity, // What now brown cow? We have a naming conflict!
  addComponent(component: Component): void;
  removeComponent(component: Component): void;
  getComponent(componentType: string): Component | null;
}

interface System {
  update(): void;
  addEntity(entity: Entity): void;
  removeEntity(entity: Entities): void;
}

🐍💬«Теперь не впутывай сюда коров!»

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

Итак, типы есть типы, константы есть константы, и они никогда не сойдутся. Я рад, что мы уладили это. Перечисление проходит тест на утку (э-э... тест на змею) для константы.

Если он выглядит как змея, скользит как змея и шипит как змея, то, вероятно, это змея.

🐍💬"Я предпочитаю "danger noodle" или "hiss majesty"".

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

Заключение

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

🐄💬 «Обязательно подпишитесь!»

Активная серия