Web框架的MVC符合标准的MVC吗?

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

问题的开始

最近看了阮一峰老师的博文 MVC,MVP 和 MVVM 的图示,很多人对MVC图示中的M和V之间的通信产生了疑问,那张图是这样的:

View 传送指令到 Controller【1】
Controller 完成业务逻辑后,要求 Model 改变状态【1】
Model 将新的数据发送到 View,用户得到反馈 【1】

问题来了。
What?Model将新的数据发送到View?不是V->C->M -> C -> V吗?

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

当然,产生疑问的一定是写web应用的童鞋。

MVC?

MVC是什么:一种设计模式?一种解决方案?...balabala

每个学习过web框架的朋友肯定会思考到这个问题

wiki是这么解释的:MVC_wiki(这个词条在wiki上其实也是很有争议的)

当然后来MVC也有很多变体: MVP,MVVM...

MVC能做什么呢:业务逻辑和表现分离,数据展示相分离...balabala

我是分割线

MVC设计模式最初由Trygve Reenskaug这位挪威计算机科学家在70年代提出并应用在Xerox PARC的smalltalk系统上,成功的将数据模型从系统内容中分离出来。MVC设计模式普遍的应用在GUI应用程序上。

传统的MVC图示:


没错,view的更新是靠model的。

例如Android的MVC框架,model只要发现自已属性有改变,就会发出事件广播,通知所有监听自已此属性的view,view收到通知后,会update自已。View只管接收改变的通知,controller只管改变model,model只管发出通知,这是非web应用的MVC框架常见的方案。【2】

其后这种设计模式被web开发者应用,成功的登陆web领域。而在web领域上的问题就是,客户端是浏览器,view是HTML页面,应用层的协议是HTTP,而HTTP是一个无状态的协议,这种无状态行为使得model很难将更改通知view。在Web上,为了发现对应用程序状态的修改,浏览器必须重新查询服务器。

MVC2

90年代sun公司为java web 应用推出了一个设计模式 JSP model 2 architecture,既MVC2(MVC Model 2),它解决了全站JSP的Model 1模式下代码混乱的问题,并采用了MVC的设计思想。

同时,MVC 2的设计模式下:

View接受用户输入,并传递到Controller.【3】
Controller统一进行处理命令,交由Model处理具体的业务.【3】
经过处理Model更新后,Controller会选一个View并把Model内容传递给它.【3】

MVC2图示

在MVC 2模式下,Controller“掌管大权”,处理起了model和view之间的联系,model和view变得互相不可见,无法单独通信了(当然这不是结果而是原因)。同时MVC 2也更好的解决了MVC在Web上的应用。

MVP

当然这里不是指most valuable player啦(笑

MVC 2更像是Taligent公司90年代提出的Model–view–presenter设计模式,既MVP,当然,MVP强调了presenter和model、view的双向通信。【6】

MVP设计模式:


现在的Web框架是哪种设计模式呢?

举个栗子

CodeIgniter的MVC:


Ruby on rails的MVC:


是不是很熟悉呢?

同样,sitepoint上的一篇关于ROR和MVC的文章Getting Started with MVC很好的阐述了Ruby on rails和MVC设计模式的联系:

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年代作为正在开发的Xerox PARC smalltalk系统的一部分而制定的。这远远早于万维网传奇的产生,甚至远早于个人电脑的产生。按照MVC设计模式的smalltalk系统关注关注点分离(separation of concern),一种所有现代Web框架都以其优先级为基础的设计原则。这个设计模式成功地将数据模型(数据处理部分)与演示内容从应用中分离出来,同时也首次实现了一个中间驱动层(这里指Cotroller)。虽然这个设计模式有一些缺点,但是瑕不掩瑜,很快的吸引了web开发者,使得很多早期的web框架使用了MVC设计模式(并且明显的演变为web应用搭建的事实标准)。

所以说,Rails是MVC框架吗?

理论上来说,Rails不遵守MVC标准,传统的MVC有状态改变时可以通知view的model, 但是在Rails中,模型数据通过控制器发送到视图,而控制器将HTML输出返回给浏览器,这与Sun公司最初于20世纪90年代开发的用于设计Java Web应用程序的Model2设计模式十分类似。不过这些并不会对Rails的开发者造成困扰,就像他们更希望在忙碌码代码时能有一杯好喝的热咖啡一样 :)


参考文章:

【1】MVC,MVP 和 MVVM 的图示
【2】Android 设计模式之MVC模式
【3】MVC模式及MVC1和MVC2模式的区别
【4】Model-View-Controller
【5】JSP model 2 architecture
【6】Does PHP supports MVP pattern?
【7】What is MVC in Ruby on Rails?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容