谈谈MVC和MVVM

来源:互联网 发布:八卦软件下载 编辑:程序博客网 时间:2024/05/16 01:36

现在网上一搜MVC和MVVM的区别, 出现的都是model、view、controller、viewmodel之类的云云, 然后是大谈他们之间的关系和调用, 套路比较单一. 

会发现一个现象, 同一个功能, 菜鸟写的代码往往比大神的少, 但代码实现都是没问题的, 主要是因为大神考虑更多的是代码的封装、抽取等, 这样的代码更受企业喜欢, 在版本迭代、代码重构、功能抽取等方面更方便. 项目文件大的时候, 文件分层、代码结构就显得非常重要了.


MVC:

初学iOS时, 看到网上一直说要遵循MVC原则, 单理解M是数据模型,V是视图, C是控制器是没什么用的, iOS的MVC展现形式还是有点特殊的, 特别是controller和VIew之间的关系, controller必须负责view的展示. 接触过服务器的朋友都知道, 在服务器端, view根据model直接生成html, 然后直接给浏览器渲染和展示, 通过Ajax或者js告诉服务器controller view的响应事件, controller做的其实只有数据处理, 并没有执行UI相关的操作, 由于服务器的浏览器特性, 服务器可以理解为根本就没有view, view和controller的交互都是浏览器在做的. 然而在iOS中, controller不仅仅处理数据, 还负责view的管理以及事件的传递. MVC的本质就是将数据展示和数据进行隔离, 提高代码的复用性和扩展性.


可以看到,Controller可以和Model通信,也可以和View进行通信。继续看Controller和Model的关系,绿色的箭头代表Controller可以直接进行对Model进行访问,也就是说Model对于Controller来说就是透明的。但是Model并不知道Controller是谁。如果Model发生了变化,那么就通过Notification和KVO的方式传递给Controller。同样的Controller和View之间也是这种关系,View对Controller来说就是 透明的。Controller可以直接根据Model决定View的展示。View如果接受响应事件则通过delegate,target-action,block等方式告诉Controller的状态变化。Controller进行业务的处理,然后再控制View的展示。

Model和View并不能直接的进行通信,都必须通过Controller。那这样Model和View就是相互独立的。View只负责页面的展示,Model只是数据的存储,那么也就达到了解耦和重用的目的。

如果业务复杂起来,再加上其他乱七八糟的验证,controller就会变得很大,越来越难以维护。这个也是MVC比较明显的缺点。


MVVM:


既然controller越来越臃肿,越来越难以维护,我们怎么去优化和瘦身呢?回头再仔细看看我们所谓的业务逻辑,是干什么的?无非就是根据几个数据得出一个数据用来控制view的显示。比如展示的是什么文案,按钮能不能响应,页面能不能跳转等等。那MVVM就干了这件事,帮忙分担一下controller里面的部分业务逻辑。这个时候,controller将不再直接和真实的model进行绑定了,而通过ViewModel,viewModel进行持有真实的Model。
将MVC代码进行MVVM重构会发现, VC里面已经省去了不少的代码。一切都和viewModel进行交流。这里我只是展示一个最简单的数据展示,如果有其他响应事件,是需要viewModel开放方法来进行处理的,并要通知VC处理结果的。

当然, 虽说对于代码量较大的项目来说, MVVM有较大优势, 但是MVVM也有着特有的优点与缺点:

优点:

1) 可以兼容MVC

MVC可以很快的转换成MVVM, 可以快速抽取, 控制器可以省去一大部分展示逻辑;

2) 代码移植性强

MVVM更具备抽取封装的思想, 功能代码块耦合性低, 可以在需要的时候单独抽取出去使用, 这样在开发另外的项目的时候可以省去很多配置代码的麻烦;

3) 方便测试

在MVC下,Controller基本是无法测试的,里面混杂了个各种逻辑,而且分散在不同的地方。有了MVVM我们就可以测试里面的viewModel,来验证我们的处理结果对不对

缺点:

1) viewModel会比较庞大

我们把逻辑给了viewModel,那势必Model也会变得很复杂,里面的属性和方法越来越多。可能重写的方法比较多,因为涉及到一些数据的转换以及和controller之间的通信。

2) 类会增多, 差不多是1.5到两倍的增长;

3). 调用复杂度增加

由于MVVM相对MVC 来说多封装了一层, 代码的逻辑性更强了, 但也造成了代码的逻辑性会偏复杂, 这对于首次接触该代码的人来说会需要更多的时间去理解.


关于MVC和MVVMde一点理解, 希望对大家有用.

2 0
原创粉丝点击