Извенстно два подхода в функциональном программировании: императивное и декларативное программирование. Разницу между ними рассмотрим на примере.
Итак, имеется строка str
, которую нужно преобразовать для передачи через адресную строку.
var str = "String to url";
Императивный (алгоритмический) подход:
var url = ""; for(var i=0; i
Декларативный подход (инкапсуляция):
const url = str.replace(/ /g, "_");
При императивном подходе интерпретатор получает подробные инструкции, как выполнить данную программу. Это самый распространённый способ написания программ.
При декларативном подходе - описание программы отделяется от её вычислений. Стоит отметить, что декларативный подход имеет ряд преимуществ: понятийные имена вызываемых функций и скрытую реализацию.
Рассмотрим еще одну задачу. И сравним два подхода в решении: императивный и декларативный подходы.
Имеется массив, в котором необходимо возвести в квадрат каждый элемент этого массива.
var arr = [0,1,2,3,4,5,6,7,8,9];
Императивная программа выглядит следующим образом:
for(let i=0; i При декларативном подходе, вместо циклаfor
мы будем использовать функциюmap
let newArr = arr.map((num)=>{return Math.pow(num, 2)})
Тоже, но короче (в коротких стрелочных функциях, если возвращаемое значение очевидно, мы можем опустить как фигурные скопки {}
тела функции, так и ключевое слово return
):
let newArr4 = arr.map((num)=>Math.pow(num, 2));
Как видите, мы вообще можем исключить циклы из программных решений. А зачем это делать? Дело в том, что цикл является имеративной управляющей структурой и с трудом поддаётся повторному использованию и встраиванию в другие операции. Кроме того, чистые декларативные функции позволяют избежать побочного эффекта - изменяемости первоначальных данных.
Практика