關(guān)鍵要點
MVC已成為每一代軟件開發(fā)人員所最早接觸到的軟件開發(fā)原則之一。
MVC應被視為一種通用的架構(gòu)原則和方法。
MVC三元組件的語義隨架構(gòu)環(huán)境的不同而變化。
可將基于HTTP的Web MVC(WMVC)分成三個不同的類別:sWMVC、dWMVC和pWMVC。
隨著近期技術(shù)的進步,異步且實時觀察變化的“事件循環(huán)”可用于WMVC應用的實現(xiàn)。
引言
MVC( 模型-視圖-控制器 ,Model-View-Controller)最初用于設計和實現(xiàn)狹義的桌面圖形用戶界面(GUI)應用開發(fā)。經(jīng)典的MVC與面向?qū)ο蟮某绦蜷_發(fā)方法一樣,已成為每一代軟件開發(fā)人員所最早接觸到的軟件開發(fā)原則之一。雖然MVC對當今的工業(yè)界有著如此重要的影響,但是在日益互聯(lián)計算的時代,很明顯MVC的內(nèi)涵已 迷失了其精準性 。這在過去20年間對于WUI(Web圖形界面,Web Graphical Interface)開發(fā)領域尤其是如此。基于以上原因,本文意在對MVC的起源做概要地闡述之后,進而深入地探討基于Web的MVC的演進和變化。
在WUI的應用場景下,原始MVC及MVC三元組中成員對象的歷史意義和內(nèi)涵在不斷地演變和轉(zhuǎn)變形態(tài)。出于消除任何概念上的混淆的考慮,在本文的探討中將使用“WMVC”一詞表示基于Web的MVC式架構(gòu)模式。大多數(shù)技術(shù)平臺的WMVC特性正處于不斷地改進之中,這包括Microsoft的 ASP.NET MVC 、PHP的 Symfony 、Python的 Django 、Ruby的 Merb 、Java的 JSR 371 等。驅(qū)動這些平臺改進的原則,很大程度上在于JavaScript已可由客戶端瀏覽器運行。此外,不少新的網(wǎng)絡協(xié)議充實了服務器-客戶間的通信。
自JavaScript被 XMLHttpRequest 賦予新生以來,它就成為WUI開發(fā)中情有獨鐘的技術(shù)。在過去的數(shù)年內(nèi),就有超過二十種 基于WMVC的JavaScript應用萌芽發(fā)展,其中包括 Dojo 、 Angular 、 Ember 、 Backbone 和 React 等。即使不是全部的也是絕大部分的框架都是側(cè)重于客戶端組件的交互,對于WMVC視圖和控制器的組成對象而言尤其是如此。自然而言,WUI開發(fā)方法上的革新再一次引發(fā)了針對MVC亦或WMVC的大量討論。這些討論時常是十分激烈的,通常側(cè)重于某個特定的方面,或基于某個特定的環(huán)境。進而使得MVC(WMVC)衍生出一些主要差異在于控制器對象的變體,其中包括 MVA 、 MVP 、 MVVM 、 Flux 、 Redux 和SAM等。這些MVC變體時常被統(tǒng)稱為“MV*”,其中的“*”表示了各變體間的差異主要在于視圖和控制器間的交互方式。通常并不將表示現(xiàn)實世界視圖對象的模型組件整體地列入考慮中,或僅是在Web應用方案中將模型作為MVC三元組關(guān)系里的被動參與者。
自MVC概念于四十多年前被提出以來,MVC模型很有可能已經(jīng)歷了最重要的改變。在本文的探討中,我們對MVC模型做了一個寬泛的定義,這個定義中涵蓋了駐留內(nèi)存的模型對象(例如 記錄集對象 ),還有用于支撐對象的 SoR (主數(shù)據(jù)記錄系統(tǒng),System of Record)中的源數(shù)據(jù)、源文檔、源文件和原始信號,以及所有把它們同步和聚集到一起的過程。模型數(shù)據(jù)倉庫的存儲形式已從小型 軟盤 發(fā)展到 RDBMS 和MMDBMS (多模數(shù)據(jù)庫管理系統(tǒng),multi-model database management system)。早期模型數(shù)據(jù)倉庫是與駐留內(nèi)存的模型對象共處一處的,這些模型對象是獨立存在于各個用戶桌面之上的?,F(xiàn)在模型數(shù)據(jù)倉庫使用寬帶連接、分布式或基于云的系統(tǒng),其部署可遠離域?qū)ο?。存儲在這種外部環(huán)境中的數(shù)據(jù),可以被企業(yè)生態(tài)系統(tǒng)的多個系統(tǒng)修改,也可以被消費者應用的數(shù)以千計的用戶修改。這種使用場景上的根本差異,已經(jīng)在根本上地改變了模型對象的行為,進而改變了模型對象與MVC三元組中的另兩個成員間的通信和交互。
原型MVC
oMVC (原型MVC,Original MVC)是由挪威計算機科學家Trygve Reenskaug于1978年 提出 ,當時他工作于著名的 Xerox PARC 研究中心 Smalltalk 團隊中。在oMVC的概念初步成型后,最初被實現(xiàn)為 Smalltalk-80類庫 的一部分,用于桌面GUI的建立。
在那個時代,桌面應用遠非當前這樣是日常家居中的常見物品,每個應用需要獨立運行于一臺機器上,而每臺機器的存儲是有限的并且是各自獨立的。正如在圖1中所示,對oMVC模型對象的任何操作都完全由用戶行為通過控制器所觸發(fā),MVC三元組在受控的環(huán)境中進行通信、同步并保持狀態(tài)??刂破鞯闹饕饔檬蔷S持用戶和系統(tǒng)之間的聯(lián)系(參見圖1)??刂破鲗崿F(xiàn)對相關(guān)GUI組件的部署,并在屏幕上將這些GUI組件展現(xiàn)給用戶。在 Win95出現(xiàn)之前 的年代中,這是一個具有挑戰(zhàn)性的任務,因為當時MS-DOS 依然是占據(jù)主要地位的操作系統(tǒng)。在oMVC模型中,一旦用戶產(chǎn)生了某種動作,例如菜單選取、在輸入框中輸入、按鈕點擊等,控制器就會轉(zhuǎn)化這些動作為對應的改變消息,向模型傳遞這些消息,并對消息進行處理。