V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
cralison
V2EX  ›  iDev

对 MVVM 的理解

  •  
  •   cralison · 2015-08-18 02:39:41 +08:00 · 1886 次点击
    这是一个创建于 3392 天前的主题,其中的信息可能已经有所发展或是发生改变。

    无须关心外界与现实,顺着本心去输出,只感动与你同频的人。

    我最早的时候,只知道 MVC 。模型、视图、控制器。把数据的管理与展示分开,方便开发与复用,通过控制器实现数据管理与展示之间的互动。

    我 5 月份接手的代码,把视图显示和数据处理的代码都放在 ViewController 里面,显然连 MVC 的标准都达不到。

    我之前会把数据单独一层来处理,并在数据层里实现数据的本地存储(持久化)。这一层通过被称为 S 层。所用架构就是常说的 MVC S 。

    7 月底,公司决定安排出时间对 APP 进行重写。使得我重新去考虑架构选择的问题。

    以我自己过去的经验,不管是 MVC 还是 MVC S ,视图控制器部分因为要面对初期需求的频繁迭代,会在不知不觉积累下越多越多的业务逻辑代码。相应的视图数据转换代码也越来越多。慢慢就会使视图控制器(ViewController )越来越大,越来越难管理维护。

    MVCS ,通过把数据存储抽离,是对 MVC 的最简单的优化。

    除了 MVCS 以外,我还关注到另外两个选择: 1 、业界广用的 MVVM , 2 、比较年轻的 VIPER 。

    我首先研究的是 VIPER : http://objccn.io/issue-13-5/

    VIPER 通过 Wireframe 、 Presenter 、 Interactor ,把视图和数据辙底分离,实现了最好的代码模块化复用。同时,通过 WPI 的组合,可以在产品原型阶段就积极参与开发,将大大提高开发速度。

    但 VIPER 毕竟比较年轻,熟悉的开发者不多,同事即使是我提供文档说明的前提下,也没有多少意愿去了解 VIPER 的实现。无奈之下,我重新开始研究 MVVM : http://objccn.io/issue-13-1/

    我们可以通过以下方式来理解 MVVM 与 MVC/MVCS/VIPER 之间的异同:

    MVC: View/VC + Model

    MVCS: View/VC + Store + Model

    MVVM:View/VC + ViewModel + Model

    VIPER: View/VC + Wireframe/Presenter / Interactor/Data Manager + Entity (Model )

    从上面的列表,我们可以非常清晰地看到,不管是 MVCS 、 MVVM 还是 VIPER ,其实重点主要在于对 VC 代码的拆分上。

    把原来全堆在 VC 的代码,拆分出来,成为独立的方便测试、维护、复用的单独的类。

    一般而言,通过把代码放到不同类中,实现代码的物理分割和隔离,因为更容易阅读和理解,更容易测试,将有助于提高代码质量。

    MVVM 中的 ViewModel 就是把数据的展示逻辑从 VC 中拆分出来,数据经 ViewModel 处理后,将可直接用于 View 的显示。

    在 Casa 大大的网络层架构方案里,也有类似的有趣解决方案:调整器(Reformer )。 http://casatwy.com/iosying-yong-jia-gou-tan-wang-luo-ceng-she-ji-fang-an.html

    相对而言,我还是更喜欢拆得更细的 VIPER 。通过 Wireframe/Presenter/Interactor 的封装, View 、 VC 、 Model 将会得到更好的隔离和复用。

    V IPER ,通过 View/VC/Wireframe/Presenter/Interactor/Data Manager 在纵向上完成完整的独立的业务用例。同时,通过 Wireframe 层的通信机制,完成不同业务之间的交互。纵向隔离后,只通过唯一一层进行交互,将使得代码更容易理解和组织。

    后记(下面有聊家常为主,没时间没兴趣的朋友请直接忽略):

    8 月 22 日(周六)中午 12 点到 14 点,上海陆家嘴国金中心三楼正斗餐厅,有一起来吃粥粉面饭点心的朋友吗?:)当然,我们 AA 哈:) 30 多一碗面, 20 多一碟肠粉, 50 多一个粥, 20 多一份牛肉烧卖。味道很正,价格还可以:)

    今天终于开始每组 50 次地做仰卧起坐了。一开始,我只是做 10 个就非常难受。现在一天 4 组做下来 200 个都完全可以很享受。

    我相信技术也是一样的。不用担心一开始的起点有多低,只要天天去努力去积累,总会好起来的。

    这也让我想到了,为老板工作,还是为公司工作,还是为家人工作的问题?

    在我现在看来,根本不需要去思考这些问题,只需要每天踏踏实实提高一点点技术水平,会像健身一样,实打实地慢慢地把自己变得越来越强。

    今天发现收到了 @小儿小二 对我文章《尽早开始开发的低耦合的 VIPER 架构》 http://www.jianshu.com/p/ed968bfb0aa0 的打赏。这对我是非常大的鼓励,非常感谢,祝你一切顺利:)
    之所以开始每天都写技术博客,是因为投简历屡屡受挫后总结出来的解决方法。希望所有看到这篇文章的朋友也开始和我一起天天写技术博客,不要对自己要求太高,我给我自己定的标准是:每天 100 字:)

    同样地,也希望所有看这篇文章的朋友都能去尝试建立自己的粉丝群。拥有一帮愿意听你说话的朋友,真的非常非常重要,我也从中收获了非常多。

    4 条回复    2015-09-06 16:11:05 +08:00
    suduo1987
        1
    suduo1987  
       2015-08-18 08:27:14 +08:00 via iPhone
    mvvm ,懂的人自然觉得不错,不懂的人就,曾经给公司开发过一套 mvvm 构架的 ui 动态加载 xmal ,被说成过度设计,再也不愿往单位带什么技术了。
    tigerZhang
        2
    tigerZhang  
       2015-08-18 21:50:30 +08:00
    MVVM 中如果想要优雅的实现 viewModel 和 View 之间的通信,就需要掌握 reactivecocoa 框架,这就给业务工程师带来了学习成本,感觉现在好多工程师都不愿意多学一些新技术。
    shanksxiao
        3
    shanksxiao  
       2015-08-26 00:17:05 +08:00
    为了尽量降低 MVVM 这种学习门槛 我翻译了 <<iOS 的函数响应型编程>> 放在这儿:
    https://github.com/KevinHM/FunctionalReactiveProgrammingOniOS
    希望能够有点用
    iamjjh
        4
    iamjjh  
       2015-09-06 16:11:05 +08:00
    @shanksxiao 怎么没早看到,英文之前看的好蛋疼,感谢翻译
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2835 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:35 · PVG 10:35 · LAX 18:35 · JFK 21:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.