Web框架的MVC符合標準的MVC嗎?

我的博客原文地址:http://www.qinblog.net/Article/article/4.html

問題的開始

最近看了阮一峰老師的博文 MVC,MVP 和 MVVM 的圖示,很多人對MVC圖示中的M和V之間的通信產(chǎn)生了疑問,那張圖是這樣的:

View 傳送指令到 Controller【1】
Controller 完成業(yè)務(wù)邏輯后,要求 Model 改變狀態(tài)【1】
Model 將新的數(shù)據(jù)發(fā)送到 View,用戶得到反饋 【1】

問題來了。
What?Model將新的數(shù)據(jù)發(fā)送到View?不是V->C->M -> C -> V嗎?

:joy:我可能用了假的MVC。

當然,產(chǎn)生疑問的一定是寫web應(yīng)用的童鞋。

MVC?

MVC是什么:一種設(shè)計模式?一種解決方案?...balabala

每個學習過web框架的朋友肯定會思考到這個問題

wiki是這么解釋的:MVC_wiki(這個詞條在wiki上其實也是很有爭議的)

當然后來MVC也有很多變體: MVP,MVVM...

MVC能做什么呢:業(yè)務(wù)邏輯和表現(xiàn)分離,數(shù)據(jù)展示相分離...balabala

我是分割線

MVC設(shè)計模式最初由Trygve Reenskaug這位挪威計算機科學家在70年代提出并應(yīng)用在Xerox PARC的smalltalk系統(tǒng)上,成功的將數(shù)據(jù)模型從系統(tǒng)內(nèi)容中分離出來。MVC設(shè)計模式普遍的應(yīng)用在GUI應(yīng)用程序上。

傳統(tǒng)的MVC圖示:


沒錯,view的更新是靠model的。

例如Android的MVC框架,model只要發(fā)現(xiàn)自已屬性有改變,就會發(fā)出事件廣播,通知所有監(jiān)聽自已此屬性的view,view收到通知后,會update自已。View只管接收改變的通知,controller只管改變model,model只管發(fā)出通知,這是非web應(yīng)用的MVC框架常見的方案?!?】

其后這種設(shè)計模式被web開發(fā)者應(yīng)用,成功的登陸web領(lǐng)域。而在web領(lǐng)域上的問題就是,客戶端是瀏覽器,view是HTML頁面,應(yīng)用層的協(xié)議是HTTP,而HTTP是一個無狀態(tài)的協(xié)議,這種無狀態(tài)行為使得model很難將更改通知view。在Web上,為了發(fā)現(xiàn)對應(yīng)用程序狀態(tài)的修改,瀏覽器必須重新查詢服務(wù)器。

MVC2

90年代sun公司為java web 應(yīng)用推出了一個設(shè)計模式 JSP model 2 architecture,既MVC2(MVC Model 2),它解決了全站JSP的Model 1模式下代碼混亂的問題,并采用了MVC的設(shè)計思想。

同時,MVC 2的設(shè)計模式下:

View接受用戶輸入,并傳遞到Controller.【3】
Controller統(tǒng)一進行處理命令,交由Model處理具體的業(yè)務(wù).【3】
經(jīng)過處理Model更新后,Controller會選一個View并把Model內(nèi)容傳遞給它.【3】

MVC2圖示

在MVC 2模式下,Controller“掌管大權(quán)”,處理起了model和view之間的聯(lián)系,model和view變得互相不可見,無法單獨通信了(當然這不是結(jié)果而是原因)。同時MVC 2也更好的解決了MVC在Web上的應(yīng)用。

MVP

當然這里不是指most valuable player啦(笑

MVC 2更像是Taligent公司90年代提出的Model–view–presenter設(shè)計模式,既MVP,當然,MVP強調(diào)了presenter和model、view的雙向通信?!?】

MVP設(shè)計模式:


現(xiàn)在的Web框架是哪種設(shè)計模式呢?

舉個栗子

CodeIgniter的MVC:


Ruby on rails的MVC:


是不是很熟悉呢?

同樣,sitepoint上的一篇關(guān)于ROR和MVC的文章Getting Started with MVC很好的闡述了Ruby on rails和MVC設(shè)計模式的聯(lián)系:

History

In order to understand the MVC framework in depth, we will explore its history first. The Model-View-Controller pattern was formulated in the 1970s by Trygve Reenskaug as part of a smalltalk system being developed at Xerox PARC. This was long before the World Wide Web saga and even before computers became personal. The smalltalk system with MVC design pattern focused on separation of concern, a design principle on which all modern web frameworks base their prioritization. They successfully separated the data model (the data processing part) from the content and content from presentation. They also implemented an intermediate driving force which was the first-in-command. Although it had some downsides, it attracted web developers, resulting in many early web frameworks using the MVC design pattern (and obviously evolving into a de facto standard for building Web applications).【7】

So, is Rails a MVC framework?

Theoretically, Rails doesn’t adhere to MVC standards. Classic MVC had models that can notify views about the changes directly. But, in Rails, model data gets sent to the views via the controller, and it is the controller that returns the HTML output back to the browser. This closely matches the Model2 design pattern initially developed by Sun Microsystems in the late 1990s for designing Java Web applications. But this wouldn’t bother Rails developers, as long as they have a delicious cup of hot coffee while busy crunching code. :)【7】

博主翻譯:

歷史

為了深入理解MVC框架,先介紹一下MVC的歷史。模型-視圖-控制器(model-view-controller)模式是由Trygve Reenskaug在1970年代作為正在開發(fā)的Xerox PARC smalltalk系統(tǒng)的一部分而制定的。這遠遠早于萬維網(wǎng)傳奇的產(chǎn)生,甚至遠早于個人電腦的產(chǎn)生。按照MVC設(shè)計模式的smalltalk系統(tǒng)關(guān)注關(guān)注點分離(separation of concern),一種所有現(xiàn)代Web框架都以其優(yōu)先級為基礎(chǔ)的設(shè)計原則。這個設(shè)計模式成功地將數(shù)據(jù)模型(數(shù)據(jù)處理部分)與演示內(nèi)容從應(yīng)用中分離出來,同時也首次實現(xiàn)了一個中間驅(qū)動層(這里指Cotroller)。雖然這個設(shè)計模式有一些缺點,但是瑕不掩瑜,很快的吸引了web開發(fā)者,使得很多早期的web框架使用了MVC設(shè)計模式(并且明顯的演變?yōu)閣eb應(yīng)用搭建的事實標準)。

所以說,Rails是MVC框架嗎?

理論上來說,Rails不遵守MVC標準,傳統(tǒng)的MVC有狀態(tài)改變時可以通知view的model, 但是在Rails中,模型數(shù)據(jù)通過控制器發(fā)送到視圖,而控制器將HTML輸出返回給瀏覽器,這與Sun公司最初于20世紀90年代開發(fā)的用于設(shè)計Java Web應(yīng)用程序的Model2設(shè)計模式十分類似。不過這些并不會對Rails的開發(fā)者造成困擾,就像他們更希望在忙碌碼代碼時能有一杯好喝的熱咖啡一樣 :)


參考文章:

【1】MVC,MVP 和 MVVM 的圖示
【2】Android 設(shè)計模式之MVC模式
【3】MVC模式及MVC1和MVC2模式的區(qū)別
【4】Model-View-Controller
【5】JSP model 2 architecture
【6】Does PHP supports MVP pattern?
【7】What is MVC in Ruby on Rails?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容