5 лучших приемов в TypeScript, которые помогут вывести ваш код на новый уровень

Пишите лучший код с помощью рефакторинга и функциональных подходов

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

Темы для обсуждения:

  • Улучшенные проверки с помощью includes и функции выбора
  • Используйте обратные вызовы для инкапсуляции кода, который изменяется
  • Рассмотрите возможность использования комбинаторов предикатов
  • Еще лучшие комбинаторы предикатов с фабриками
  • Инкапсулировать алгоритм в новый класс

Улучшенные проверки с помощью «включает» и функцию выбора

Проблема:

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

Решение:

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

Но есть одна загвоздка.

Во-первых, у нас есть жестко закодированные данные внутри функции, или, другими словами, у нас есть неявный ввод (EDIT_ROLES).

Во-вторых, что, если мы захотим создать еще одну функцию защиты ролей, которая будет проверять разные роли действий?

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

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

Вот пример того, как легко мы можем добавить еще одну функцию защиты ролей:

Но подождите минутку. Вы, вероятно, думаете о функции селектора. Зачем нам это нужно?

С помощью функции селектора можно выбирать разные поля.

Предположим, у пользователя есть поле роли статуса команды, и нам нужно проверить, является ли он руководителем команды или менеджером. Легко разработать функцию защиты, которая соответствует указанным требованиям, используя уже реализованную функцию.

Используйте обратные вызовы для инкапсуляции кода, который изменяется

Проблема:

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

Решение:

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

Рассмотрите возможность использования комбинаторов предикатов

Проблема:

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

Решение:

Мы должны начать использовать комбинаторы предикатов. Это повысит читаемость кода и возможность его повторного использования.

Давайте посмотрим на предикаты комбинатора в действии:

Еще лучшие комбинаторы предикатов с фабриками

Проблема:

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

Решение:

Мы должны начать использовать комбинаторные фабрики предикатов. Добавим несколько:

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

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

Инкапсулировать алгоритм в новый класс

Проблема:

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

Решение:

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

дальнейшее чтение

Если вам понравилась статья, вам могут быть интересны и эти статьи:





Заключение

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

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