JavaScript - очень щадящий язык. Легко написать код, который работает, но содержит ошибки.

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

Рекурсия

Рекурсия - это когда функция вызывает сама себя. Мы можем захотеть сделать это для операций с древовидными структурами.

Мы также можем использовать их вместо петель.

Когда мы пишем рекурсивный код, мы должны учитывать несколько вещей.

Убедитесь, что рекурсия остановилась

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

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

Используйте счетчики безопасности для предотвращения бесконечной рекурсии

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

Например, мы можем записать это так:

const fn = (safetyCounter = 0) => {
  if (safetyCount === 100) {
    return;
  }
  //...
  fn(safetyCounter + 1);
}

Мы увеличиваем safetyCounter на 1 каждый раз, когда вызываем fn, пока он не достигнет 100, затем он останавливается.

Ограничьте рекурсию одной функцией

Мы никогда не должны писать циклически рекурсивный код. Так что код, в котором A вызывает B, B вызывает C, а C вызывает A, не годится.

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

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

Следите за стеком

Стек вызовов - это место, где все вызываемые функции перечислены в одной коллекции в порядке LIFO.

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

Счетчик безопасности гарантирует, что мы не переполним стек.

Не используйте рекурсию для факториалов или чисел Фибоначчи

Рекурсия для факториалов или чисел Фибоначчи медленнее, чем с итерацией.

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

К тому же это намного сложнее понять, чем итеративную версию.

Табличные методы

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

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

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

Например, мы можем написать следующее, чтобы найти день недели по номеру:

const dayMap = {
  0: 'Sunday',
  1: 'Monday',
  2: 'Tuesday',
  3: 'Wednesday',
  4: 'Thursday',
  5: 'Friday',
  6: 'Saturday',
}

Это позволяет нам найти день недели, написав:

dayMap[1]

чтобы получить понедельник.

Использование true и false для логических тестов

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

Большинство людей не знают, что другие ценности противоположны лучше, чем true и false.

Поскольку JavaScript имеет логический тип, мы можем легко это использовать.

Неявно сравнивайте логические значения с истиной и ложью

Мы можем сравнивать логические значения, не записывая true или false.

Если не выписано, то сравниваем с true. Например, если у нас есть:

if (numApples > 1) {
  //...
}

это то же самое, что:

if (numApples > 1 === true) {
  //...
}

Разбейте сложные тесты на частичные тесты с новыми логическими переменными

Не следует создавать длинные логические выражения для проверок.

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

Перемещение сложных выражений в булевы функции

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

Это работает так же, как присвоение элементов переменным.

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

const isInRange = (val) => {
  const MIN = 1;
  const MAX = 10;
  return val >= MIN && val <= MAX;
}

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

Заключение

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

Если мы логические, то нам не следует напрямую сравнивать значения с true или false.

Наконец, мы можем использовать объект таблицы поиска вместо использования условных операторов для проверки простых элементов.