javascript - 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 作为附加参数传递给每个函数。我也研究过咖喱。谢谢!
解决方案
这取决于。您可以使用类来简化函数式编程。在这种情况下,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 语法
推荐阅读
- arduino - ESP32 无法连接到 iPhone 个人热点
- java - 我不断收到错误,无法导入我的内部包,所以我可以在我的代码中使用它
- mysql - 错误 2002 (HY000): 无法通过套接字 '/var/run/mysqld/mysqld.sock' 连接到本地 MySQL 服务器
- url-rewriting - 分页不适用于分类子类别
- anylogic - AnyLogic 8.7.3 materials handling library exception on ConveyorSimpleStationController
- linux - “netstat”如何收集数据?
- c# - 有没有办法在一个项目中拥有多个版本的应用程序?
- ruby-on-rails - Rails 简单形式未定义的局部变量或方法“资源”
- python - 使用浏览器 .click() 事件时会重置登录 ID 和密码,因此无法在 Python 中进行自动登录
- python - LSTM val_loss 没有从 inf 改进