第十年的選擇,咕咚到底選擇了什么?
原創(chuàng)【51CTO.com原創(chuàng)稿件】2007年第一代iPhone的發(fā)布開啟了智能手機的新時代,至今移動開發(fā)已跨越了十年的路程,十年中有著太多的改變。隨著移動互聯網的突飛猛進,人們的生活方式也在日益變化著,身處在單調生活中的人們也開始注重健康的生活方式,咕咚(Codoon)則是看中了這一市場,致力于通過游戲化、社交化和碎片化的方式,來鼓勵人們形成良好的運動習慣和生活方式,從而獲得身體的健康。
此次由51CTO主辦的2017WOTA全球架構與運維技術峰會上,咕咚技術總監(jiān)唐平麟老師分享了主題為《第十年的選擇》的演講。
咕咚作為中國最大的運動社交服務平臺,其APP需要與手機硬件綁定的非常多,基本使用到手機里所有芯片和感應器,所以相對于其他APP在架構的選擇上會更加保守一些。為了照顧與手機硬件的綁定,咕咚幾乎沒有用到React Native等動態(tài)化的技術,為了保證系統的穩(wěn)定性,咕咚更偏向于選擇原生實現。架構上偏保守的實現會相對比較復雜,而咕咚就面臨著這樣的難題。
咕咚最開始選擇的是MVC的框架。經典的MVC與蘋果的MVC不太一樣,蘋果的MVC里的Model(數據管理者)、View(數據展示者)、Controller(數據加工者)是互相聯系的,導致所有對Model的操作必須經過Controller,如此一來, Controller會越來越大。在經典的MVC里面,View跟Controller是可以同性的,而蘋果的則不可以,Cocoa MVC = MVC + Data Service缺少了View跟Model之間的聯系,這就是為什么蘋果的架構里面Controller會越來越大,最后會導致非常大的問題。
胖Model包含了部分弱業(yè)務邏輯。胖Model要達到的目的是,Controller從胖Model這里拿到數據之后,不用額外做操作或者只要做非常少的操作,就能夠將數據直接應用在View上。瘦Model只負責業(yè)務數據的表達,所有業(yè)務無論強弱一律到Controller上。瘦Model要達到的目的是,盡一切可能去編寫細粒度Model,配套各種helper類或方法來對弱業(yè)務做抽象,強業(yè)務依舊交給Controller。一旦選擇了胖Model,Controller拿到數據之后,不用做太多的選擇,就可以把數據顯示在Controller里面。有時候為了選擇,咕咚也會使用瘦Model,但是不敢將任何業(yè)務邏輯都不寫到Model里面,只是把Model當做一個存儲數據的目的。這時候業(yè)務的處理還是需要Controller,這兩種設置其實本身沒有什么高低之分,但是對于咕咚來說還是胖Model更適合一些。
不論是服務端、前端還是客戶端,搜集模式是開發(fā)者們都最常用的,資料也相對完全??墒荕VC的架構導致了高耦合和復雜的代碼,為了解決這個問題再引入下一個架構。在MVC里邊,怎么去劃分這個代碼才更加地清晰、更加地合理,唐平麟老師認為 “要嚴格讓Model變成一個胖Model”,這樣便于View Controller不用做復雜的程序就能獲得數據。
但是有些時候在設計框架的時候,并沒有嚴格的去設計,這時就需要引入另外一種模式, MVVM。它僅僅做了一件事情,就是把View Controller拆開了,把View Controller拆成了View Model,把之前Controller對于Model的控制代碼全部放到了View Model里去。如此一來,業(yè)務邏輯就會非常地清晰、框架也會更加地明顯。View Controller僅僅是做顯示性的東西,View Model是做業(yè)務上的處理, Model可以設計成胖Model,也可以設計成瘦Model,如果設計成胖Model的話,可以把最簡單的邏輯放在Model里面去處理,如果設計成瘦Model的話,可以把全部數據都放到View Model去處理。
MVVM的View Controller不像在MVC里的View Controller,MVVM的是View Controller + View,皆統成一層,而這一層都是做顯示的邏輯。值得注意的是,在做視圖層和View Model層的話,這兩個之間要用一個Data綁定的技術,為了實現這個Data綁定,不能用第三方的庫補充。View Model的角色是處理業(yè)務邏輯,除了被View層持有,也會持有Model。簡而言之,View Model是一個從上到下互相持久的關系,在MVC架構里面經常會造成三者之間的相互持有,為了開發(fā)過程,可能讓Model、Controller與View之間會產生相互持有的關系。
從MVC一直到MVVM,當程序越來越復雜的時候,開發(fā)者們必須嚴格地去定義每一個工作模塊應該干什么,只有這個時候代碼才能更加地清晰可靠。
唐平麟老師在此建議大家,“我希望大家在以后的工作里面,在項目組里面還是傾向于用比較簡單的MVC的架構,但是在項目啟動的時候一定要嚴格區(qū)分好這三者之間的關系,這三者之間什么代碼能寫、什么代碼不能寫,什么代碼應該放在什么里面,比如說我Model里面一定要用胖Model,我在Controller里面一定不能夠操作View層的動畫,我在View里面一定不能去寫用戶跟業(yè)務代碼相關的邏輯,如果說我們做好這三點的話,我們在MVC里面依然是可以去做架構的。”
【51CTO原創(chuàng)稿件,合作站點轉載請注明原文作者和出處為51CTO.com】