JavaScript
Functional Programming
July 2014 15

Функциональный JavaScript, Часть 1: Введение

Original author: Leland Richardson
Translation

Введение


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
+26
24.4k 264
Comments 15