@moreleaksILoveMS

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

Я понимаю, что чисто функциональную или чисто ООП программу писать будет не правильно. Лучше использовать сильные стороны обоих парадигм, но в каких конкретно задачах лучше подходят те или иные парадигмы? Приведите пожалуйста конкретные примеры (можно без кода).

Я знаю, что ФП широко применяется React/Redux разработчиками, но можно ли применять его совместно с Angular/RxJS? Я сейчас изучаю одновременно ООП и ФП, хотелось бы понимать, где лучше применять ту или иную парадигму. ООП легко заходит, ФП даётся тяжело, но какой-то прогресс есть и всё же кажется, что оно бессмысленно/многословно во многих моментах. Сейчас тренируюсь реализовывать различные алгоритмы при помощи ФП, например сортировка пузырьком (знаю код ужасен, но всё же он рабочий):
const bubbleSort = (arr, result = []) => result.concat(arr).sort();

Тот же пример на ООП:
const bubbleSort = arr => {
        for (let i = 0; i < arr.length - 1; i++) for (let j = 0; j < arr.length - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
        }
        return arr;
    };
  • Вопрос задан
  • 803 просмотра
Решения вопроса 1
xmoonlight
@xmoonlight Куратор тега JavaScript
https://sitecoder.blogspot.com
ФП - где не требуется хранение состояния, а нужно лишь значение результата. (иначе ООП).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
longclaps
@longclaps
Ты зря думаешь. Займись чем-то продуктивным. Например, прочти подходящее эссе.
Ответ написан
yurakostin
@yurakostin
Front-end developer
Привет.

В данный момент я слегка упарываюсь по ФП. И на самом деле это и хорошо и плохо одновременно.
Хорошо потому, что заставляю мозг думать немного иначе (привет рекурсия), плохо потому, что не все задачи поддаются решению в ФП стиле. К тому же рекурсия на больших данных переполняет стек, а хвостовую рекурсию пока реализовали только в сафари (прощай рекурсия). Однако функции, которые априори будут работать с маленьким размером данных я, иногда позволяю себе написать в рекурсивном виде.

К слову про RxJs. Я "̶н̶е̶ ̶ч̶и̶т̶а̶л̶,̶ ̶н̶о̶ ̶о̶с̶у̶ж̶д̶а̶ю̶"̶ , не изучал его, но слышал, что в библиотеке всё построено на ФП, и это одна из моих целей к изучению.

Как с ФП так и с ООП можно решать определённые типы задач. И порой код выглядит очень усложнённым, если мы пытаемся применить ФП для решения ООП задачи и наоборот.
Отчасти нам повезло, что js позволяет делать и так, и эдак, и не заключает нас в рамки использования какой-то одной концепции.

Забавная статья про ФП и ООП

Очень годный цикл из трёх докладов на тему ООП, и почему оно нам нужно. Здесь Антон рассказывает о том, что такое доменная сложность, и этот доклад очень повлиял на моё восприятие ФП и ООП подходов. Теперь, если нужно принять решение, какой подход использовать, я спрашиваю себя, с какой доменной сложностью я столкнулся.

Согласитесь, что до возникновения определённых требований(пока не представляю каких), нет смысла реализовывать функциональность сложения чисел с использованием ООП.

Я даже не знаю как это правильно реализовать на ООП...
class Sum {
    static sum(a, b) {
        return a + b;
    }
}

class Sum {
    constructor(a, b) {
        this.a = a;
        this.b = b;
    }
    
    sum() {
        return this.a + this.b;
    }
}


При том, что в функциональном стиле это arrow function в одну строку
const sum = (a, b) => a + b;


А в haskell это вообще великолепно:
sum :: Int -> Int -> Int
sum a b = a + b


Есть, кстати, великолепный учебник по Haskell.

В качестве эпиолга могу сказать лишь то, что скажет любой нормальный программист: пишите понятный код. Не важно в каком стиле он написан, важно чтобы он:

  • решал поставленную задачу
  • был легко поддерживаемым
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Александрия Москва
от 200 000 до 250 000 руб.
Foodtronics Москва
от 100 000 до 200 000 руб.
Алгоритмика Москва
от 120 000 до 200 000 руб.
20 авг. 2019, в 13:14
8000 руб./за проект
20 авг. 2019, в 13:02
100000 руб./за проект
20 авг. 2019, в 12:42
7000 руб./за проект