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

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

Так что же такое чистая функция?

чистая функция — это функция, обладающая несколькими ключевыми характеристиками:

  1. Он всегда возвращает один и тот же результат для заданного набора входных данных ( Predictable).
  2. Он не имеет никаких побочных эффектов, то есть не изменяет никакие переменные за пределами своей области.
  3. Он не зависит от какого-либо внешнего состояния или данных.

Чистая функция

Предсказуемый:

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

Это означает, что если вы вызовете чистую функцию с одним и тем же набором входных данных несколько раз, она всегда будет возвращать один и тот же результат.

Например, рассмотрим следующую чистую функцию:

function add(x, y) {
  return x + y;
}

Эта функция предсказуема, поскольку она всегда возвращает один и тот же результат для заданного набора входных данных (x и y).

console.log(add(2, 3)); // 5
console.log(add(2, 3)); // 5
console.log(add(2, 3)); // 5

Легко предсказать, правда? но можете ли вы предсказать это?

function add(x, y) {
  return x + y + Math.random() * 10;
}

Нет, вы не можете. Потому что мы не можем «предсказать» значение Math.random().

Побочные эффекты:

Побочные эффекты — это изменения в состоянии программы или системы, вызванные функцией или операцией.

Побочные эффекты включают, помимо прочего:

  1. Изменение (мутация) глобальной переменной:
let counter = 0;

function incrementCounter() {
  counter++;
}

2. Изменение свойств объекта:

const user = {
  name: 'Ali',
  age: 30
};

function setUserName(newName) {
  user.name = newName;
}

3. Взаимодействие с внешними ресурсами:

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

function saveDataToDatabase(data) {
//  db.save(data)
}
  • Выполнение HTTP-запроса
async function getDataFromAPI() {
  const response = await fetch('https://api.example.com/data');
  const data = await response.json();
  return data;
}

4. Запрос/манипулирование DOM

function toggleVisibility(elementId) {
  const element = document.getElementById(elementId);
  if (element.style.display === 'none') {
    element.style.display = 'block';
  } else {
    element.style.display = 'none';
  }
}

5. Печать в консоль:

function printGreeting(name) {
  console.log(`Hello, ${name}!`);
}

6. Генерация исключения:

function divide(x, y) {
  if (y === 0) {
    throw new Error('Cannot divide by zero');
  }
  return x / y;
}

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

не полагается ни на какое внешнее состояние или данные:

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

let counter = 0;

function incrementCounter() {
  counter++;
  return counter;
}

Зачем нужны чистые функции?

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

  1. Предсказуемость и простота понимания: это упрощает анализ и тестирование кода, а также позволяет легко повторно использовать и создавать чистые функции в других частях вашей программы.
  2. Изоляция и отсутствие побочных эффектов.Чистые функции не взаимодействуют с внешними данными или данными и не изменяют их, поэтому у них нет побочных эффектов. Это упрощает их тестирование и отладку, так как они не создают непреднамеренных зависимостей или поведения.
  3. Параллелизм и масштабируемость.Чистые функции не полагаются на внешнее состояние или данные, поэтому их можно запускать одновременно или параллельно, не беспокоясь об условиях гонки или других проблемах параллелизма. Это упрощает оптимизацию и масштабирование кода, основанного на чистых функциях.
  4. Компонуемость и декларативное программирование. Чистые функции — это ключевой принцип функционального программирования, который представляет собой парадигму программирования, ориентированную на неизменяемость, первоклассные функции и композицию. Использование чистых функций поможет вам написать более декларативный и компонуемый код, а также упростит анализ кода и его отладку.

Чистые функции в контексте Redux

Redux — популярная библиотека управления состоянием для приложений JavaScript.

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

Резюме: