第3章 MVC

假如问一群程序员,谁是最有价值厨师?他们大概会在短暂的茫然后给出五花八门的答案,男朋友、老婆、老妈或者某家快餐连锁店的幕后大厨。显然他们对这个概念还不太熟悉,但是如果把它翻译成英文Most Valuable Cook,有些人或许就明白了。假如还不知道,说出它的简称,他们就一定很熟悉——MVC。

MVC可谓是图形用户界面软件设计的标准模式。无论采用哪种编程语言,设计的是桌面端、Web还是移动端应用程序,采用的是流行的或冷门的开发框架,遵行MVC都几乎是必然的。然而另一方面,就像一千个人眼中有一千个哈姆雷特,当人们谈论MVC时,也像谈论爱情一样,所指千变万化。

视图没有直接从模型获得更新,而是由控制器修改视图,这违背了MVC的设计原则。控制器应该对视图的细节一无所知。事件响应程序可以直接写在视图内。控制器负责系统的业务逻辑。诸如此类都是关于MVC的断言。但在其他地方,又可以看到截然相反的论断。这些被我当成反面教材列出来的话语可不是初学者的臆想,它们都是来自Google相关关键字搜索的结果前列,有的是Oracle官方网站上对MVC的介绍文章,有的是俄亥俄州立大学计算机科学与工程系的主题讲义,有的是编程社区网站的热门和高票文章。代码样例是程序员学习的重要来源。不幸的是,同样来自Google搜索结果排名前列的MVC的样例代码却良莠不齐。很难相信这些代码的作者会以他们对MVC那样的理解和代码风格在实际项目开发中应用MVC模式。

【注:上述部分论断和代码样例的出处www.oracle.com/technetwork/articles/javase/index-142890.html

http://web.cse.ohio-state.edu/~rountev/421/lectures/lecture23.pdf

http://www.austintek.com/mvc/

http://www.codeproject.com/Articles/613682/Your-first-program-using-MVC-pattern-with-Csharp-W

http://www.codeproject.com/Articles/383153/The-Model-View-Controller-MVC-Pattern-with-Csharp】

平心而论,会有这样的现象,部分原因是MVC不像Singleton之类的设计模式那样具体,没有精确的代码对应形式,而且在广泛的应用中,根据环境要求和不同编程语言的特点也产生了不少变体,如MVP(Model-View-Presenter),从而令得不同情况下三个组件所负责的功能和实现方式有所出入。这样的弹性和变化进一步让MVC在传播过程中,像故事的流传一样衍变出形形色色的版本,又像娱乐节目上经常出现的接力猜谜,每一个人从上一个人的动作中猜出在模拟什么东西,再以自己的方式表演给下一个人看,到最后一个人猜出的结果往往和最初风马牛不相及。要应对这样的困境,最好的方法是不仅知其然,还要知其所以然。本章将从简单程序的结构入手,逐步分析一个自然合理的架构随着程序的演变,如何发展成MVC。从分析MVC架构体现的设计理念辨清它的真相,理解在它的种种变体中哪些不变的部分是逻辑要求的必然结果,又有哪些部分可以适应需求、环境和实现技术做出灵活的选择。这之后再讨论桌面、移动和Web环境下MVC的具体实现。