Что такое чистая функция

Ответ

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

Характеристики:

  1. Детерминированность — результат зависит только от входных аргументов.
  2. Отсутствие побочных эффектов — не изменяет глобальные переменные, не делает API-запросов, не модифицирует DOM и т.д.

Пример чистой функции:

function sum(a, b) {
  return a + b;
}

Пример НЕчистой функции:

let counter = 0;
function increment() {
  counter++; // Изменяет внешнюю переменную
  return counter;
}

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

Ответ 18+ 🔞

Да ты послушай, что за мода пошла — про эти «чистые функции» рассуждать, будто про монашек в монастыре. Ну ладно, раз уж спросил, сейчас разжуём.

Представь себе такую картину: есть у тебя функция, как автомат с газировкой советский. Кинул пятак — получил стакан «Буратино». Кинул ещё один пятак — опять «Буратино». И хоть ты весь день там пляши, она тебе всегда, блядь, один и тот же напиток за одни и те же деньги выдаст. Это и есть чистота, ёпта! Детерминированность, как они умно говорят. Результат только от того, что ты в неё сунул, и больше ни от какой хуйни.

А теперь смотри, чем она НЕ страдает:

  • Не шарит по твоим глобальным переменным, как вор по карманам.
  • Не строчит запросы куда-то на сервер, пока ты не видишь.
  • Не лезет в DOM, перекрашивая кнопки в розовый цвет просто потому, что ей скучно.
  • Короче, никаких побочных эффектов. Сидит себе тихо, как сыч, жрёт аргументы и выдаёт результат. И всё.

Вот, смотри, пример святой, блядь, чистоты:

function sum(a, b) {
  return a + b;
}

Что сюда ни подай — 2 и 3, 5 и 10 — всегда посчитает честно и никуда не денется. Предсказуемая, как день зарплаты перед увольнением.

А теперь, для контраста, глянь на эту шлюху:

let counter = 0;
function increment() {
  counter++; // Трогает внешнюю переменную! Побочный эффект!
  return counter;
}

Вызвал раз — counter стал 1. Вызвал два — уже 2. А кто его знает, что у неё в counter было до этого? Может, другой кусок кода там уже накидал? Непредсказуемость, пиздец! Тестировать такую — одно мучение.

Вот за что их, чистых-то, любят: их хоть наизусть учи, хоть тестами обкладывай — они не подведут. В том же Redux редюсеры — так те вообще обязаны быть чистыми, иначе state твой превратится в бардак, хуже чем в моей тумбочке.

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