本節書摘來自異步社群《精通 asp.net mvc 4》一書中的第1章,第1.2節,作者: 【美】adam freeman ,譯者: 李萍 , 徐燕萍 , 林逸 , 更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
精通 asp.net mvc 4
除微軟之外,自web form首次釋出以來,web開發技術發展迅速,這表現在幾個不同的方向。除了ajax之外,還有一些其他的主要發展。
近年來,向web标準相容的趨勢已在增強。web網站建立在比以往更廣泛的裝置和浏覽器之上,web标準(html、css、javascript等)使人們有望在任何地方——甚至在可聯網的冰箱上——都可以有相當好的浏覽體驗。現代web平台不能忽視這種商業環境和開發者對遵從web标準的追求。
html5正在進入主流運用,它給web開發人員提供了豐富的功能,這讓用戶端能夠執行一些以前要由伺服器獨自負責的工作。這些新功能以及日趨成熟的javascript庫,例如jquery、jquery ui和jquerymobile等,意味着标準已經變得更為重要,并且是更為豐富的web應用程式的重要基礎。
注:本書簡要讨論html5、jquery及其相關技術,并不打算深入,因為它們都是有自身内含的主題。如果要完整了解,可以看看apress出版的幾本adam的書:pro jquery(《精通jquery》)、pro javascript for web apps(《精通用于web應用程式的javascript》),以及the definitive guide to html5(《html 5權威指南》)。
當今的web應用程式不隻服務于html,通常也必須把json或xml資料提供給各種用戶端技術,包括ajax、silverlight以及本地智能手機等應用程式。利用rest,做這些事情會很自然。rest消除了之前web服務與web應用程式之間的差異,但這需要一種對http和url進行處理的辦法,而這種辦法卻難以得到asp.net web form的支援。
在過去的十多年中,不隻web開發得到了發展,整個軟體開發行業也朝着靈活方法學的方向轉移。這可能包含許多不同的事情,但主要是指将軟體項目的實施視為一種适應性的探索過程,以消除超前規劃的阻礙和限制。靈活方法學熱衷于将一組特定的開發實踐與促進和輔助這些實踐的工具(通常是開源的)協同推進。
測試驅動開發(tdd,test-driven development)及其最新的化身——行為驅動開發(bdd,behavior-driven development),是兩個突出的例子。其思想是,通過描述想要得到的行為範例(稱為測試或規範)來設計軟體,是以,任何時候都可以執行依附于這一實作的一套規範來驗證應用程式的穩定性和正确性(在tdd/bdd開發中,軟體是根據測試規範而實作的。于是,這套測試便可以随時用來驗證軟體這一實作——譯者注)。.net支援tdd/bdd的工具并不缺乏,但它們幾乎都不能與web form很好地工作。
單元測試工具(unit testing tools):可以規定個别類或其他孤立的小型代碼單元的行為。隻有将軟體設計成一個個獨立的子產品,才能有效地運用這些工具,以使得每個測試可以獨立地運作。遺憾的是,web form應用程式很少能夠以這種方式進行測試。根據(web form的)架構指南,要把邏輯放到事件處理程式中,乃至使用直接查詢資料庫的伺服器控件,開發者往往需要将應用程式邏輯與web form的運作時環境緊緊地耦合在一起。這是不能進行單元測試的死結。
ui自動化工具(ui automation tools):能夠根據應用程式的一個完整的運作執行個體來模拟一系列使用者互動。理論上,這些工具可以用于web form,但當頁面布局被微小改動時,它們都可能會崩潰。稍有差錯,web form就會生成完全不同的html結構和元素的id值,導緻正在使用的測試套件失效。
.net開源和獨立的軟體供應商(isv,independent software vendor)團體已經生産了無數頂級品質的單元測試架構(nunit、xunit)、模仿架構(moq、rhino mocks)、控制反轉容器(ninject、autofac)、持續內建伺服器(cruise control、teamcity)、對象關系映射工具(nhibemate、subsonic)等。這些工具和技術的支援者們都已達成一緻意見,在共享品牌alt.net下釋出并組織會議。傳統的asp.net web form因其單片式設計(指使用者界面及其背景處理邏輯被耦合在一起的設計方式——譯者注),而不适用于這些工具和技術。是以,web form未能得到專家組和行業思想上司者們起碼的尊重。
2004年,默默無聞的ruby on rails隻是一個無名倡導者的開源項目。突然有一天,ruby on rails聲名鵲起,開始轉變web 開發的規則。并不是因為它包含了革命性的技術,而在于其概念利用了已有要素,并把它們以一種有說服力且吸引人的方式融合在一起,而使現有平台相形見绌。
ruby on rails(或通常所說的rails)采納了mvc架構(馬上對此進行描述),通過運用mvc架構并遵循(而不是違背)http協定,提倡約定優于配置,并将“對象—關系”映射(orm,object-relational mapping)工具內建到它的核心,rails應用程式幾乎無需太多努力就可以建成。就好像web開發一直以來就應該是這樣,好像人們突然意識到,這些年來一直在進行工具奮戰(在努力制作一些其實不需要的工具——譯者注),而現在,這一切都結束了。
rails表明,順應web标準和rest化并不困難。它也表明,當架構支援靈活開發與tdd時,它們工作起來是最好的。從那時起,整個web開發世界都被調動起來了。
感謝rails,很快有很多web開發者以ruby作為他們的主要程式設計語言。但在當今這樣一個有強烈創新意識的社會中,出現rails的替代品隻是時間問題。2007年,最著名的sinatra問世了。
sinatra摒棄了幾乎所有标準的rails風格的底層架構(路由、控制器、視圖等),而僅僅把url模式映射到ruby代碼塊。通路者請求一個url,這會引起執行一個ruby代碼塊,并把資料回送給浏覽器——這就夠了。這是web開發的一種難以置信的簡單形式,但sinatra隻在兩個主要領域找到了利基(利基,niche,一種小範圍但很有作為的環境——譯者注)。首先,對于那些建立rest化的web服務,它恰好能夠快速完成工作(第25章會簡單涉及rest)。其次,由于sinatra可以連接配接廣泛的開源html模闆和orm技術,通常以此為基礎來裝配一個自定義的web架構,以适應手頭各種項目的體系架構需求。
sinatra尚未在rails(或asp.net mvc)等全堆棧mvc平台中占據重要的市場佔有率。這裡簡單地提到它,隻是想說明web開發行業正在朝着簡化的方向發展,也因為sinatra起到對抗其他架構(甚至聚集了更核心的特性)的作用。
web開發另一個明顯的趨勢是朝着以javascript作為主要程式設計語言的方向發展。ajax首先展示了javascript是重要的,jquery展示了它的功能強大而雅緻,而google的開源v8 javascript引擎則展示了它難以置信的快速。如今,javascript正在成為一種重要的伺服器端程式設計語言。它為一些非關系型資料庫,包括couchdb和mongo等,提供資料存儲和查詢語言服務,并被用作伺服器端平台的一種多用途語言,如node.js。
node.js于2009年出現,并很快得到了廣泛認可。從體系結構上看,它類似于sinatra,因為它不采用mvc模式,而是以更低級的方式把http請求連接配接到代碼。其關鍵創新如下所示。
使用javascript:開發者于是隻需要使用一種語言,從用戶端代碼到伺服器端邏輯,甚至對couchdb或之類的資料查詢邏輯。
完全異步:在等待輸入/輸出(i/o)或任何其他操作時,node.js的api根本不會顯露出任何形式的線程阻塞。通過啟動其操作,然後在該i/o完成時接收一個回調便實作一個完整的i/o操作。這意味着,node.js形成了非常有效的系統資源利用,使得每cpu可能處理數以萬計的并發請求(其他平台隻能期望把每cpu的并發請求限制在100左右)。
同sinatra一樣,node.js是一種利基技術。在有時間限制的情況下,建立實際應用程式的大多數事務,一般都需要用到諸如ruby on rails、asp.net mvc等全技術堆棧架構下的所有底層架構。這裡提到的node.js,隻是把asp.net mvc的某些設計放在行業趨勢的大背景下讨論。例如,asp.net mvc包含了異步控制器(将在第17章進行介紹),這就是一種以非阻塞i/o處理http請求,并提高cpu處理更多請求的方式。正如讀者将要了解到的,asp.net mvc很好地內建了運作在浏覽器端的成熟的javascript代碼。
本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。