Задать вопрос
@zekohina

Почему бы не хранить состояние внутри функции?

Возьмем для примера функцию поиска максимального числа:

function getMaxNumber(numbers) {
  let maxNumber = numbers[0];
  for (let number of numbers) {
  if (number > maxNumber) maxNumber = number;
  }
  return maxNumber;
}


Функциональное программирование проповедует, что состояние ни в каком виде не должно храниться. Но чем плохо его хранить, если оно не дает побочных эффектов? Это ведь все та же чистая функция.
  • Вопрос задан
  • 346 просмотров
Подписаться 1 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 3
evgenyspace
@evgenyspace
Исследователь
Плохо хранить с точки зрения философии функционального программирования. Ведь его смысл - в математичности конструкций.
Функция то у вас чистая, но она не в функциональном стиле. Сравните:
const getMaxNumber =  (numbers) => numbers.reduce( (a, b) => (a > b) ? a : b)


P.S.: сейчас читаю книгу по ФП в JS, рекомендую!
Ответ написан
Комментировать
begemot_sun
@begemot_sun
Программист в душе.
В данной реализации функция остается чистой, т.к. никакое состояние вы там не храните.

Но если вы будете хранить состояние в функции, то функция не будет чистой.

Вы не сможете её правильно протестировать, потому что каждый раз вы будете получать разные ответы на одинаковые входящие данные.
Ответ написан
Комментировать
В сущности, если функция чистая, то не важно что там творится внутри. Если через циклы проще или производительнее — пишите через циклы. Главное чтобы не было побочных эфектов (в том числе чтения/изменения глобального состояния). Да, если на 100% следовать принципам ФП, то от изменяемого состояния нужно отказаться вообще, но при программировании на императивных языках никто так не делает по ряду причин, среди которых отсутствие в таких языках синтаксического сахара, привычного функциональщикам, а также возможные проблемы с производительностью (речь идёт в основном как раз про использование рекурсии вместо циклов, как в Вашем случае).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы