成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Web編程天生就是函數式編程

開發 前端
Web應用開發和傳統的應用開發有很大的不同,同樣用Java,或者是Python,甚至C++,你既能開發本地應用,也能開發出Web應用,不同之處在于Web的載體介質,在于Web的編程模式更加類似于函數式編程。

任何一位在兩個領域里——本地應用程序和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應用程序在其幕后所做的事情。在它們的運行期里沒有什么特別的對象,它們發送和接收消息,智能的在其內部交互運 作來實現高層的行為。不,只是一些數據在用戶和數據庫之間旅行,送出去,返回來。就是一個接一個的數據流。實現這些任務的程序代碼本質上就像一個函數式程序,不管它們被構造出來的風格是什么樣的。

在討論這個問題時,有些開發者寫道:函數式編程跟Web應用開發非常的匹配。Web應用接收一個HTTP請求,生成一個HTML返回結果。這應當被認做是一個從請求到頁面的函數式功能。

而我要補充下面的東西。實現這些功能的代碼本質上反映的就是函數式的風格。我們并沒有用真正的對象把應用程序的狀態保存在內存里、用它們來實現應用 邏輯操作,我們使用的是數據庫來保存應用程序的狀態,整個的代碼基本上就是一個巨大的,復雜的函數式功能編碼,它來管理特定數據流的走向:數據庫或用戶。

從這些討論我們能得到什么?狂熱的強制使用面向對象的風格、對Web應用使用復雜的架構未必總會有好處。你不一定就能從這種架構方式中獲得有價值的 好處,但從性能和日后維護的角度看,它們卻能使你的應用過于復雜和效能低下。我們必須針對每個項目的各自情況來掂量采用某種方式的好處和壞處。

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

原文鏈接:http://www.aqee.net/2010/11/25/web-programming-is-functional-programming/

英文鏈接:http://developerart.com/publications/22/web-programming-is-functional-programming

【編輯推薦】

  1. JavaScript中的函數式編程實踐
  2. 淺談利用JSP編程思想來做ASP編程
  3. 專訪鄧草原:從對象和函數式到現實世界的項目 
責任編輯:王曉東 來源: 外刊IT評論
相關推薦

2020-03-06 08:00:06

Zookeeper分布式系統

2020-06-04 15:03:27

擺地攤互聯網風口

2013-09-09 09:41:34

2011-08-24 09:13:40

編程

2023-12-14 15:31:43

函數式編程python編程

2022-09-22 08:19:26

WebFlux函數式編程

2016-10-31 20:46:22

函數式編程Javascript

2011-03-08 15:47:32

函數式編程

2020-09-24 10:57:12

編程函數式前端

2025-03-11 10:00:20

Golang編程函數

2017-06-08 14:25:46

Kotlin函數

2020-09-22 11:00:11

Java技術開發

2016-08-11 10:11:07

JavaScript函數編程

2016-08-11 10:34:37

Javascript函數編程

2020-09-23 07:50:45

Java函數式編程

2010-03-11 10:34:22

Scala

2012-09-21 09:21:44

函數式編程函數式語言編程

2014-04-28 10:26:33

編程Web編程

2011-10-19 15:47:13

2013-03-04 10:03:17

Python函數式編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费av播放 | 看片91 | 狠狠干狠狠操 | 另类在线| 91美女在线 | 91视视频在线观看入口直接观看 | 成人av网站在线观看 | 欧美一级欧美三级在线观看 | 成人一区二区三区在线观看 | 四季久久免费一区二区三区四区 | 成人免费视频在线观看 | 国产精品美女 | 狠狠操av| 午夜91| 国产精品一区一区 | 久久久精品网站 | 神马久久av | 亚洲高清在线 | 欧美国产中文 | 亚洲人成一区二区三区性色 | 久热伊人 | 美女视频一区二区三区 | 色吧久久 | 国产传媒在线观看 | 九色国产 | 丝袜久久| 精品久久国产 | 亚洲一区精品在线 | 国产日韩欧美一区 | 久久综合九色综合欧美狠狠 | 亚洲一区视频在线 | 一区二区三区欧美大片 | 亚洲韩国精品 | 亚洲精品电影网在线观看 | 日日日干干干 | 日日操操 | 亚洲国产成人av | 日本理论片好看理论片 | 亚洲视频自拍 | 欧美日韩国产一区二区三区 | 一级欧美一级日韩片 |