Главная

Очисти код, избавившись от условности.

Советы, которые помогут вам писать более качественный код на JavaScript и не только.

2,356 

43+

При написании кода часто возникает необходимость в использовании сложной структуры условных выражений. Как правило, в таком случае используют if-else либо switch. Однако c увеличением количества условных выражений код становится менее читабельным и более сложным. В этой статье я хочу показать элегантный способ представления сложных структур условных операторов.
Например, давайте посмотрим следующий пример:

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

Хорошо, этот код выглядит немного понятнее, чем с if-else. Также внимательный читатель заметил, что логика случая 2 и 3 одинаковая, поэтому ее можно объеднить.
Вот пример еще более упрощенного кода:

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

Этот метод отлично подходит для случая унарного определения состояния, которое делает логическое определение посредством поиска атрибутов объекта. Хорошо, а есть ли еще другой способ? Да!

Использование Map вместо Object дает множество преимуществ, о которых мы поговорим позже.
В чем разница между объектом Map и обычным объектом?
• Объект имеет свой собственный прототип, поэтому у объекта всегда есть ключ — его «прототип»
• Ключ объекта может быть только строкой или символом, но ключ Map может иметь любое значение
• Вы можете легко получить количество пар ключ-значение в Map, используя для этого атрибут size, тогда как количество пар ключ-значение в объекте можно узнать только вручную.

Теперь давайте усложним задачу. При нажатии на кнопку вам необходимо оценить не только статус, но и личность пользователя:

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

Основная логика приведенного выше кода такова: два оценочных условия объединяются в строку, служащую ключом Map, и затем значение, соответствующее определенной строке, непосредственно ищется во время запроса.
Мы также можем изменить Map на объект:

Если вам неудобен запрос в виде строки, есть и другое решение, которое заключается в использовании объекта Map в качестве ключа:

Вы также можете увидеть разницу между Map и ObjectMap может использовать любой тип данных в качестве ключа.
Давайте еще немного усложним пример. Что, если бы логика обработки status 1–4 в гостевом случае была одинакова?
Наихудший вариант таков:

Лучше было бы кэшировать функции логики обработки:

В целом, этого достаточно для повседневных нужд, но все еще немного мозолит глаз тот факт, что функция A перезаписывается четыре раза. Если вещи действительно усложняются, например, идентичность имеет 3 условия, которые имеют по 10 подусловий, вам нужно определить 30 логик обработки, большая часть которых одинаковы. Это неприемлемо.
И вы можете поступать следующим образом:

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

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

Заключение

В этой статье я показал восемь способов написания логических выражений:
1. if-else
2. switch
3. Унарное определение: хранение в объекте
4. Унарное определение: хранение Map.
5. Множественное определение: объединение условия в строку и сохранение его в Object.
6. Множественное определение: объединение условия в строку и сохранение его в Map.
7. Множественное определение: сохранение условия в качестве объекта в Map.
8. Множественное определение: сохранение условия в качестве регулярного выражения в Map.

Пусть ваш код будет представлять собой нечто большее, чем обычные if-else или switch.

Спасибо!

43+