在MVC Web开发框架(如Ruby on Rails,Django和CakePHP)中,HTTP请求被路由到控制器,控制器获取通常持久存储到后端数据库存储的对象.这些对象代表用户,博客帖子等内容,并且通常在其方法中包含用于权限,获取和/或变异其他对象,验证等的逻辑.
这些框架都非常面向对象.我最近一直在阅读关于函数式编程的内容,它似乎带来了诸如可测试性,简洁性,模块性等巨大的好处.然而,我见过的函数式编程的大多数例子都实现了诸如quicksort或fibonnacci序列之类的琐碎功能,而不是复杂的webapps.我看了几个"功能"的Web框架,他们似乎都很好地实现了视图和控制器,但很大程度上跳过了整个"模型"和"持久性"部分.(我正在谈论更多像Compojure这样的框架,这些框架应该是纯粹的功能,而不是一些方便的似乎使用Scala的OO部分的模型 - 但如果我在这里错了,请纠正我.)
我还没有看到如何使用函数式编程来提供OO编程提供的隐喻,即表映射到对象,以及对象可以提供强大的封装逻辑(如权限和验证)的方法.此外,使用SQL查询来保存数据的整个概念似乎违反了整个"副作用"概念.有人可以解释如何在功能编程的Web框架中实现"模型"层吗?
model-view-controller functional-programming model ruby-on-rails clojure
我有以下使用 Dispatch 0.11 的代码:
def myHttpPut(urlToPut: String, params: Map[String, String]): Future[Response] = {
val req = url(urlToPut).PUT
params.foreach { case (k, v) => req.addParameter(k, v) }
Http(req)
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为 addParameter 不会修改 req - 相反,它会生成一个添加了参数的新 req 对象(在这种情况下,它被丢弃了)。写这个的最优雅的方法是什么,以便我基本上循环遍历参数,使用映射的每个键/值对调用 addParameter,构建 req 直到我将它传递给 Http(req)?