Функциональный 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
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 15

    +1
    Отличная серия и перевод.
    Будет полезно, спасибо.
      +7
      Мне кажется маловато для отдельной статьи лучше пару частей объединить. А так отличная статья жду продолжения.
        +1
        Там вторая достаточно большая. Это просто введение.
        –2
        Это типа как из js сделать elm-lang? :)
          0
          жесть, зачем они семантику ':' и '::' местами поменяли?
          +1
          Видите!

          Promt detected.
            0
            Заинтриговали! А где вторая часть?
              0
              Спокойствие, господа, будет вторая часть.
                0
                Интересно, ждём :)
                  0
                  Продолжаем ждать!
                    0
                    Автор оригинала тоже застрял. Только на 5-й части :(
                      0
                      Sterhel говорил, что автор желает со мной связаться, но почему-то мне так и не удалось связаться с автором. Вот что странно.
                        0
                        Я тоже пытался связаться с автором — я улучшил одну из его функций, но не смог зарегаться на том сайте, не знаю, почему…
                        А так мне очень понравились его статьи — некоторые вещи стал лучше понимать.
                          0
                          Вашу почту я ему передал в тот же день, когда с вами переписывался, собственно.

                          Судя по всему, пока всё что есть — тут tech.pro/leland/blog
                            0
                            ну, так вот и пытался я с ним связаться и через Gmail/G+ и через обратную связь tech.pro — тишина по обоим направлениям.

                Only users with full accounts can post comments. Log in, please.