对 MVVM 的理解 - V2EX
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 2167 次点击
    这是一个创建于 3785 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    我最早的时候,只知道 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     Solana     2675 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 07:14 PVG 15:14 LAX 23:14 JFK 02:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86