|
任何一位在兩個領域里——本地應用程序和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知識庫:Web編程是函數式編程,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。