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

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

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

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

Характеристики чистой функции

Для функция чтобы быть «чистым», он должен удовлетворять нескольким требованиям.

Постоянное возвращаемое значение

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

Например, рассмотрим функцию ниже:

instagram viewer
функцияумножить(а, б) {
возвращаться а * б;
}

умножить Функция в приведенном выше примере всегда будет возвращать произведение двух своих аргументов. При том же наборе аргументов он имеет постоянное возвращаемое значение.

Вызов этой функции несколько раз с одними и теми же аргументами каждый раз будет давать один и тот же результат. Например:

умножить (2, 3); // возвращает 6
умножить (2, 3); // возвращает 6
умножить (2, 3); // возвращает 6

В качестве альтернативы рассмотрим пример ниже:

функцияумножитьRandomNumber(число) {
возвращаться число * Математика.пол(Математика.случайный() * 10);
}

умножитьСлучайноеЧисло(5); // Непредсказуемые результаты
умножитьСлучайноеЧисло(5); // Непредсказуемые результаты
умножитьСлучайноеЧисло(5); // Непредсказуемые результаты

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

Нет побочных эффектов

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

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

Например, рассмотрим пример ниже:

позволять количество = 0;

функцияприращение() {
количество++;
консоль.log (количество);
}

приращение(); // Журналы 1
приращение(); // Журналы 2
приращение(); // Журналы 3

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

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

Вот так:

функцияприращение(считать) {
возвращаться количество + 1;
}

приращение(1); // возвращает 2
приращение(1); // возвращает 2
приращение(1); // возвращает 2

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

Другие характеристики

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

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

Преимущества чистых функций

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

Тестируемость

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

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

Мемоизация

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

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

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

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

параллелизм

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

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

Чистые функции vs. Нечистые функции

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

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

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