Где лучше применять функциональное программирование в 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;
    };
  • Вопрос задан
  • 1001 просмотр
Решения вопроса 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
ФП - где не требуется хранение состояния, а нужно лишь значение результата. (иначе ООП).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
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.

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

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

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

Войти через центр авторизации
Похожие вопросы