吴卓:MVVM 在美团点评酒旅业务中的实践解析

向作者提问
美团技术团队官方账号
查看本场Chat

2018年4月2日,周一晚上8点30分,美团点评技术专家,主要负责酒店、火车票、机票等业务开发的吴卓带来了主题为《MVVM 在美团点评酒旅业务中的实践》的交流。以下是主持人天怡整理的问答实录,记录了作者和读者间问答的精彩时刻。


内容提要:

  • MVVM 和 MVP 的区别是什么?
  • 在实践中有没有发现 MVVM 和 RAC 的不足与缺陷?
  • 如何使用 RAC 编写网络层代码?
  • 现在小程序这么火,iOS 开发转小程序需要注意什么?
  • 作为一个开发者如何提高自己的技术水平?

问:MVVM 和 MVP 的区别是什么?

答:关于 MVVM 和 MVP 的区别,我引用一幅图,解释起来会比较直接一些。

第一幅图是 MVP 的,第二幅图是 MVVM 的。可以看到最大的区别在于,MVVM 中 ViewModel 和 View 之间是通过绑定进行处理的,任何一方的变动都会影响到另外一方;而 MVP 中 Presenter 会统一负责 View 层的操作。MVP中没有绑定的概念,Presenter和View层相互引用。


问:在实践中有没有发现 MVVM 和 RAC 的不足与缺陷?

答:我觉得最大的不足在两个方面:

  1. 调试比较困难;

  2. 使用具备一定的门槛。

展开点说:RAC 的 debug 调试的时候,调用栈非常繁琐,很难看清楚具体的调用流程。所以我们的方式是,基本不会去看调用栈。从代码逻辑上,去打断点调试业务逻辑代码。

门槛问题,团队内部做了比较多的培训和实践考核来解决这个问题。对于校招和社招新人,有标准的体系化课程来学习 RAC 和 MVVM 的使用,在平时的代码开发中,通过导师辅导、代码 review、分享交流等方面不断提升大家对框架的使用能力。


问:如何使用 RAC 编写网络层代码?

答:关于网络请求,相关提问比较多,我这里讲下网络层的通用做法。

大概这样的一个代码,我们会把网络请求封装成一个信号返回,记住这是一个热信号。在信号创建的时候,封装了网络请求的部分。如果网络返回错误,调用 sendError 发出错误的代码;如果网络返回成功,先调用 sendNext,把返回值发出去,然后调用 sendCompleted 方法标示这次信号触发结束(否则下次会重复调用)。

信号创建完成后调用 publish 变成热信号,调用 autoconnect 使信号生效。具体信号的基本知识大家可以看下美团点评技术 blog,上面有更详细的讲解。


问:现在小程序这么火,iOS 开发转小程序需要注意什么?

答:这个问题抽象来看可以理解是语言方向变换学习的问题。

我觉得学东西是有几个阶段层次的:

  1. 学习语言基础和框架使用;

  2. 深入了解原理加深理解;

  3. 通过所学知识真正应用到实际问题中并解决,不断提升解决问题和发现问题的能力。

如果从 iOS 开发转小程序,步骤可以按照这三步来,基础->原理->应用。从基础层面,主要是语法和框架,在有一定 iOS 开发经验的前提下,理解框架设计会比较容易些。从原理层面,据我了解,小程序的原理跟 RN、weex 这些还不太一样,它底层是通过 webview 引擎渲染的。当然小程序看不到框架源码,无法深入了解,对应的去了解 JSCore 的用法或者 RN、weex 类似的框架原理会有不少的收获。


问:作为一个开发者如何提高自己的技术水平?

答:有个词挺好的,叫“上天入地”。上天,作为开发者需要不断提升技术视野,提升自己的知识广度,不局限在自己所做的这部分,比如除了 iOS,也会关注了解 Android、FE 的东西。因为平时跟后台、数据、产品、测试都会打交道,也会通过每次的交流机会学习他们的知识。另一个层面,关注业内同行的发展,了解其他人做的事情,多多交流。入地,沉到代码的细节中,深入了解具体的实现、原理。最好的方式读源代码,读框架的代码,甚至自己尝试造轮子,加深理解。


本文首发于 GitChat,未经授权不得转载,转载需与 GitChat 联系。


在此感谢异步社区为本次活动提供的赠书《代码整洁之道》。

异步社区是人民邮电出版社旗下 IT 专业图书旗舰社区,也是国内领先的 IT 专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架。

微信扫描登录