簡體   English   中英

如何在函數式編程語言中實現Rails類型webapp中的“模型”?

[英]How would the 'Model' in a Rails-type webapp be implemented in a functional programming language?

在MVC Web開發框架(如Ruby on Rails,Django和CakePHP)中,HTTP請求被路由到控制器,控制器獲取通常持久存儲到后端數據庫存儲的對象。 這些對象代表用戶,博客帖子等內容,並且通常在其方法中包含用於權限,獲取和/或變異其他對象,驗證等的邏輯。

這些框架都非常面向對象。 我最近一直在閱讀關於函數式編程的文章,它似乎帶來了巨大的好處,如可測試性,簡潔性,模塊性等。然而,我見過的函數式編程的大多數例子都實現了諸如quicksort或fibonnacci序列之類的瑣碎功能,而不是復雜的webapps。 我看了幾個“功能”的Web框架,他們似乎都很好地實現了視圖和控制器,但很大程度上跳過了整個“模型”和“持久性”部分。 (我正在談論更多像Compojure這樣的框架,這些框架應該是純粹功能性的,而不是像Lift那樣方便地使用Scala的OO部分用於模型 - 但如果我在這里錯了,請糾正我。)

我還沒有看到如何使用函數式編程來提供OO編程提供的隱喻,即表映射到對象,以及對象可以提供強大的封裝邏輯(如權限和驗證)的方法。 此外,使用SQL查詢來保存數據的整個概念似乎違反了整個“副作用”概念。 有人可以解釋如何在功能編程的Web框架中實現“模型”層嗎?

不想破壞面向對象的MVC框架 - 我不知道Rails,但是Django對我來說是一個很好的軟件 - 我不確定對象關系映射是一個特別好的比喻 1

當然,在OO語言中,想要根據對象來考慮表格似乎很自然,但在函數式語言中,根據表格來考慮表格是很自然的。 可以使用代數數據類型(在Haskell和其他靜態類型的函數語言中)或映射(也稱為字典;將鍵映射到值的關聯結構)輕松表示單行; 然后一個表成為一系列行,畢竟它甚至在數據庫級別。 因此,沒有從表的DB結構到編程語言中可用的其他構造的特殊映射; 你可以簡單地使用兩邊的桌子。 2

現在這並不意味着有必要使用SQL查詢來操縱數據庫中的數據,而不是基於varios RDBMS的怪癖的抽象優勢。 由於您正在使用Clojure標簽,或許您可能對ClojureQL感興趣, ClojureQL是一種嵌入式DSL,用於以通用方式與各種DB進行通信。 (請注意,它現在正在重做。)您可以使用一些此類DSL來提取數據; 使用純函數操縱如此獲得的數據; 然后顯示一些結果,並可能將一些數據保留回DB(使用相同的DSL)。


1如果你認為將技術與越南戰爭進行比較有點極端,我想我同意,但這並不意味着該文章沒有很好地描述為什么人們可能不想陷入ORM泥潭。

2請注意,您可以在OO語言中使用相同的方法,並使用與FP語言相同的方式對DB后端進行抽象(請參閱下一段)。 當然,你的MVC框架將不再像Rails那樣。

查看Conjure Web應用程序框架 ,了解如何在函數式編程語言中實現MVC框架。 Conjure使用模型層的clj-record ,它支持關聯和驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM