职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 349|回复: 5

轻松理解PHP JAVA MVC 设计模式

[复制链接]
楠楠 发表于 2011-8-26 09:49 | 显示全部楼层 |阅读模式
有人问我,什么是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-8-26 09:49 | 显示全部楼层
引用
物以致用,没有最好的,只有最合适的。

说得好!

愚人 发表于 2011-8-26 09:49 | 显示全部楼层
哦,我有个疑问,就按你的比喻,如果是一个小软件公司,或许分为程序员、项目经理、销售员就行了,可是如果是大公司,光是技术部门就分为更多的角色,部门经理,架构师,项目经理,技术经理,高级程序员,初级程序员……比如高级程序员,不光要自己写程序,还要负责帮助培训初级程序员,项目经理不光要管理程序员,还要和其他部门打交道,同理,一个小程序或许可以分得出MVC,那如果程序规模一大,谁是M,谁是V,谁是C呢,还能分得清吗?

话说我当年 发表于 2011-8-26 09:49 | 显示全部楼层
比喻不恰当。

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



木已 发表于 2011-8-26 09:49 | 显示全部楼层
讲的很通俗,有意思。

叫我小乖 发表于 2011-8-26 09:49 | 显示全部楼层
有助理解, 非常好
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-9 09:17 , Processed in 0.117244 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表