iOS 浅谈MVC的利与弊

213 阅读5分钟
原文链接: www.jianshu.com
简介

摘自百度百科对MVC的解释 MVC

MVC (全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

三者的职责

  • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。

  • View(视图)是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。

  • Controller(控制器)是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

或许很多小伙伴感觉很疑惑,下面我们就结合例子详细说说MVC

一 初识 MVC

我们先看一副图,很清晰明了的描述了三者之间的关系

MVC.png

三者职责解释说明

  • Model层 数据处理层,包括网络请求,数据加工

  • View层 所有App上看得到的界面

  • Controller层 Model 与 View层的中介,把Model数据在View上展示出来

对应箭头解释

  1. view将用户交互通知给controller,通常使用代理。
  2. controller通过更新model来反应状态的改变。
  3. model(通常使用KVO)通知controller来更新他们负责的view
二 变异的MVC

网上还有另外一幅图也很形象的表现iOS实际开发中MVC架构图

image.png

这张图是iOS的MVC架构中最经常出现的图,因为IOS中的Controlller 是UIViewController,所以导致很多人会把视图写在Controller中,这样无疑会导致VC很臃肿。

因此,M-VC 可能是对 iOS 开发中的 MVC模式更为准确的解读,同时更也准确地描述了我们日常开发可能已经编写的 MVC 代码,但它并没有做太多事情来解决 iOS 应用中日益增长的重量级视图控制器的问题。

三 MVC的利与弊

在 iOS 开发中,MVC(Model View Controller)是构建iOS App的标准模式,是苹果推荐的一个用来组织代码的权威范式。

Apple甚至是这么说的。在MVC下,所有的对象被归类为一个Model,一个View,和一个Controller。Model持有数据,View显示与用户交互的界面,而ViewController调解Model和View之间的交互。现在,MVC 依然是目前主流客户端编程框架,但同时它也被调侃成Massive View Controller(重量级视图控制器),想必开发者在开发中无可避免被下面几个问题所困扰:

  • 厚重的ViewController
  • 遗失的网络逻辑(无立足之地)
  • 较差的可测试性

接下来就让我们一起探讨MVC的弊端,剖析问题产生原因,打造一个轻量级的ViewController,明确MVC设计模式中各个角色的职责。

3.1 厚重的View Controller

Model:模型model的对象通常非常的简单。根据Apple的文档,model应包括数据操作数据的业务逻辑。而在实践中,model层往往非常薄,不管怎样,model层的业务逻辑不应被拖入到controller。

View:视图view通常是UIKit控件,View不应该直接引用model(PS:现实中,使用了),并且仅仅通过IBAction事件引用controller。业务逻辑很明显不归入view,视图本身没有任何业务。

Controller:Controller是app的胶水代码:协调模型和视图之间的所有交互。控制器负责管理他们所拥有的视图的视图层次结构,还要响应视图的loading、appearing、disappearing等等,同时往往也会充满我们不愿暴露的model的模型逻辑以及不愿暴露给视图的业务逻辑。

网络数据的请求及后续处理,本地数据库操作,以及一些带有工具性质辅助方法都加大了Massive View Controller的产生。

3.2 遗失(无处安放)的网络逻辑

苹果使用的MVC的定义是这么说的:所有的对象都可以被归类为一个model,一个view,或是一个controller

你可能试着把它放在Model对象里,但是也会很棘手,因为网络调用应该使用异步,这样如果一个网络请求比持有它的model生命周期更长,事情将变的复杂。显然View里面做网络请求那就更格格不入了,因此只剩下Controller了。若这样,这又加剧了Massive View Controller的问题。若不这样,何处才是网络逻辑的家呢?

3.3 较差的可测试性

由于View Controller混合了视图处理逻辑和业务逻辑,分离这些成分的单元测试成了一个艰巨的任务。

四 项目实战
4.1 实际开发中MVC的使用
4.2 标准MVC的使用

本文参考
iOS 关于MVC和MVVM设计模式的那些事
杂谈: MVC/MVP/MVVM