被误解的 MVC 和被神化的 MVVM

目前iOS开发应用一般是基于Swift语言的,但有些功能也会涉及到objective-c。关于MVC的争论已经有很多,对此我的观点是:对于iOS开发中的绝大部分场景来说,MVC本身是没有问题的,你认为的MVC的问题,一定是你自己理解的问题。

iOS中的MVC和MVP

简而言之,MVP是View驱动的,View层持有一个对应Presenter的引用,View上的交互事件首先会调用Presenter提供的接口,然后Presenter调用Model提供的方法取得数据,最后Presenter将取得的数据传递到View上展示.

MVC则是由Controller驱动的,Controller持有View,并响应View上的交互事件,根据交互调用不同的Model方法取得反馈数据,再将数据传递给View展示.

我的理解是,MVP是用户视角:所见即View.MVC则是程序员视角:I control everyone.

理解MVC和MVP的差别困惑的地方在于, UIViewController 到底是属于C(P)层还是V层呢?下面将分别具体分析一下这两种观点.

观点一:UIViewController的归属--->View

如果把UIViewController视为V层,即上面MVP示意图中的Passive View,那么UIViewController将只负责View布局相关逻辑,不涉及任何与Model层的交互!!

不涉及任何与Model层的交互!!

不涉及任何与Model层的交互!!

所有的业务逻辑交互通过UIViewController持有的Presenter与Model间的调用来完成.

观点二:UIViewController的归属--->Controller

那如果把UIViewController视为C层,从MVC设计理念上来说,C层不会负责具体View的布局及展示逻辑,但是由于iOS中UIViewController的特殊设计,导致很多开发者直接就在UIViewController包含了很多具体布局相关的代码,更可怕的情况是不止是View的初始化,包括网络请求及具体业务处理也被包含到UIViewController中,这也许就是有人戏称MVC为:MassiveViewController的原因.

Model,DataInfo以及对胖瘦Model的争议

Model和DataInfo的差异

MVC架构思想中更倾向于Model是一个Layer,而不是一个Object(Java或Android中的bean).

所以这里的DataInfo我将其定义为一个DTO(Data Transfer Objec),更简单的来说,就是一个数据结构,跟我们在学校学习C语言时写的一个student结构体基本是一个意思.

我的理解是,Model是用来处理业务逻辑的,可视为传统开发三层架构中的BLL(Bussiness Logic Layer)和DAL(Data Access Layer)的合体,负责所有的具体业务.比如,对一个包含安全认证的App,你可能需要一个AuthModel来负责所有的认证逻辑以及认证信息的本地持久化.这样,Controller中只需要调用AuthModel提供的接口便能完成相应安全认证功能,职责分明.

Model中的一些方法的产出DTO,用来更新View.例如UserModel会去查询用户信息,然后将服务器返回的用户信息转换成一个本地的UserInfo,将这个UserInfo传递给View进行展示.

因此业界关于胖瘦Model的争议,我更多的理解是对于DataInfo是否需要提供涉及到业务的扩展功能的争议.了解更多实战项目中的情况,可以点击:ios视频教程

(http://www.maiziedu.com/course/ios/)

业务场景举例

举例一个业务场景,一个用户信息View上需要展示用户性别,一般来说服务器只会在返回的用户信息中包含一个sex字段(这里用0代表女性,1代表男性),需要使用的时候可能需要使用if语句进行判断然后输出不同的性别文字或图片.

从个人习惯上来说,很多开发者会将服务器返回的用户信息转换成一个本地的UserInfo DTO,然后将这个DTO传递给要对应需要展示的View,然后在View中进行输出判断.

当然,开发者可能会使用现在很流行的一些字典转模型框架(YYModel,MJextension等),也可以使用这些框架提供的配置接口在转换时就实现这种输出逻辑的转换,或者直接在UerInfo sex属性的getter方法中进行转换后输出.

不管怎样,只要在DataInfo这个层级上做了类似的这些转换,那么业务逻辑就已经侵入了DTO的定义.

一种解决思路

但是,这种场景几乎又是不可避免的,如何解决呢? 被误解的 MVC 和被神化的 MVVM 提出了一种借鉴MVVM的解决思路,具体做法就是将 ViewController 给 View 传递数据这个过程,抽象成构造 ViewModel 的过程.这样抽象之后,View 只接受 ViewModel,而 Controller 只需要传递 ViewModel 这么一行代码。而另外构造 ViewModel 的过程,我们就可以移动到另外的类中了.

在我看来,这样ViewModel层其实只是把上文中对DataInfo的扩展单独提炼了出来.这样就将View层完全与业务逻辑完全隔离开.

通过对比可以发现MVC已经可以满足iOS开发重构的基本要求,下篇文章中我们将举实例来说明这一问题。

时间: 2024-10-08 10:19:14

被误解的 MVC 和被神化的 MVVM的相关文章

【转】被误解的MVC和被神化的MVVM

被误解的MVC和被神化的MVVM 作者 唐巧 发布于 2015年11月2日 | ArchSummit全球架构师峰会(北京站)2016年12月02-03日举办 被误解的 MVC MVC 的历史 MVC,全称是 Model View Controller,是模型 (model)-视图 (view)-控制器 (controller) 的缩写.它表示的是一种常见的客户端软件开发框架. MVC 的概念最早出现在二十世纪八十年代的 施乐帕克 实验室中(对,就是那个发明图形用户界面和鼠标的实验室),当时施乐帕

被误解的MVC和被神化的MVVM

被误解的 MVC MVC 的历史 MVC,全称是 Model View Controller,是模型 (model)-视图 (view)-控制器 (controller) 的缩写.它表示的是一种常见的客户端软件开发框架. MVC 的概念最早出现在二十世纪八十年代的 施乐帕克 实验室中(对,就是那个发明图形用户界面和鼠标的实验室),当时施乐帕克为 Smalltalk 发明了这种软件设计模式. 现在,MVC 已经成为主流的客户端编程框架,在 iOS 开发中,系统为我们实现好了公共的视图类:UIVie

为MVC瘦身——iOS的MVVM架构与ReactiveCocoa框架

MVC = Massive View Controller ? 有笑话称MVC为重量级的试图控制器.仔细一想,确实存在这个问题.以UITableViewController和UITableView举个例子. 一般情况下,我们没有必要创建一个自定义的tableview继承自UITableView.这意味着View的模块几乎为空白.(在相当多的时候,view也仅是一个xib文件或者一堆代码用来描述控件外观和控件的位置而已).至于Model,十分类似于JavaBean,一个类,若干属性和constru

MVVM和MVC的区别,以及MVVM的缺点

MVVM和MVC的区别 MVC和MVVM的区别其实并不大.都是一种设计思想. 主要就是MVC中Controller演变成MVVM中的viewModel. MVVM主要解决了MVC中大量的DOM操作使页面渲染性能降低,加载速度变慢,影响用户体验. 当和Model频繁发生变化,开发者需要主动更新到View. MVVM:是Model-View-ViewModel的简写 M:对应于MVC的M V:对应于MVC的V VM:ViewModel,是把MVC里的controller的数据加载,加工功能分离出来

被误解的 MVC

MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). MVC模式最早由Trygve Reenskaug在1978年提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件架构.MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能.除此之外,此模式通过对复

MVC,MVP 和 MVVM 的图示 引用地址(http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html)

分类: 开发者手册 MVC,MVP 和 MVVM 的图示 作者: 阮一峰 日期: 2015年2月 1日 复杂的软件必须有清晰合理的架构,否则无法开发和维护. MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用.它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了. 昨天晚上,我读了<Scaling Isomorphic Javascript Code>,突然意识到,它们的区别非常简单.我用几段话,就可以说清. (题图:

MVC、MVP、MVVM、Angular.js、Knockout.js、Backbone.js、React.js、Ember.js、Avalon.js 概念摘录

转自:http://www.cnblogs.com/xishuai/p/mvc-mvp-mvvm-angularjs-knockoutjs-backbonejs-reactjs-emberjs-avalonjs.html MVC MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是将 M 和 V 的实现代码分离,从而使同一个程序可以使用不同的表现形式. 交互方式(所有通信都是单向的): View 传送指令到 Contro

iOS框架MVC+MVVM结合的实战

框架对整个应用程序的作用非常重要,记得有个朋友说过:用什么框架啊,好好封装一下不就行了吗?但我的理解是,好的封装绝对可以事半功倍,但是如果不按照一定的规则进行封装就会让人有些难以理解了,维护代码的人要疯掉了,我认为架构就是规定怎么去封装的. 在拜读的大神们对框架的构思之后,我决定在我们的项目中进行实践一下.刚到了一家新公司,公司的代码极烂,没有什么设计思想,最终导致controller类的代码达到2000行,最多的三千行,非常不利于代码的复用,本来极为类似的界面,继承一下就可以搞定的东西,竟然实

iOS 基于 MVC 的项目重构总结

关于MVC的争论 关于MVC的争论已经有很多,对此我的观点是:对于iOS开发中的绝大部分场景来说,MVC本身是没有问题的,你认为的MVC的问题,一定是你自己理解的问题(资深架构师请自动忽略本文). 行文过程中查阅了互联网上的大量文档,其中水平良莠不齐(最常见的就是MVC改个名就当MVVM的),当然也有许多非常有价值的参考资料,在文末会逐一列举,以供参考. iOS中的MVC和MVP Cocoa版本的MVC 根据官网上的描述, Cocoa中的MVC是这样的: Model Objects Encaps