您的位置:首页 > 其它

浅谈MVC框架及其应用

2010-10-21 13:35 225 查看
从理论上谈MVC是很有必要的,不过简单的讨论M、V、C分别起什么作用,又显得空洞,毫无建设性。我今天从实际需求的角度谈一谈MVC浅层次的含义和简单的实现、应用。

光看概念,M是模块,V是视图,C是控制器。用一句话阐述,MVC就是把显示与功能相分离。当然,这样做的好处显而易见。外表的东西总是在变,不变的是处理问题的方法。不定的表现形式和稳定的方法论的辩证统一就是MVC架构。从编程的角度,模块独立、模块间低耦合、系统结构分明,可以大大提高开发效率和团队合作水平。从软件工程的角度,强化的工作分工,减少了系统开发的瓶颈。系统结构分明也彰显了多次开发模型的优势。所以在日常系统开发中使用MVC架构,已经成为一种趋势。

当然,使用MVC框架应从实用的角度出发。一味的追求复杂性,只会令系统架构师难以招架。我以PHP为例,以工作流程和开发流程为线索,简单分析,何为我心目中实用的MVC框架。

从工作流程看,系统接到的第一个信息便是用户请求。既有请求,便要解析。所以,不可或缺,MVC框架需要一个模块,就是“路由器”。呵呵,现实中的路由器,负责路由数据报。MVC的路由器就是用来解析、路由用户请求。实质上,MVC的路由器也就是分发器,把适当的请求,送到适当的控制器中。既然提到了控制器,就要不得不谈谈它的作用。控制器控制着一个系统模块的运行,它调用模型层的接口,执行该模块的实际功能,获得执行后的返回数据,然后调用前端控制器,把数据以合适的形式输出给用户。

我总结一下刚刚提到的几个模块:路由器、控制器、模型、前端控制器。对,一个简单的MVC框架只需要这四个模块。我再结合我用PHP实现的开发框架,谈谈具体细节。我这个框架使用了单入口形式。用类似于index.php的文件来接收用户的页面请求。在这个文件中,我实例化了一个类似于Dispather.class.php的路由类,把用户请求信息传入这个实例。路由实例通过一个类似Controller.inc.php的配置文件,加载适当的用户请求模块的控制器。这个Controller.inc.php的配置文件记录了本系统所有的控制器。这时候,控制器事实上已经可以调用功能模型了,可是我没有这么做,我先写了一个Controller.class.php的父类,所有系统控制器均继承自该类。我在这父类里写了两个方法,一个为getModel();一个为getView();这两个方法分别用来取得模型实例和前端控制器实例。getModel();方法我传入两个参数,一个为模型的名字,一个为模型的参数。只传入模型的名字可以得到实例么?呵呵,是的,不要忘记,PHP也实现了反射机制。我在getModel();中实现一个ModelFactory的实例。这个类专门负责生成Model的实例。

至此,模型这一块,已经顺利加载了,也顺利执行,并取得结果。下面要把结果输出了。实现这个开发框架的时候我一直在纠结,到底是使用成熟的模板引擎,例如smarty。还是自己实现呢。我没法决定,因为我不知道我这个框架要用来开发什么样的系统。如果是简单的小系统,输出结果不多的,根本不需要smarty。即使它有缓存功能,即使它速度快,也不可能比直接输出更快。所以我针对小型系统实现了一个FrontController.class.php。他可以调用html页面模板,可以输出变量。仅此而已,不过很实用。如果开发大型系统,那只能选择模板引擎了。

框架实现了,具体使用时,效果怎样呢?我用它实际开发了一些小型系统。确实可以把程序员的注意力集中于模型上,而不用去想怎么调用什么的。而且也可以合理协调美工和程序员的工作进度。基本达到预期目标。而且在实际应用中,我并没有把执行实际功能的类全部放在一起。我选择了一种更加区分话的方法,例如,我实现了一个Mysql.class.php用来处理mysql数据库的操作,它并没有和任何系统模块紧密联系,任何模块都可以调用。同样,我还实现了,Node.class.php用来生成XML节点;TxtFile.class.php用来处理文本文件的操作;String.class.php用来实现字符串的操作等等...并把这些类放到了一个叫require的文件夹中,统一调用,区别于model文件夹。

对于MVC开发框架,我也只有这么多想法了,鉴于水平有限,难免出现纰漏,望指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: