论坛首页 Java企业应用论坛

轻松理解PHP JAVA MVC 设计模式

浏览 4984 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-01-16   最后修改:2011-01-16
有人问我,什么是MVC 设计模式, 我通常说你就是M, 即Model模型

喝口茶,且听我慢慢道来。
MVC设计模式(Model模型-View视图-Controller控制器)一种“软件架构模式”。与开发语言无关,在PHP JAVA .NET,Python,Ruby的开发中都会用到。不要被“软件架构模式”这样的词吓到,所谓“软件架构”,就是如何把很多代码组织在一起,而“模式”就是经验的意思。如果你去做促销员,培训老师会教你如何如何与顾客沟通,这些以前成功销售员总结的经验,起个名字就叫模式。

近年来,MVC设计模式在网页开发中应用广泛,事实上MVC 设计模式是一种思想,不只应用在网页开发中,这里我们主要以网页WEB开发为主。主流的WEB开发语言都有很多优秀的MVC框架,如PHP系的Cakephp,Zend FrameWork, JAVA系的Struts,Spring,  Ruby系的Ruby on Rails,Python系的Django,本文与PHP为例,通过比喻说明MVC的思想。

第一个比喻:
在一个小型软件公司里,程序员就是Model模型,项目经理就是Controller控制器,销售员就是View视图.
我们来看程序员,项目经理,销售员的关系。项目经理通常不作具体的事,负责工作分配。
项目经理的工作就是将不同的任务合适的分配给不同的程序员,而程序员通常是接到任务后,埋头工作,完成后交给项目经理。而销售员的工作则是将产品以不同的形势包装后出售。

程序员看来是同一个东西的数据库管理程序,销售员能稍做修改后,包装成人力资源系统,客户管理系统等等。简单的说:程序员做具体的事,项目经理管工作调度,销售员包装展示产品。这就是MVC。
MVC 翻译为模型-视图-控制器,是字面翻译。我觉得MVC意译为:处理-展示-调度容易理解些。

回到开篇的问题,"有人问我,什么是MVC 设计模式, 我通常说你就是M, 即Model模型"
为什么这么说呢?应为提问的人通常是程序员,程序员就是管做事的,不同的的项目经理可让同一个程序员来做事,就像不同的Controller控制器可以调用同一个Model模型。

第二个比喻:以一个餐馆做比喻。在只有一老板的小店,通常是这样的:你说老板,来碗蛋炒饭,老板收钱后,去厨房炒饭,饭好后给你端上来。一个人搞定,没有问题。这样的小店还不少。
这就像一些老资格的PHP程序员,喜欢用VI裸写,在一个文件里搞定一切。

再来看一个大一些的餐馆,因为顾客很多,就有了分工,厨师只管炒饭,有专门的调度人员将不同的订单分配给不同的厨师,有服务员负责上菜。这里厨师就是Model模型,调度人员就是Controller控制器,上菜的服务员就像View视图,同样的蛋炒饭有的顾客要带走,就要用餐盒打包,有的顾客在餐馆茶馆吃,就要给放到碗里给顾客。至于蛋炒饭要不要打包,厨师不管,就像Model层负责返回数据,至于以PDF或是HTML展示,这是VIEW层的工作。

在MVC 设计模式中,提倡分工和专注。也就是说,各个角色做好本职工作,而不提倡越俎代庖。第一个软件公司的比喻来说,项目经理管工作分配的就不用做具体事,程序员做具体的事就不要管工作分配。

现在,PHP,JAVA,Ruby,Python等开发语员都有现成的框架可用。通过使用这些框架可以帮助程序员很好的应用MVC设计模式,
这里要着重说一点:使用了现成的框架不等于应用了MVC设计模式,不使用框架不等于没有是用MVC模式。
以PHP开发为例,好的程序员,不用框架MVC也分的清清楚楚。而有的程序员即使用了像Cakephp这样的框架,MVC也分不清楚,如在Controller里过多的逻辑处理代码,还有就是硬输出HTML标记。正确的办法是,Controller只负责对象函数调用,冗长的逻辑处理代码放到Model,Model处理逻辑后返回数组,变量或是对象,Model和Controller不要直接输出HTML标记。简单的说在Model 和 Controller 里尽肯的不要用echo直接数据到浏览器端。用return 返回数据的好处是:返回的数据可以于HTML,PDF,XML不同界面展示。

这里给PHP程序员个建议,不管你是否框架,每次想使用echo显示数据时,想一想,数据能否先放到数组里稍后再用?可以的话,就先放到数组里。除非没有其他办法,否则不要用echo,这样你的view层就能和其他程序分得很清楚。

喝口茶,讲点题外话,很多程序员认为,程序员不过是IT民工,辛苦又不挣钱,不能一辈子些程序,先干段时间的开发工作,等到30岁后,向项目经理发展。这就是从Model 层向Controller 层发展。而有的项目经理又想,成天这个项目,那个项目,都是给人打工,看看大学的一个做销售老同学,什么产品也不开发,就把别人的产品拿过来包装一下,轻松挣钱。项目经理想着向销售发展,这就像是从Controller 层向View层发展。
这是一个不是很严谨但有趣的比喻。

前面提到老PHPer不喜欢用框架,喜欢用VI 裸写。这里并非提倡或发对是否用框架。
就像前面餐馆的比喻,有些一个老板的小店能长期经营,而分工明确的大店也可能经验不善。

物以致用,没有最好的,只有最合适的。



   发表时间:2011-01-18  
引用
物以致用,没有最好的,只有最合适的。

说得好!
0 请登录后投票
   发表时间:2011-01-18  
哦,我有个疑问,就按你的比喻,如果是一个小软件公司,或许分为程序员、项目经理、销售员就行了,可是如果是大公司,光是技术部门就分为更多的角色,部门经理,架构师,项目经理,技术经理,高级程序员,初级程序员……比如高级程序员,不光要自己写程序,还要负责帮助培训初级程序员,项目经理不光要管理程序员,还要和其他部门打交道,同理,一个小程序或许可以分得出MVC,那如果程序规模一大,谁是M,谁是V,谁是C呢,还能分得清吗?
0 请登录后投票
   发表时间:2011-01-19  
比喻不恰当。

我的理解:MVC实际应该是CMV

0 请登录后投票
   发表时间:2011-06-09  
讲的很通俗,有意思。
0 请登录后投票
   发表时间:2011-06-10  
有助理解, 非常好
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics