【发布时间】:2017-12-24 20:50:52
【问题描述】:
关于 JavaScript 中的函数式编程理论有很多不错的文章。有些甚至包含代码示例,显示了命令式/面向对象编程和声明式/函数式编程之间的区别。但是我没有发现通过简单的 JavaScript 代码示例显示如何处理 Web 应用程序中的副作用。没有现实世界的应用程序可以完全避免副作用(数据库调用、登录到控制台、保存到文件、绘制到屏幕等),我很难弄清楚它在实践中是如何完成的。
有博客文章和 S/O 答案(例如:How to perform side-effects in pure functional programming?)涉及在现实世界中处理副作用的主题,但它们通常远非简单,不包含代码示例或包括其他语言(Haskell、Scala 等)的代码示例。我还没有找到适用于 Node/JavaScript 的。
所以...鉴于以下非常简单的示例 Node/Express 应用程序与 MongoDB 数据库,必须实现哪些代码更改才能使这段代码充分反映当前的 JavaScript 函数式编程最佳实践。特别是当涉及到处理数据库调用的路由/函数时。我希望您的回答能帮助我和其他人更好地理解函数式编程的“避免副作用”概念在实际 JavaScript 中的实际应用。
/*app.js*/
const express = require('express')
const app = express()
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var greetingSchema = mongoose.Schema({
greeting: String
});
var Greeting = mongoose.model('Greeting', greetingSchema);
app.get('/', function (req, res) {
Greeting.find({greeting: 'Hello World!'}, function (err, greeting){
res.send(greeting);
});
});
app.post('/', function (req, res) {
Greeting.create({greeting: 'Wasssssssssssuuuuppppp'}, function (err, greeting){
res.send(greeting);
});
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
})
【问题讨论】:
-
这是一个不适定问题。正如你所说,“一旦完全转换为函数式编程,代码会是什么样子”——你问的问题——是没有意义的,因为“没有现实世界的应用程序可以完全避免副作用”。您上面的代码充满了副作用(登录到控制台、发送问候语、连接到数据库)。您已经避免了循环并使用了 .find 和 lambda 函数,因此本质上不是有状态的部分已经可以正常工作。目前尚不清楚您想从答案中得到什么。 (我没有对这个问题投反对票,但这可能就是有人这样做的原因)。
-
@anandsun 感谢您的反馈。我很乐意编辑问题以使其更好。也许你可以帮我做到这一点。我的印象是我的问题中的代码示例没有反映 JavaScript 函数式编程的最佳实践。我读到的关于 FP 的所有内容都让人觉得您必须使用流和 monad 以及所有其他复杂的东西来处理应用程序中的副作用和状态更改。我想知道在 JavaScript 中实际上是什么样子的。你是说我提供的代码与 JavaScript 中的 FP 一样好?
-
re:“你必须使用流和单子以及所有其他复杂的东西。”哇,不!这是一个常见的误解,它使人们远离 FP,因为他们认为它太复杂了。我喜欢 FP 并在工作中使用 Scala,但我不同意您必须使用 monad 和流。参见例如fp-is-not-the-answer。单子 > 空值。流很好。但首先,将状态性推到代码的边缘,将逻辑拆分为小函数,使用标准库函数,避免函数中的副作用等。
-
另一件事是这样的问题可能会在 StackExchange 或其他地方取得更大的成功,因为您不是在询问如何让某件事情发挥作用,而是在询问风格方面的建议,这在 StackOverflow 上通常不鼓励,因为它是主观的。
-
@neoflash 本质上,这意味着您使用 thunk(不带参数的函数)推迟不纯计算,围绕它们构建纯函数组合,并将其留给调用者实际执行它们。通过这样做,您推迟了效果,或者更寓言化,您将其推到了应用程序的边缘。
标签: javascript node.js mongodb express functional-programming