【51CTO.com原创稿件】2007年第一代iPhone的发布开启了智能手机的新时代,至今移动开发已跨越了十年的路程,十年中有着太多的改变。随着移动互联网的突飞猛进,人们的生活方式也在日益变化着,身处在单调生活中的人们也开始注重健康的生活方式,咕咚(Codoon)则是看中了这一市场,致力于通过游戏化、社交化和碎片化的方式,来鼓励人们形成良好的运动习惯和生活方式,从而获得身体的健康。
此次由51CTO主办的2017WOTA全球架构与运维技术峰会上,咕咚技术总监唐平麟老师分享了主题为《第十年的选择》的演讲。
咕咚作为中国最大的运动社交服务平台,其APP需要与手机硬件绑定的非常多,基本使用到手机里所有芯片和感应器,所以相对于其他APP在架构的选择上会更加保守一些。为了照顾与手机硬件的绑定,咕咚几乎没有用到React Native等动态化的技术,为了保证系统的稳定性,咕咚更偏向于选择原生实现。架构上偏保守的实现会相对比较复杂,而咕咚就面临着这样的难题。
咕咚最开始选择的是MVC的框架。经典的MVC与苹果的MVC不太一样,苹果的MVC里的Model(数据管理者)、View(数据展示者)、Controller(数据加工者)是互相联系的,导致所有对Model的操作必须经过Controller,如此一来, Controller会越来越大。在经典的MVC里面,View跟Controller是可以同性的,而苹果的则不可以,Cocoa MVC = MVC + Data Service缺少了View跟Model之间的联系,这就是为什么苹果的架构里面Controller会越来越大,最后会导致非常大的问题。
胖Model包含了部分弱业务逻辑。胖Model要达到的目的是,Controller从胖Model这里拿到数据之后,不用额外做操作或者只要做非常少的操作,就能够将数据直接应用在View上。瘦Model只负责业务数据的表达,所有业务无论强弱一律到Controller上。瘦Model要达到的目的是,尽一切可能去编写细粒度Model,配套各种helper类或方法来对弱业务做抽象,强业务依旧交给Controller。一旦选择了胖Model,Controller拿到数据之后,不用做太多的选择,就可以把数据显示在Controller里面。有时候为了选择,咕咚也会使用瘦Model,但是不敢将任何业务逻辑都不写到Model里面,只是把Model当做一个存储数据的目的。这时候业务的处理还是需要Controller,这两种设置其实本身没有什么高低之分,但是对于咕咚来说还是胖Model更适合一些。
不论是服务端、前端还是客户端,搜集模式是开发者们都最常用的,资料也相对完全。可是MVC的架构导致了高耦合和复杂的代码,为了解决这个问题再引入下一个架构。在MVC里边,怎么去划分这个代码才更加地清晰、更加地合理,唐平麟老师认为 “要严格让Model变成一个胖Model”,这样便于View Controller不用做复杂的程序就能获得数据。
但是有些时候在设计框架的时候,并没有严格的去设计,这时就需要引入另外一种模式, MVVM。它仅仅做了一件事情,就是把View Controller拆开了,把View Controller拆成了View Model,把之前Controller对于Model的控制代码全部放到了View Model里去。如此一来,业务逻辑就会非常地清晰、框架也会更加地明显。View Controller仅仅是做显示性的东西,View Model是做业务上的处理, Model可以设计成胖Model,也可以设计成瘦Model,如果设计成胖Model的话,可以把最简单的逻辑放在Model里面去处理,如果设计成瘦Model的话,可以把全部数据都放到View Model去处理。
MVVM的View Controller不像在MVC里的View Controller,MVVM的是View Controller + View,皆统成一层,而这一层都是做显示的逻辑。值得注意的是,在做视图层和View Model层的话,这两个之间要用一个Data绑定的技术,为了实现这个Data绑定,不能用第三方的库补充。View Model的角色是处理业务逻辑,除了被View层持有,也会持有Model。简而言之,View Model是一个从上到下互相持久的关系,在MVC架构里面经常会造成三者之间的相互持有,为了开发过程,可能让Model、Controller与View之间会产生相互持有的关系。
从MVC一直到MVVM,当程序越来越复杂的时候,开发者们必须严格地去定义每一个工作模块应该干什么,只有这个时候代码才能更加地清晰可靠。
唐平麟老师在此建议大家,“我希望大家在以后的工作里面,在项目组里面还是倾向于用比较简单的MVC的架构,但是在项目启动的时候一定要严格区分好这三者之间的关系,这三者之间什么代码能写、什么代码不能写,什么代码应该放在什么里面,比如说我Model里面一定要用胖Model,我在Controller里面一定不能够操作View层的动画,我在View里面一定不能去写用户跟业务代码相关的逻辑,如果说我们做好这三点的话,我们在MVC里面依然是可以去做架构的。”
【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】