MVC模式详解 + 容易犯的理解误区

微笑、不失礼 提交于 2020-01-06 21:43:17

1:MVC模式首先不是框架!!(之前我公司新招聘进来的一个前端,刚毕业不久的,可能在学校学过Spring MVC,争论说MVC就是一个Java框架)。

2:其次,MVC也不是设计模式!!设计模式是使代码能够高复用的,减少重复搬砖工作的编写代码设计经验的总结;是具体到解决业务问题的(如单例模式,策略模式,桥接模式,观察者模式)。在菜鸟教程网也把MVC放在了设计模式左边那一栏;非常容易让匆忙学习了去面试的同学理解错误。

MVC模式其实准确来说是【框架模式】;框架模式在设计模式之上,也有利于提高代码的复用,而且是设计框架的思考和总结,框架模式会包含很多设计模式,例如MVC中就包含观察者模式,策略模式,组合模式,单例模式等等。在不同的代码模块会使用不同的设计模式达到最好的效果。

老生常谈,面试常备问题:什么是MVC,分别代表了什么?

网上一搜索一大把。

M(models):数据模型层;主要就是用来处理具体的业务逻辑,要加减乘除,割接拼接字符串,根据标志配状态什么乱七八糟业务处理都在这里;也在这里进行数据库的CURD增删改查操作,Spring 中还有种说法是持久层,其实就是数据持久化,也就是保存数据库;持久层框架就是类似于Mybatis和Hibernate之类那些。

V(view):视图层;就是用来展示处理后的数据的页面。

C(controller):控制器层;起到一个中介的作用,在接到前端请求后,指定数据模型层的哪个service对其请求数据进行对应的处理,并在处理完成数据发生变化后,返回更新View视图层(比如Spring中在Controller中使用ModelAndView那个组件可以轻松把处理后的数据返回到前端展示)。在控制器层我们也可以进行一些简单的逻辑处理,但是一般不建议,它的作用只是将view和model页面和业务处理逻辑拆分,起到沟通作用,在它里面写业务逻辑会显得臃肿不合理(我写的controller都是简单几行,最多有两个简单的判断看看具体去调用哪个Service Model)。

MVC模式听起来那么酷炫,具体用它有哪些好处呢?不用的话又会怎样呢?

我以前做过struts的小项目开发和PHP与HTML完美融合的原生态开发;没有分层级,业务代码也是写在了页面上,包括include 和 include_once ,import那些引入文件和类库的代码都是嵌在HTML页面,整个页面就会非常臃肿,而且业务复杂改起来也会非常头晕,前几行代码是处理哪个框框数据的,后几行代码又是哪个导航栏详情栏的,各种SQL语句横行穿插,改得头昏目眩,很难维护。这个页面写的服务代码,另外一个页面可能也能通用,那怎么办呢?复制粘贴过去,那假如十个活动逻辑差不多那怎么办呢?复制十份过去,因为不可能在一个HTML页面调用另外一个HTML页面的代码吧?加上以前JS一个Var就一直用,没有块级作用域和强类型声明,调试起来也是非常痛苦,基本它这个参数就是百变星君,你猜猜我是什么类型,你猜猜我从哪里来。
有了MVC模式,你不同页面可以调用同一个controller,再根据不同的状态判断调用不同的Service Model,逻辑差不多的话都可以根据参数稍微不同共用一块代码。这样开发中也有利于团队的协作开发,前端负责前端,后端专心写后端业务逻辑,数据对接好就能完美实现功能,易于移植,数据模型与视图完全独立了,换不同的前端视图甚至不同端的平台系统,页面全面更新升级等等,只要数据对接上来,调用接口后就能使用。就算有同事离职了,这样子写出来的代码也会让接手的同事容易快速上手。

缺点:网上的关于MVC模式的缺点我随便一搜索,答案都是一毛一样,全是粘贴了复制过去的,真的很绝望,为啥要这样呢?真的是搬砖工吗?一点点自己的见解都没有,就复制别人官方说法粘贴到自己写的东西上,唉

先从以前没有分层架构开发页面看,一个页面对应的处理数据全部方法直到入库,那么开发者是不是一条龙服务可以完成,只是随着业务复杂了,对前后端要求越来越高了,才进行这些分离,所以我自己总结出来的缺点有一下:

1:不易于测试!

在真实开发中,而且是很复杂的业务逻辑中(活动数据,带参打点数据,调用大量第三方服务接口接入);前端与后端分离不易于联调,分开了就会存在沟通问题,肯定不够自己一个人做完前后端思路清晰,前端不知道后端给的数据准不准确,后端不知道接口给出去后前端是哪个页面哪个操作才调用的,哪些参数能获取的哪些不能获取的,甚至前后端分离开发中很多后端都是联调时才知道自己接口返回的数据原来是这样用的,原来是展示的这么好看的。原来有的数据前端传回来就行,根本不用写多一个方法再去数据库拿。。。。。

2:运行效率低!

因为视图层数据全部来源于数据模型层,那么Model层根据业务类型不同拆分不同的controller,不同的service,不同的dao,等等。所以一个页面的数据(比如活动页),可能会要求很多个不同业务模块的数据展示(个人信息,商品信息,优惠活动,好友列表等等);那么view就要多次调用访问不同的controller模块来获取填充所需的数据。而在传统的开发中(以PHP为例),只要你在页面的<?php ?>拿到了,那么就可以直接在页面中使用,要什么拿什么马上就用什么,更加直观。

3:由于分层后增加复杂性;对于一些老项目和一些构造器和界面工具是很难支持的,要改造的话就要去重构原来的代码,这是一项时间成本和人力成本都很高的工程。

以上就是我所理解并用自己话术总结的关于MVC模式的内容;希望能帮助到更多的同学解惑,留言必回,如果有说得不对的地方欢迎纠正我,一起进步,谢谢大家!鞠躬!!在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!