【外刊IT評論】Web程式設計是函數語言程式設計

william26發表於2010-12-07
先宣告一下,此文章只是本人轉載的。本一直在jdon上潛水,近日在OSChina正好看到這篇文章,文中觀點與Jdon上的大力弘揚的OO思想有點出入,大家可以看下老外的文章是否也靠譜。

任何一位在兩個領域裡——本地應用程式和Web應用程式——都做過長期開發的人都會告訴你,web應用開發和傳統的應用開發有很大的不同。這指的並 不是程式語言。同樣用Java,或者是Python,甚至C++,你既能開發本地應用,也能開發出web應用。不同之處在於web的載體介質。它體現出的 是一種完全不同的部署和執行環境。它實現了一種不同的服務模式。它使用的是一種不同的應用架構。它需要程式設計師採用一種不同的思維方法,因為web程式設計所體 現出的哲學體系跟我們傳統的程式設計派系都相去甚遠。在此,對於web程式設計正規化,我們有一些有趣的事情需要去認識清楚。雖然很明顯,很真實,但卻被現代強勢的 程式設計正規化的陰影遮蔽著,被眩目的新技術和工具的光芒淹沒了。

“究竟是什麼?” – 你會問。



我們就來看看。

我們從看看典型的本地應用程式的生命週期開始,拿它跟典型的Web應用程式的相比較。我將會一直使用“生命週期”這個詞來表示應用程式的活動週期,執行時的,指的不是包括不同開發和維護階段的專案週期。

一個典型的本地應用程式的生命週期是什麼樣子的?一個使用者啟動這個程式,程式被載入到記憶體裡,開始執行。它能對使用者的輸入起反應,從磁碟上讀取文 件,或透過網路傳輸資料。它能跟其它的軟體或硬體進行互動,呼叫其它服務,或響應一個外部呼叫。它可以收集資料,累計資料,以某種方式處理這些資料。簡言 之,這些都是一個本地應用程式啟動後,執行時能做的事情。

一個典型的web應用程式的生命週期是什麼樣的呢?使用者在瀏覽器裡點選一個連結。瀏覽器向web伺服器傳送一個請求,然後會接收到響應資訊,把它展 示給使用者。非常的簡單。但應用程式並非是執行在使用者機器上的瀏覽器中的。它執行在web伺服器中。在那裡,應用並不是持續的執行。伺服器只是短暫使應用蘇 醒來完成處理請求的任務,準備好要回復的東西。這些事情發生在眨眼之間。在兩個請求之間應用並不處於執行狀態。它只是被呼叫很短的一段時間,當完成請求服 務後會立即停止執行。而且應用也不會被整個的載入到記憶體裡,只會載入對於目前的任務真正有必要的部分。你可以認為web應用程式只有一個瞬時的生命期。只 有它的執行所在的環境,也就是web伺服器在持續的執行。事實上會有一些變通的策略,例如session和資料序列化,來幫助在應用程式的生命期之間保持 資料,來模仿有狀態的操作,例如某些框架,像ASP.NET的WebForms或JSP就是這樣做的,但畢竟,這都是些技術上的技巧,跟本文所討論的問題 不相干。我們關注的是普通的web應用,關注它們處理請求的過程。這些web應用程式都只享有一個非常短暫的執行存在狀態。

對於開發本地應用程式,有很多技術被證明非常有用。物件導向的方法可以用來構造問題環境,幫助降低問題的複雜性。一些設計模式能體現出一種高效的, 而且優雅的設計方案。分層的架構把程式碼責任分離,最小化各層的依賴性。這些全是典型的最佳方案,它們在開發本地應用程式的過程中被充分的證實過。

而在web應用程式裡對這些技術方案的使用卻是另外一種不同的情形了。我們積極的使用物件導向的方法來定義我們的業務模型,我們採用各種設計模式, 我們實現分層架構。這些幫助我們提高程式碼質量,增加複用性,把應用程式組織成概念上的各個模組。這些都很有效,是我們最常用的技術路線。但即使如此,我還 是忍不住要提醒你,這些東西看起來有些多餘,有大炮打蚊子的感覺。時不時我會盯著這些精巧而且深思熟慮的程式碼,一種無由的想法會襲上我的心頭:幹嘛不把這 些全都剝離掉,直接做要做的事情呢?

什麼是直接做?想想一個應用處理一個請求的典型處理方式。在主要步驟裡發生了什麼?應用程式接收使用者輸入,校驗它,把它轉換成業務領域相關的格式, 把它傳進一個SQL語句裡,保持到資料庫裡。下面又發生了什麼?程式從資料庫裡讀出一些資料,格式化資訊,使之能夠被使用者識別,以一段HTML的形式返回 給使用者使用。就是這樣。這就是大多數web應用程式在其幕後所做的事情。在它們的執行期裡沒有什麼特別的物件,它們傳送和接收訊息,智慧的在其內部互動運 作來實現高層的行為。不,只是一些資料在使用者和資料庫之間旅行,送出去,返回來。就是一個接一個的資料流。實現這些任務的程式程式碼本質上就像一個函式式程 序,不管它們被構造出來的風格是什麼樣的。

有個討論直指這個主題: Is functional programming relevant to web development? 其中一個雄辯的使用者寫道:

“函數語言程式設計跟web應用開發非常的匹配。web應用接收一個HTTP請求,生成一個HTML返回結果。這應當被認做是一個從請求到頁面的函式式功能。”

而我要補充下面的東西。實現這些功能的程式碼本質上反映的就是函式式的風格。我們並沒有用真正的物件把應用程式的狀態儲存在記憶體裡、用它們來實現應用 邏輯操作,我們使用的是資料庫來儲存應用程式的狀態,整個的程式碼基本上就是一個巨大的,複雜的函式式功能編碼,它來管理特定資料流的走向:資料庫或使用者。

從這些討論我們能得到什麼?狂熱的強制使用物件導向的風格、對web應用使用複雜的架構未必總會有好處。你不一定就能從這種架構方式中獲得有價值的 好處,但從效能和日後維護的角度看,它們卻能使你的應用過於複雜和效能低下。我們必須針對每個專案的各自情況來掂量採用某種方式的好處和壞處。

當一個程式設計師編寫一個web應用程式,如果突然程式碼中顯示出了函數語言程式設計風格的印記時,不要馬上批評和嘲笑他。也許他是特意這樣做的。也許這是一種敏銳的感覺到web程式設計本身就是天生的函數語言程式設計的潛意識表現。

[英文出處]:Web programming is functional programming

[譯文來源]:外刊IT評論

相關文章