背景
隨著業(yè)務(wù)不斷的迭代發(fā)展竹祷,內(nèi)容詳情頁的業(yè)務(wù)模式正變得越來越復(fù)雜谈跛。諸如九空格式短圖文、頂部翻頁橫劃式短圖文塑陵、視頻感憾、Stroy播放及長圖文等各種玩法層出不窮,內(nèi)容詳情頁也經(jīng)歷了純Native開發(fā)令花、純Hybrid開發(fā)及目前的長圖文Hybrid開發(fā)阻桅、短圖文及視頻采用Native開發(fā)的模式。為了應(yīng)對靈活多變的產(chǎn)品形態(tài)兼都,原來單控制器嫂沉、單ViewModel管理所有頁面功能的架構(gòu)模式顯然是不合適的,因此我們對原有的架構(gòu)模式進(jìn)行了大尺度的重構(gòu)扮碧。
痛點(diǎn)
- 單控制器模式痛點(diǎn)
控制器ViewController趟章,數(shù)據(jù)源ViewModel無比臃腫
將不同形態(tài)下的功能,強(qiáng)行堆在一個(gè)控制器或者一個(gè)ViewModel中,代碼邏輯顯得異常凌亂
代碼的可讀性尤揣,可維護(hù)性很弱
- 評論模塊痛點(diǎn)
嚴(yán)重耦合業(yè)務(wù)搔啊,強(qiáng)依賴ClientItem
評論Cell沒有高度緩存機(jī)制
多個(gè)評論接口柬祠,沒有做合并處理
先介紹下重構(gòu)后的收益北戏,再分析重構(gòu)中的指導(dǎo)思想及設(shè)計(jì)方案。
收益
不同形態(tài)基于一個(gè)Base 控制器漫蛔,高效地收斂了共同屬性嗜愈,處理了共同的業(yè)務(wù)邏輯
不同形態(tài)內(nèi)容采用獨(dú)立的子控制器承載,有效地隔離了差異性莽龟,每個(gè)控制器可以更專注于自身獨(dú)有的邏輯功能
評論模塊下沉蠕嫁,獨(dú)立于業(yè)務(wù),復(fù)用性很強(qiáng)毯盈,一行代碼即可實(shí)現(xiàn)在feed中發(fā)表評論剃毒,充分地解放了生產(chǎn)力
評論Cell高度緩存,讓頁面滑動(dòng)如絲般順滑
代碼可讀性搂赋、可維護(hù)性更強(qiáng)赘阀,分析問題,解決問題的效率得到了極大地提升
原則
對外接口不變
由于項(xiàng)目中已經(jīng)有大量的入口可以直達(dá)詳情頁脑奠,同時(shí)基公,還有部分入口是通過Schema跳轉(zhuǎn),從穩(wěn)定性和拓展性的角度考慮宋欺,我們在重構(gòu)時(shí)必須保證對外接口的不變轰豆。單一職責(zé)
大到一個(gè)類,小到一個(gè)方法齿诞,我們都要保證職責(zé)的單一酸休,絕不能因?yàn)橐粫r(shí)的不冷靜,將所有的邏輯堆在一起祷杈,這樣的代碼后續(xù)是無法維護(hù)的雨席。
方案
內(nèi)容詳情頁一般都由內(nèi)容和評論兩大部分組成,下文將從內(nèi)容和評論兩個(gè)業(yè)務(wù)類型角度出發(fā)吠式,分別闡述設(shè)計(jì)思想及部分實(shí)現(xiàn)細(xì)節(jié)陡厘。
內(nèi)容
-
工廠模式
通過一個(gè)工廠來動(dòng)態(tài)生成控制器,根據(jù)不同的itemType 生成不同的控制器特占。控制器生成 -
MVVM + 繼承 + 組合模式
通過繼承加組合的模式糙置,細(xì)粒度地分拆了模塊功能,同時(shí)也高效地實(shí)現(xiàn)了代碼復(fù)用是目。
采用MVVM模式谤饭,每個(gè)ViewController綁定一個(gè)ViewModel,ViewModel控制視圖的展示,達(dá)到數(shù)據(jù)驅(qū)動(dòng)視圖的目的揉抵。
業(yè)務(wù)整體架構(gòu)-
控制器viewController
如上圖亡容,控制器采用了繼承的模式,不同的業(yè)務(wù)分別由不同的子控制器承載
@dynamic
為了實(shí)現(xiàn)各個(gè)Child ViewController持有一個(gè)與之對應(yīng)的Child ViewModel, 在Base ViewController中持有Base ViewModel, 同時(shí)冤今,利用@dynamic特性闺兢,控制在各個(gè)Child ViewController中不生成viewModel成員變量,直接復(fù)用Base ViewController中生成的View Model戏罢。視圖結(jié)構(gòu)
Base ViewController只提供基礎(chǔ)組件屋谭,比如tableview、emptyview龟糕,將組件的組裝桐磁、布局留給Child ViewController,這很大程度上兼顧了復(fù)用性與靈活性讲岁。
ViewModel
ViewModel部分采用了繼承加組合的模式我擂,有一個(gè)Base ViewModel,然后根據(jù)不同的業(yè)務(wù)分別創(chuàng)建Child ViewModel缓艳。ViewModel提供了數(shù)據(jù)源校摩、評論及操作(點(diǎn)贊、關(guān)注等)等功能郎任,將評論秧耗、操作等功能分拆出去,采用單獨(dú)的ViewModel管理舶治,然后通過組合的方式分井,將評論和操作的功能裝載到Base ViewModel中。
-
評論
- 高度緩存
每一行評論作為UITableView的一個(gè)Cell霉猛,UITableView在布局的時(shí)候尺锚,會多次詢問每一行Cell的高度,而且動(dòng)態(tài)計(jì)算Cell的高度是較為耗時(shí)的操作惜浅,因此將高度緩存可以有效提升頁面的性能瘫辩。 - 評論組件化
我們認(rèn)為評論應(yīng)該是比較基礎(chǔ)的功能,不應(yīng)該耦合業(yè)務(wù)代碼坛悉,因此將評論下沉伐厌,與業(yè)務(wù)解耦,可以方便地將評論應(yīng)用到更多的業(yè)務(wù)場景中裸影。
展望
一個(gè)好的架構(gòu)挣轨,能很大程度上提升開發(fā)生產(chǎn)力,有助于后續(xù)的擴(kuò)展轩猩,維護(hù)卷扮。但是隨著業(yè)務(wù)的蓬勃發(fā)展荡澎,原有架構(gòu)也一定會受到挑戰(zhàn),因此晤锹,要有一顆擁抱變化的心摩幔,不停地學(xué)習(xí),不停地重構(gòu)鞭铆,讓代碼越寫越精或衡,越寫越壯。