Введение
JavaScript мощный, но недопонятый язык программирования. Людям нравится говорить, что он является объектно-ориентированным языком программирования или является функциональным языком. Другим нравится говорить, что он не является объектно ориентированным или не является функциональным языком программирования. Некоторые скажут что он относится к обеим парадигмам или ни к одной из них — но, давайте отложим на пока этот спор в сторонку.
Давайте зададимся миссией: писать на JavaScript, используя принципы функционального программирования настолько, насколько это позволяется язык.
Эта серия постов означает, что вы отправляетесь в это путешествие вместе со мной. И, для начала, необходимо прояснить некоторые неверные концепции касающиеся функционального программирования которые возможно присутствуют у вас в голове.
Функциональное программирование (сильно) недопонято в JS-мире
Очевидно, что существует значительная группа разработчиков, использующие функциональную парадигму в JavaScript день ото дня. Я бы сказал, что существует бо́льшая группа JavaScript разработчиков, которые не понимают, что же в действительности это значит.
Я думаю, что это результат того, что большинство языков программирования используемых для веб-разработки на стороне сервера, уходят корнями в Си, и большинство согласится, что он не функциональный язык программирования.
Тут существует два момента. Первый момент может быть продемонстрирован следующим примером на jQuery, который является широко используемым:
$(".signup").click(function(event){
$("#signupModal").show();
event.preventDefault();
});
Эй, посмотрите-ка на это. Мы только что выполнили передачу анонимной функции в качестве аргумента, также известной в JavaScript под гадким названием callback-функция.
Некоторые называют это функциональным программированием. Так ли это? Не совсем!
Этот пример является демонстрацией ключевой фишки функционального программирования: функция как параметр. С другой стороны этот пример также идёт вразрез почти с любой другой из парадигм функционального программирования с какими вообще можно пойти вразрез в трёх строчках примера.
Второй момент чуточку более коварный. Читая это, некоторые модные JS разработчики думают про себя:
Ну! Я уже все знаю про функциональное программирование. Я использую Underscore.js во всех моих проектах
Underscore.js — довольно популярная JavaScript библиотека, используемая повсеместно. Для примера, скажем, что у меня имеется набор слов и нам необходим соответствующий набор из первых двух букв каждого слова. Вместе с Underscore.js это довольно легкая задача:
var firstTwoLetters = function(words){
return _.map(words, function(word){
return _.first(word, 2);
});
};
Видите! Посмотите на это JavaScript-вуду. Я использую эти чудные функциональные утилиты как_.map
и_.first
. Что ты теперь ответишь на ЭТО, Леланд?1
Хотя подчеркивание и функции вроде
_.map
— полезные функциональные парадигмы, однако способ их совместного использования в этом примере выглядит… многословным и тяжело воспринимается мной. Неужели нам все это нужно?Если мы начнем думать о вещах чуточку более «функционально», то, наверное, взяв пример выше, мы получим это:
// ... капелька магии
var firstTwoLetters = map(first(2));
Если вы подумаете об этом, то увидите всю ту же информацию в одной строчке, что и в пяти строках выше.
words
и word
просто параметры/заполнители. Реальное мясо логики заключается в комбинировании функции map
, функции first
и константы 2
в осмысленном виде.Некоторые, глядя на этот пример, могут задуматься: что ещё за «капелька магии». В конце концов, вставлять любой пример с «капелькой магии» как в примере это как… своего рода обман, а?
Что ж, я собираюсь посвятить парочку следующих постов, объясняя эту «капельку магии», так что если заинтригованы — будьте добры продолжать.
Эта серия постов призвана помочь другим научиться заимствовать красоту из языков функционального программирования в контексте JavaScript.
В следующей публикации я собираюсь поговорить о различных элементах JavasScript, которые являются функциональными, настолько же насколько и не являются таковыми. С этими знаниями мы медленно соберём воедино фундаментальные блоки функционального программирования и то, как они выглядят в JavaScript
Читать далее -> Часть 2: что делает язык «функциональным»?
Об ошибках и неточностях просьба писать сюда
1 Автор серии Leland Richardson