泛內(nèi)容詳情頁重構(gòu)之路

背景

隨著業(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)

  1. 單控制器模式痛點(diǎn)
  • 控制器ViewController趟章,數(shù)據(jù)源ViewModel無比臃腫

  • 將不同形態(tài)下的功能,強(qiáng)行堆在一個(gè)控制器或者一個(gè)ViewModel中,代碼邏輯顯得異常凌亂

  • 代碼的可讀性尤揣,可維護(hù)性很弱

  1. 評論模塊痛點(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)

    1. 控制器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ù)用性與靈活性讲岁。

    2. 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)鞭铆,讓代碼越寫越精或衡,越寫越壯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衔彻,一起剝皮案震驚了整個(gè)濱河市薇宠,隨后出現(xiàn)的幾起案子偷办,更是在濱河造成了極大的恐慌艰额,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椒涯,死亡現(xiàn)場離奇詭異柄沮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)废岂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門祖搓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人湖苞,你說我怎么就攤上這事拯欧。” “怎么了财骨?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵镐作,是天一觀的道長。 經(jīng)常有香客問我隆箩,道長该贾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任捌臊,我火速辦了婚禮杨蛋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘理澎。我一直安慰自己逞力,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布糠爬。 她就那樣靜靜地躺著寇荧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秩铆。 梳的紋絲不亂的頭發(fā)上砚亭,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天灯变,我揣著相機(jī)與錄音,去河邊找鬼捅膘。 笑死添祸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寻仗。 我是一名探鬼主播刃泌,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼署尤!你這毒婦竟也來了耙替?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤曹体,失蹤者是張志新(化名)和其女友劉穎俗扇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箕别,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铜幽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了串稀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片除抛。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖母截,靈堂內(nèi)的尸體忽然破棺而出到忽,到底是詐尸還是另有隱情,我是刑警寧澤清寇,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布喘漏,位于F島的核電站,受9級特大地震影響颗管,放射性物質(zhì)發(fā)生泄漏陷遮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一垦江、第九天 我趴在偏房一處隱蔽的房頂上張望帽馋。 院中可真熱鬧,春花似錦比吭、人聲如沸绽族。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吧慢。三九已至,卻和暖如春赏表,著一層夾襖步出監(jiān)牢的瞬間检诗,已是汗流浹背匈仗。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逢慌,地道東北人悠轩。 一個(gè)月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像攻泼,于是被迫代替她去往敵國和親火架。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容