В чем отличие процедурного от функционального программирования?

Как типичный "динозавр" задумался над вопросом в чем отличие двух стилей программирования. С моей динозаврской точки зрения одно и тоже.

Или все такие отличия есть?
  • Вопрос задан
  • 15047 просмотров
Пригласить эксперта
Ответы на вопрос 3
rockon404
@rockon404
Frontend Developer
Пример в контексте JavaScript:

Процедурный стиль:
const array = ['first', 'second'];

let output;

function allOdd(words) {
  let result = true;

  for (let i = 0; i < words.length; ++i) {
    const len = words[i].length;

    if (len % 2 !== 0) {
      result = false;
      break;
    }
  }

  return result;
}

output = allOdd(array);

alert(output);

Функциональный стиль:
function length(string) {
  return prop('length', string);
}

function odd(number) {
  return equals(modulus(number, 2), 0); 
}

function allOdd(...words) {
  return every(compose(odd, length), words);
}

alert(allOdd('first', 'second'));

Реализации prop, modulus, equals, every и compose оставлены за кадром. Думаю, из их названия легко понять какой результат они возвращают.
Ответ написан
@EvgeniiR
https://github.com/EvgeniiR
ФП не предполагает наличия изменяемого состояния.
Процедуры же меняют какое-то общее состояние.
Ответ написан
daruvayc0
@daruvayc0
В декларативном программировании, Вы разъясняете: я хочу, чтобы факториал n был n раз факториалом n-1(как в определении факториала в математике). 061936c90772779b902414ec897902cc4b61ca06Декларативное - это что.
const factorial = (n) => {
  return (n === 0) ? 1 : n * factorial(n-1);
}


В императивном, Вы приказываете четко передвигаться по шагам - умножать это на это, пока идет отсчет и запоминаются какие-то числа.
const factorial = (n) => {
  const iter = (counter, acc) => {
    return (counter === 0) ? acc : iter(counter - 1, counter * acc);
  }
  return iter (n, 1);
}

Императивное - это как.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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