MVVM 用了都說好

純屬娛樂,就是看著怪好玩


這篇文章主要是對工作兩年來用過的架構(gòu)發(fā)表一下自己感觸,如果說的不對請輕噴.

關(guān)于架構(gòu)

??????根據(jù)百科中的軟件架構(gòu),架構(gòu)描述的對象是直接構(gòu)成系統(tǒng)的抽象組件,各個組件之間的連接則明確和相對細致地描述組件之間的通訊口四。在實現(xiàn)階段酒甸,這些抽象組件被細化為實際的組件,比如具體某個類或者對象....Android架構(gòu)目前有許多不同的模式脯燃,如MVP, FLUX, MVI, MVVM等.我們當然知道,還用在這bb!!!
????挖干的說,決定和實現(xiàn)一個特定的代碼體系結(jié)構(gòu)或設(shè)計模式都是為了解決我們開發(fā)人員時常面對的問題挨稿。

一些問題

??????說到問題我可能有很多要吐槽的了,剛爬進Android這個坑,因為Android本身被寫為MVC,所以用的就是MVC模式,那時候只是簡單的寫一些簡單的功能,一個activity處理所有工作,顯示View,網(wǎng)絡(luò)請求,但是畢竟功能簡單,一個activity也不會超過百行,所以不會考慮什么耦合,性能問題.對于簡單的應(yīng)用來說,這可能是足夠的严拒,但是隨著復(fù)雜性的增加,問題的數(shù)量和水平也會上升竖独。
??????正式投入Android開發(fā)崗位,因為項目前期由一個人完成,所以寫的很隨意(你懂得),一些業(yè)務(wù)邏輯稍微復(fù)雜的activity或者Fragment超過3000行代碼是很正常的,看的時候都不知道從哪開始,每次想要修改點功能都要耗費大量時間看代碼邏輯...如果繼續(xù)這樣代碼堆砌最后肯定得崩,所以決定采用大家都在口口相傳的MVP模式來進行解耦合.當時對于MVP不是很熟,然后一開始的寫法是把回調(diào)接口寫到一個單獨的接口中,一個activity對應(yīng)一個iview,像這種

但是后來業(yè)務(wù)邏輯增加處理的功能也變多,iview中的接口增加,每改動一次就需要把實現(xiàn)了這個iview的activity全部都改一遍,可謂是牽一發(fā)而動全身,說好的開閉原則呢?說好的單一職責呢?后來痛定思痛,覺得肯定是自己的姿勢有問題,參考GitHub上的幾個項目,改成用contract契約類來作為盛放IView和Presenter的容器,
這樣一個activity或者Fragment就對應(yīng)一個contract,然后xxPresenter實現(xiàn)contract中presenter方法,

public class xxPresenter implements xxContract.Presenter {

activity或者Fragment實現(xiàn)contract中的view的方法,

public class xxFragment implements xxContract.View {

這樣確實做到了view和邏輯的解耦.
??????愉快的開發(fā)了一段時間后,發(fā)現(xiàn)每當我有兩個功能相近的頁面,而且還要同樣的一個請求方法,于是想復(fù)用一個contract中的presenter中方法,然后就會造成在某個頁面的中會有多余的空方法,而且還不能刪除,

真是感覺芒刺在背,簡直看著難受.
??????這就是使用的mvp的歷程,代碼的緊密耦合裤唠,即使是代碼中的一小部分的更改,也會導(dǎo)致代碼的其他部分的更改或者引起錯誤莹痢。減少了可重用性种蘸,最終導(dǎo)致代碼復(fù)制粘貼,冗余嚴重,就不要再說什么單元測試之類的.

為什么MVVM…?竞膳?

??????我們最終的目標是以這樣一種分布式的方式構(gòu)建項目航瞭,將Android相關(guān)的東西放在一個地方,并分離出不需要Android運行的所有其他實體坦辟,然后進一步分割非Android相關(guān)的片段刊侯,從而實現(xiàn)代碼模塊化、可擴展性长窄、易維護性滔吠、測試友好性等。
??????我們會在公眾號博客和技術(shù)網(wǎng)站上看到無數(shù)關(guān)于架構(gòu)模式的文章和架構(gòu)設(shè)計教程的文章,毫無疑問現(xiàn)在最流行和廣泛采用的是MVP~Model—View—Presenter.說明MVP是一個成熟的模式挠日,在一定程度上解決了很多方面的問題疮绷,但是也會有上面我提出的問題。當然了沒有什么是完美的嚣潜,總有一個改進的余地冬骚。但與此同時谷歌引入了Android架構(gòu)組件,其中包括ViewModel而不是Presenter懂算,因此證明了谷歌支持MVVM只冻。
??????可能這些并不能說明MVVM比MVP好,那就讓我們看看上述MVP中所面臨的幾個問題,MVVM是如何來克服的计技。

1.代碼耦合

??????對于每個Activity/Fragment喜德,我們需要一個Presenter,這是一個硬束縛的規(guī)則。Presenter持有對Activity的引用和Activity持有Presenter的參考,兩者1:1的關(guān)系垮媒,就是最大的問題所在舍悯。隨著視圖的復(fù)雜性的增加,對這種關(guān)系的維護和處理也隨之增加睡雇。而我們的最終目標以分布式的方式構(gòu)建項目萌衬,對項目做分割,為了實現(xiàn)這個目標并避免這種緊密關(guān)系的ViewModel被引入。
??????ViewModel是負責為activity或Fragment準備和管理數(shù)據(jù)的類,它還處理activity或Fragment與應(yīng)用程序的其余部分的通信(例如調(diào)用業(yè)務(wù)邏輯類)它抱。只有View(比如activity)持有對ViewModel的引用秕豫,而ViewModel卻不持有任何View,這就解決了我們的緊密耦合問題观蓄。同時一個View可以引用多個ViewModel混移。即使對于復(fù)雜的視圖祠墅,我們實際上可以在相同的層次結(jié)構(gòu)中擁有不同的ViewModel。

2.接口冗余

??????使用這種方式不用寫很多的接口,因為ViewModel中會提供數(shù)據(jù),如果需要使用數(shù)據(jù)時可以直接從viewmodel中獲取到,不像MVP那樣通過接口來回調(diào)數(shù)據(jù),這樣就不會寫很多的接口,也不會又接口聲明沒有使用的情況.

3.可測試性

??????由于Presenter很難綁定到View沫屡,所以編寫單元測試變得有點困難饵隙,因為View有很多的依賴關(guān)系撮珠。
??????ViewModel在單元測試會容易一些沮脖,因為它們只是暴露狀態(tài),因此可以獨立測試芯急,而不需要測試數(shù)據(jù)將如何被消耗勺届,總之,是不依賴于View的娶耍。

??????這是幾個選擇MVVM的原因,可能你也有更多原因免姿,期待你的分享!榕酒!

一點感想

??????架構(gòu)模式是不斷發(fā)展的胚膊,MVVM有能力或者說有潛力變成更加強大,有用想鹰,令人驚訝的模式紊婉。而MVP已經(jīng)發(fā)展到一個相當高的水平,但金無足赤,沒有任何東西是完美的辑舷。當然學習MVVM有一點輕微的學習曲線喻犁,當時也是試驗了好久,但最終它幫助我們克服了一些缺點。有人可能喜歡MVVM何缓,也可能不喜歡MVVM肢础,這完全取決于他們的判斷。但我是喜歡的那個,同事也是用了都說好的那種,哈哈,只要我們能達成最終目標碌廓,其他事情都無關(guān)緊要传轰。

PS:再次重申,這是我個人的一點經(jīng)驗、想法以及我們?yōu)槭裁从肕VVM重構(gòu)項目谷婆。請不要懷疑我的意圖,我并不是想比較和找出差異慨蛙。我所想的是分享我的經(jīng)驗和MVP的一些缺點,以及如何用MVVM克服波材。如果惹鬧了您,請輕噴,謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末股淡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子廷区,更是在濱河造成了極大的恐慌唯灵,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隙轻,死亡現(xiàn)場離奇詭異埠帕,居然都是意外死亡垢揩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門敛瓷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叁巨,“玉大人,你說我怎么就攤上這事呐籽》嫔祝” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵狡蝶,是天一觀的道長庶橱。 經(jīng)常有香客問我,道長贪惹,這世上最難降的妖魔是什么苏章? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮奏瞬,結(jié)果婚禮上枫绅,老公的妹妹穿的比我還像新娘。我一直安慰自己硼端,他們只是感情好并淋,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著显蝌,像睡著了一般预伺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曼尊,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天酬诀,我揣著相機與錄音,去河邊找鬼骆撇。 笑死瞒御,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的神郊。 我是一名探鬼主播肴裙,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涌乳!你這毒婦竟也來了蜻懦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤夕晓,失蹤者是張志新(化名)和其女友劉穎宛乃,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡征炼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年析既,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谆奥。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡眼坏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酸些,到底是詐尸還是另有隱情宰译,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布擂仍,位于F島的核電站囤屹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逢渔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一乡括、第九天 我趴在偏房一處隱蔽的房頂上張望肃廓。 院中可真熱鬧,春花似錦诲泌、人聲如沸盲赊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哀蘑。三九已至,卻和暖如春葵第,著一層夾襖步出監(jiān)牢的瞬間绘迁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工卒密, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缀台,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓哮奇,卻偏偏與公主長得像膛腐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鼎俘,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

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