Не нарушают ли классы JavaScript ES6 функциональный стиль программирования? - PullRequest
1 голос
/ 14 июня 2019

Я неосознанно включал функциональные подходы в свой код JavaScript, но все еще не могу понять некоторые аспекты.Я не совсем понимаю, как управлять неизменным состоянием без использования классов.

Например, вот класс, который я использовал:

class User {

    constructor(id) {
        this._ref = db.collection(..).doc(id)
    }

    getUserData = async => {
        const data = await this._ref.get()
        return data.map(doc => {
            // some transformation
        })
    }

    // .. other functions that use the ref

}

Ни один из методов класса не изменяет ссылку.

Мой вопрос: является ли использование класса плохой практикой функционального программирования?Если да, то каковы стандартные альтернативные подходы?Я могу думать о передаче идентификатора в качестве дополнительного параметра для каждой функции.Я также посмотрел на карри.Спасибо!

1 Ответ

0 голосов
/ 12 июля 2019

Это зависит. Вы можете использовать классы, чтобы упростить функциональное программирование. В этом случае oop-код становится деталью реализации. Это также может быть метод оптимизации, поскольку все экземпляры класса могут использовать одни и те же экземпляры функций в классе.

Если вам нужна синтаксическая краткость чистого fp, то oop всегда будет мешать, но если вы просто хотите, чтобы ваш код был предсказуемым / тестируемым, тогда он не должен быть доминирующей парадигмой в вашей кодовой базе. Многие функциональные библиотеки используют классы под капотом.

Однако код, который вы разместили, для меня выглядит как упавший код. почему _ref вообще? Класс просто шум. Единственное, что здесь происходит, это

const getUserData = async (id) => {
    const data = await db.collection(..).doc(id);
    return data.map(doc => {
        // some transformation
    })
}

что, вероятно, лучше, чем

const getUserData = (id) => db.collection(..).doc(id)
    .then((data) => 
        data.map(doc => {
        // some transformation
        }
    );

обратите внимание, что вы можете использовать метод .then класса обещаний, чтобы избежать императивного синтаксиса async / await

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...