首页 > 解决方案 > JavaScript ES6 类是否违反函数式编程风格?

问题描述

我一直在不知不觉地在我的 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

}

没有一个类方法会改变 ref。

我的问题是类的使用是否是糟糕的函数式编程实践?如果是这样,标准的替代方法是什么?我可以考虑将 ID 作为附加参数传递给每个函数。我也研究过咖喱。谢谢!

标签: javascriptclassecmascript-6functional-programming

解决方案


这取决于。您可以使用类来简化函数式编程。在这种情况下,oop 代码成为实现细节。它也可以是一种优化技术,因为类的所有实例都可以使用类中函数的相同实例。

如果你想要纯 fp 的语法简洁,那么 oop 总是会妨碍你,但如果你只是想让你的代码是可预测/可测试的,那么它不一定是你代码库中的主导范式。许多函数库在后台使用类。

但是,您发布的代码对我来说就像 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
        }
    );

请注意,您可以在 promise 类上使用 .then 方法来避免命令式 async/await 语法


推荐阅读