我从事网络开发已经有一段时间了,最近开始学习一些函数式编程。像其他人一样,我在将这些概念中的许多概念应用于我的专业工作时遇到了一些重大麻烦。对我来说,造成这种情况的主要原因是我看到 FP 保持无状态的目标之间的冲突似乎与我所做的大多数 Web 开发工作都与非常以数据为中心的数据库密切相关这一事实相矛盾。
让我成为 OOP 方面更高效的开发人员的一件事是发现了对象关系映射器,例如 .Net 的 MyGeneration d00dads、perl 的 Class::DBI、ruby 的 ActiveRecord 等。这让我远离从整天编写插入和选择语句,到专注于将数据作为对象轻松处理。当然,当需要 SQL 查询的功能时,我仍然可以编写它们,但除此之外,它在幕后被很好地抽象出来了。
现在,转向函数式编程,似乎许多 FP Web 框架(如 Links)需要编写大量样板 sql 代码,如本例所示。Weblocks 似乎好一点,但它似乎使用一种 OOP 模型来处理数据,并且仍然需要为数据库中的每个表手动编写代码,如本例所示。我想您使用一些代码生成来编写这些映射函数,但这似乎绝对不像lisp。
(请注意,我没有非常仔细地研究过 Weblocks 或 Links,我可能只是误解了它们的使用方式)。
所以问题是,对于 Web 应用程序的数据库访问部分(我相信它相当大),或其他需要与 sql 数据库接口的开发,我们似乎被迫走以下路径之一:
- 不要使用函数式编程
- 以令人讨厌的、非抽象的方式访问数据,包括手动编写大量 SQL 或类似 SQL 的代码 ala Links
- 强制我们的函数式语言进入伪 OOP 范式,从而消除真正函数式编程的一些优雅和稳定性。
显然,这些选项似乎都不理想。是否找到了规避这些问题的方法?这里真的有一个问题吗?
注意:我个人最熟悉 FP 方面的 LISP,所以如果你想给出任何例子并了解多种 FP 语言,lisp 可能是首选语言
PS:对于特定于 Web 开发其他方面的问题,请参阅此问题。