Рубрики
Без рубрики

Как избежать нулевой проверки загрязнения в JavaScript: используйте дополнительные элементы

Константином Блохин, как избежать загрязнения нулевого проверки в JavaScript: используйте дополнительные слова. Чарли Чаувини использовал JavaScript за последние несколько лет и наслаждался этим в целом. Но ему не хватает каких-то крутых особенностей с других языков. Например, нет встроенного сейфа

Автор оригинала: FreeCodeCamp Community Member.

Константин Блохин

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

Что не так с нулевыми чеками, вы можете спросить?

Прежде всего, изобретатель нулевой ссылки Тони Хоар , называется Это Ошибка миллиарда долларов:

JavaScript ничем не отличается. Сколько раз вы столкнулись Типерр: Не удается прочитать свойство «Бар» нулевого ошибка? Чтобы избежать этого, разработчики всегда должны Держите эту нулевую возможность в виду. И они предпочли бы сконцентрироваться на реальной, как логика для конкретной приложения.

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

Мне нравится один из способов решения этой проблемы, объяснил здесь Михаил перьями – «команды вместо запросов». И он также развивает эту идею и Переговоры о преимуществах безусловного кодекса в целом.

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

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

Итак, я бы предпочел иметь какой-то модуль для инкапсуляции проверки логики. Поэтому мы просто говорим, что делать с активным пользователем:

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

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

Требуется более общий подход. То, что нам нужно, это специальный тип данных, контейнер для ненужных значений – например Необязательно Класс в Java, например. Точка – это любые действия, данные для контейнера, будут выполняться только на непустой, содержащем значение.

Есть некоторые библиотеки JS (например, Дополнительные. Но они не учитывают асинхронную природу js и не работают с обещаниями.

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

Вот когда Asyncoptional приходит к спасению. Итак, Это контейнер для дополнительного значения асинхронной природы Отказ Необязательно означает, что значение может присутствовать или отсутствовать. Оба null и undefined считаются отсутствующими.

Как только мы хотим сказать программе, что делать с непустойным значением, фабричный метод называется «с»:

const withUser = AsyncOptional.with(user);

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

Например, когда нам не нужно реагировать на пустое значение:

Мы также можем указать, что делать в случае отсутствия значения в этом естественном языкообразном способе:

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

Некоторые из действий, которые вы можете использовать для обработки значения:

Итак, давайте возьмем последний взгляд на наш пример:

Итак, как лучше по сравнению с начальным?

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

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

Далее мы устранили возможность иметь NULL Указанные исключения здесь. Это означает, что нам не нужно соблюдать соблюдение значения значения, которая составляет один из способов ввести ошибки.

Другим случаем Библиотека может пригодиться, находится в ситуации «значение по умолчанию». Скажем, у нас есть какая-то форма для заполнения пользователя, а среди других областей есть выбор фруктов. Пользователь может выбрать апельсин, яблоко или ничего.

Таким образом, вывод:

conditionalChooseFruit('Joe');// => You chose nothing, Joe.
conditionalChooseFruit('Joe', {notFruit: 'x'});// => You chose nothing, Joe.
conditionalChooseFruit('Joe', {fruit: 1});// => You chose apple, Joe.
conditionalChooseFruit('Joe', {fruit: 11});// => You chose a wrong gardener to mess with, Joe.

Для меня этот метод выглядит немного грязным даже с помощью асинхронизации/ждут и обращающихся. Бизнес-логика размытается у условных ветвей.

А с асинкопионным его можно переписать более простым способом:

Разве это не читабелее?

Итак, Asyncoptional Библиотека может помочь вам:

  • Запись кода вы можете найти более читаемый, ремонтопригодные, чистые и красивые;
  • Избегайте нулевых Видеораторы Лучше, тем самым повышая стабильность вашей системы;
  • Работайте с обещаниями и асинхронными функциями такими же чистыми способами (и она работает с синхронными теми).

Если вам понравились примеры, пожалуйста, не стесняйтесь исследовать Прочти меня файл в Гадость репо или даже проверьте полный API Docs. Отказ Я даже смею предложить, чтобы вы могли установить Пакет через НПМ Отказ:) Я бы тоже был бы признателен за любые отзывы.

Async-опционально Дополнительная реализация с Async Support www.npmjs.com.