MVC,MVP,MVVM心得感悟

Posted by Swifty Wang on July 16, 2018

1.前言

最近项目不忙,闲来无事浅谈三种框架,不涉及任何框架解释以及范例代码,不熟悉的同学请先移步google搜索各种架构的解释和范例。本文仅描述个人心得体会,以及使用各类框架的适合场景。欢迎指出问题,讨论。

2.MVC

几年前刚开始写Android时一直用的MVC架构,此种架构也是google最开始在Android上使用的架构,AOSP中各类源码也是使用的此类架构。 使用之后觉得MVC框架应该是三种常用框架中最简单最普通的一种,在若干年前的其他Application中也一直流行。经受了几年甚至几十年的考验。MVC把View Controller还有model融合在一起,耦合度高,写写小App没有任何问题。比如我个人的早期APP:繁简转换 以及手指填图均使用此类框架。此框架写的好依然可以迭代多次,即使最终导致Activity和Fragment非常庞大。MVC写起来快,无需像MVP那样Contract interface. 不过缺点即耦合度高,如果若干人同时开发一个页面可能会导致互相对彼此代码不了解。并且不易unit test. 不过一个小型个人APP即使在今天如果想快速迭代上架不考虑耦合和unit test问题使用MVC也是一个不错的选择。

3.MVP

随着时间的推移, 越来越多的企业开发发现了MVC的弊端,为此很难重构(refactor)。MVP的架构被人提出,本人应该是2016年接触MVP。当时Google也力推MVP在AOSP中也有很多页面使用了MVP并写了MVP offical的google sample. 个人的APP比特币资讯以及FastNote使用了MVP架构。优点自然不用说解耦,业务逻辑和View完全分开,打开Activity和Fragment非常干净。只有View有关的logic如动画等。业务逻辑全部丢在Presenter完全处理 business logic,不涉及任何Android的View api,使用mockito和Junit就能愉快的做unit test. 此外最近一个项目需要使用同一个View但是不同的业务逻辑,类似换里不换外。用了MVP之后直接替换Presenter,再implement Contract. Presenter实现接口即可只需要关注新的logic几乎不用管View有关的logic。同理换面不换里使用MVP也是极好。如一些套壳App. MVP个人使用了两年,总体比MVC要好,也是我个人力推的首选。唯一不爽的就是要写很多interface,不过在IDE的加持下,可以自动generate也还算可以。

3.MVVM

之前的Databinding我个人一直不太喜欢,把data写在XML层,觉得耦合度甚至比MVC还高。我对XML的立即就是一个超笨的东西,不应该data model即这个view bind的是哪个data field。Google 2017出了LiveData,ViewModel还有Room data persistent. Google I/O 2018重点推了此类库。至此Google官方也完全support了MVVM架构。 本人也第一时间使用了此类框架做了港币汇率转换. 可以说livedata+viewmodel+room完成度还是很高的。可以和Rxjava结合使用。业务处理在ViewModel, 只需要使用AppCompatActivity就不用考虑data的lifecycle的问题。不用考虑View何时刷新的问题。举一个小栗子,譬如下拉刷新数据,ViewModel去拉网络最新的数据,此时把App放入后台。以往MVP或者MVC不特殊处理的话只能background更新UI或者在View onresume的时候再刷新UI。用了Livedata之后,如果有data的变化,View的observer会自动在onResume call dataChanged。无需再做任何特殊处理。这种react的思想在前端开发以及所有新的框架如flutter均有体现。应该是目前和未来几年的潮流。

4.总结

除此之外还有若干衍生架构,如MVI,MVPPM但基本只是对这三种的一种衍生,换汤不换药。
今后的开发,本人仍将着重使用MVP以及MVVM。在需要强解耦以及大项目时使用成熟的MVP,除此之外也会同时使用LiveData的MVVM架构。 以上App手指填图已开源项目地址就在本人github里。其他的有需要的同学可以留言。