將MVVM演化為MVVMM

我司產(chǎn)品屬于初創(chuàng)項目亿絮,早期業(yè)務(wù)相對簡單明吩,最初項目中采用了簡單的MVC設(shè)計模式践剂。然而隨著業(yè)務(wù)邏輯增多圾笨,某些Controller變得十分臃腫媳握。

眾所周知阵面,MVVM模式解決了Controller的臃腫并方便單元測試芋齿,為了方便后續(xù)代碼維護锥累,在上版本新功能開發(fā)中才沧,項目開始使用MVVM模式進行開發(fā)迈喉。

但從上圖可以看出,MVVM模式中温圆,Controller即便清爽了挨摸,但無疑是將臃腫的代碼移到了ViewModel中。

上述上個版本所開發(fā)的新功能為“愛瘋搶”岁歉,從業(yè)務(wù)交互及界面狀態(tài)展現(xiàn)來看得运,有多個界面存在相同的業(yè)務(wù)交互和元素展現(xiàn),比如正在瘋搶列表锅移、瘋搶商品詳情熔掺、我關(guān)注的瘋搶、我參與的瘋搶等等非剃,這些界面都存在搶拍置逻、提醒、取消提醒备绽、關(guān)注券坞、取消關(guān)注、購買肺素、支付已搶拍成功商品等業(yè)務(wù)交互恨锚,同時按鈕展現(xiàn)(搶拍、提醒等狀態(tài)切換)及時間展現(xiàn)(搶拍開始時間倍靡、搶拍中倒計時眠冈、下次搶拍時間)等展示邏輯也無差別。

因此,結(jié)合這些具體情形蜗顽,我在模塊類設(shè)計時布卡,決定將這些公有的業(yè)務(wù)交互及界面展現(xiàn)狀態(tài)轉(zhuǎn)換邏輯抽離出來。依照MVVM設(shè)計模式雇盖,這些邏輯代碼理應(yīng)放到ViewModel中忿等。

但從實際出發(fā),如果將所有的邏輯的都放進ViewModel崔挖,將導致ViewModel變得十分臃腫贸街,同時使得具體業(yè)務(wù)邏輯代碼不夠粒度化,這樣無疑在代碼上耦合嚴重狸相、不利于代碼擴展及重復利用薛匪。

舉個例子,假如某些界面出現(xiàn)不同的展現(xiàn)方式及邏輯脓鹃,但卻具有相同的業(yè)務(wù)交互邏輯(搶拍逸尖、提醒、關(guān)注等)瘸右,針對這種情況娇跟,就不能共用同一個ViewModel來滿足了,這時不得不新寫一個ViewModel來包含不同的展現(xiàn)邏輯和相同的業(yè)務(wù)交互邏輯太颤,這無疑導致編寫重復的業(yè)務(wù)交互代碼苞俘,增加代碼維護成本。

為了ViewModel最終不變得臃腫龄章,同時利于代碼擴展及重復利用吃谣,我想到將ViewModel的職責更進一步細化,ViewModel負責網(wǎng)絡(luò)請求及界面展示邏輯做裙,而將業(yè)務(wù)交互部分單獨再抽出來岗憋,將其封裝在獨立的業(yè)務(wù)交互處理類Manager(或許這里取名Manager不恰當,暫且先這樣)當中菇用。

這樣澜驮,不同展現(xiàn)邏輯但具有相同業(yè)務(wù)交互邏輯的界面即可使用不同的ViewModel而共用同一個Manager了陷揪,滿足了一份業(yè)務(wù)交互邏輯代碼可以多處使用惋鸥、多處組裝,在一定程度上不僅降低了開發(fā)工作量悍缠,同時增強了代碼的可維護性卦绣。

我將這種演化后的模式稱為MVVM+Manager模式,簡稱為MVVMM飞蚓。Manager既然負責業(yè)務(wù)交互邏輯滤港,這其中的業(yè)務(wù)就少不了和服務(wù)器交互、和本地數(shù)據(jù)交互等,因此溅漾,MVVMM模式的示意圖可以定義為如下所示:

為了更具體說明MVVMM模式各個部分職責山叮,我寫了一個簡明的邏輯描述Demo供參考。

對于復雜的功能模塊添履,ViewModel仍然顯得很臃腫的話屁倔,可繼續(xù)將其職責再細化,例如將網(wǎng)絡(luò)請求邏輯也從ViewModel中抽離出來單獨成為一個處理類暮胧,類似猿題庫中即使用單獨的DataController類來負責網(wǎng)絡(luò)數(shù)據(jù)請求锐借,詳情可以參考博文。

上述有不足或疑問之處請留言交流往衷。

MVVMM Demo

https://github.com/peterlogme/MVVMM.git

參考:

MVVM模式:

http://www.sprynthesis.com/2014/12/06/reactivecocoa-mvvm-introduction

http://yulingtianxia.com/blog/2015/05/21/ReactiveCocoa-and-MVVM-an-Introduction/

猿題庫MVVM設(shè)計博文:

http://gracelancy.com/blog/2016/01/06/ape-ios-arch-design/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钞翔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子席舍,更是在濱河造成了極大的恐慌布轿,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俺亮,死亡現(xiàn)場離奇詭異驮捍,居然都是意外死亡,警方通過查閱死者的電腦和手機脚曾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門东且,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人本讥,你說我怎么就攤上這事珊泳。” “怎么了拷沸?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵色查,是天一觀的道長。 經(jīng)常有香客問我撞芍,道長秧了,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任序无,我火速辦了婚禮验毡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘帝嗡。我一直安慰自己晶通,他們只是感情好,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布哟玷。 她就那樣靜靜地躺著狮辽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喉脖,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天椰苟,我揣著相機與錄音,去河邊找鬼树叽。 笑死尊剔,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的菱皆。 我是一名探鬼主播须误,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仇轻!你這毒婦竟也來了京痢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤篷店,失蹤者是張志新(化名)和其女友劉穎祭椰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疲陕,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡方淤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹄殃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片携茂。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖诅岩,靈堂內(nèi)的尸體忽然破棺而出讳苦,到底是詐尸還是另有隱情,我是刑警寧澤吩谦,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布鸳谜,位于F島的核電站,受9級特大地震影響式廷,放射性物質(zhì)發(fā)生泄漏咐扭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一滑废、第九天 我趴在偏房一處隱蔽的房頂上張望蝗肪。 院中可真熱鬧,春花似錦策严、人聲如沸穗慕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春倔韭,著一層夾襖步出監(jiān)牢的瞬間术浪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工寿酌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胰苏,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓醇疼,卻偏偏與公主長得像硕并,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秧荆,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

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