11

在MVC web開發框架,如Ruby on Rails的,Django的,和CakePHP,HTTP請求被路由到控制器,取其通常持續到後端數據庫存儲的對象。這些對象代表之類的用戶,博客文章等,並經常包含其方法的權限內的邏輯,獲取和/或突變其他對象,驗證等Rails類型的webapp中的'Model'如何以函數式編程語言實現?

這些框架都非常面向對象。我已經在函數式編程最近讀了,它似乎吹捧巨大的好處,如可測試性,簡潔性,模塊化等,但大部分我已經看到了函數式編程示例實現諸如快速排序或fibonnacci序列瑣碎的功能,而不是複雜的webapps。我已經看了一些'功能性'的web框架,他們似乎都實現了視圖和控制器,但很大程度上忽略了整個'模型'和'持久性'部分。 (我說的是更多關於這應該是純功能類似的Compojure框架,對電梯的東西它方便地似乎使用斯卡拉爲模型OO部分 - 但糾正我,如果我錯了這裏)

我還沒有看到的編程功能如何可以被用於提供面向對象編程提供了隱喻,即表映射到對象一個很好的解釋,和對象可以具有提供強大的方法,封裝的邏輯,如應用權限和驗證。同樣,使用SQL查詢來保存數據的整個概念似乎違反了整個「副作用」概念。有人能夠提供一個關於如何在功能性編程的Web框架中實現'模型'層的解釋嗎?

+4

功能語言試圖限制副作用是。但限制總是在程序的範圍內。數據存儲和IO存在於應用程序邊界之外,因此它們是可以接受的。一旦數據進入應用程序之後,那麼數據的轉換和路由應該是可以理解和確定的。 – 2010-04-29 23:47:20

回答

6

不希望來砸面向對象的MVC框架 - 我不知道Rails的,但Django是軟件到我的眼睛的佳作 - 我不知道該對象 - 關係映射是particularly good metaphor

當然,在一個面向對象的語言,它會很自然的想從對象的角度去思考表,但在功能性語言是很自然的在表的角度考慮表。使用代數數據類型(在Haskell和其他靜態類型函數語言中)或映射(a.k.a.字典;將關鍵字映射到值的關聯結構)可以容易地表示單行;一個表格會變成一系列的行,畢竟它甚至在數據庫層面。因此,沒有從表格的DB構造到編程語言中可用的其他構造的特殊映射;你可以簡單地在兩邊使用表格。

現在這並不意味着有必要使用SQL查詢來操縱數據庫中的數據,而不是通過對varios RDBMSs的怪癖提取抽象的好處。由於您使用的是Clojure標籤,因此您可能對ClojureQL感興趣,這是一種嵌入式DSL,用於以通用方式與各種DB進行通信。 (請注意,它現在正在重新編制。)您可以使用一些此類DSL來提取數據;使用純函數處理由此獲得的數據;然後顯示一些結果,並可能將一些數據保存到數據庫(使用相同的DSL)。


如果你認爲一個技術比較,越南戰爭是有點極端,我想我同意,但是,這並不意味着該文章沒有做discribing爲什麼一個很好的工作可能不想陷入ORM的泥潭。

請注意,您可以使用在它在FP語言做了同樣的方式,將面向對象的語言,並在DB後端同樣的方法抽象(見下段)。當然,你的MVC框架將不再像Rails那樣。

相關問題