這些年經(jīng)歷的項目架構(gòu)

?這些年又官,參與的項目大大小小應(yīng)該有六七個。所采用的項目架構(gòu)镣隶,也是從 MVC 到 MVP 极谊,后來使用 ReactNative 進(jìn)行跨平臺開發(fā),再到后來回到原生安岂,使用 MVVM轻猖。本節(jié),打算聊一聊我的項目架構(gòu)的演變之路域那。

MVC

?M, Model咙边,主要負(fù)責(zé)進(jìn)行數(shù)據(jù)訪問猜煮,產(chǎn)生數(shù)據(jù);C败许,Controller王带,主要負(fù)責(zé)對接 View 和 Model,將 Model 反映到 View 上市殷,或者響應(yīng) View 上的動作愕撰,修改 Model,處理業(yè)務(wù)醋寝;V搞挣,即 View,主要負(fù)責(zé) UI 渲染音羞。

MVC組件之間的典型合作

?上圖來自維基百科囱桨。我們可以看到一個典型的 MVC 模式下的數(shù)據(jù)流向。上圖中黄选,View 監(jiān)聽 Model 的數(shù)據(jù)變化蝇摸,然后進(jìn)行 UPDATES 工作,這其中也會有業(yè)務(wù)邏輯處理办陷。事實上貌夕,有些時候我們還需要對 Model 層的數(shù)據(jù)做進(jìn)一步處理然后再做前端展示,這也是部分業(yè)務(wù)邏輯民镜。
?所謂架構(gòu)只是一種設(shè)計理念啡专,目的就是在于保持邏輯的清晰,面向改變易擴(kuò)展制圈,功能易復(fù)用们童。對于 MVC 模式而言,看上去各司其職鲸鹦,請求數(shù)據(jù)的產(chǎn)生數(shù)據(jù)慧库;負(fù)責(zé)邏輯的處理邏輯,負(fù)責(zé)渲染的進(jìn)行渲染馋嗜,清晰明了齐板。
?然而,View 層對 Model 有著很強的依賴葛菇。為了能夠使得 Model 發(fā)生的變化及時反映到到 View 上甘磨,View 需要注冊成為觀察者到 Model 上。鑒于這種關(guān)系眯停,View 济舆、 Model 需要互相持有對方的引用。
image

?首先莺债,這種相互持有引用會導(dǎo)致層次的獨立性滋觉、可重用性要降低一些签夭,而且這種行為也是危險的,暴露更多的能力給 View椎瘟,可能使得部分本應(yīng)在 Controller 處理的邏輯放在 View覆致,因為這樣做確實更加快捷方便。這樣做也會帶來一個很嚴(yán)重的問題:View 會客串 Controller 的角色肺蔚,從而越來越臃腫煌妈,解耦能力越來越弱。

MVP

?使用 MVC 沒多久宣羊,同事建議組長采用 MVP 開發(fā)模式璧诵,于是,就是這么快的就跳轉(zhuǎn)到了 MVP 的陣營仇冯。當(dāng)時最感興趣的還是這種架構(gòu)中突出的對接口的應(yīng)用之宿,面向接口的編程思想
?面向接口的編程苛坚,實際上是 Java 開發(fā)一直所倡導(dǎo)的比被。優(yōu)勢在于解耦,降低依賴關(guān)系泼舱。但是也會讓開發(fā)工作更加復(fù)雜等缀。

MVP模式

?上圖同樣來自維基百科。相較于 MVC 模式娇昙,它切斷了 View 層和 Model 層的直連尺迂。Model 和 Presenter 之間, Presenter 和 View 之間相互暴露接口冒掌,并通過接口相互訪問噪裕,接口構(gòu)成了它們通信的通道。與 MVC 類似股毫, Modle 負(fù)責(zé)數(shù)據(jù)訪問和處理膳音;Presenter 像膠水一樣,把 Model 和 View 綁在一起铃诬,它主要處理業(yè)務(wù)邏輯祭陷,對 View 提供處理好的數(shù)據(jù),對 Model 請求數(shù)據(jù)氧急;View 處理 UI 渲染。
?后來的開發(fā)過程中毫深,很少使用 MVC吩坝,當(dāng)然并不是因為覺得它比 MVP 差。更多的哑蔫,自己是想增強接口使用的意識钉寝,以及對新事物的一種探索欲』∧牛現(xiàn)在想想,其實它們更多的是理念上的不同嵌纲,如果控制的足夠好俘枫,各有千秋吧。下面我們就來比較一下逮走。

MVC vs MVP

?這兩種結(jié)構(gòu)鸠蚪,都體現(xiàn)了良好的解耦理念。將一個需求拆分成數(shù)據(jù)訪問模塊师溅、UI渲染模塊茅信、業(yè)務(wù)處理模塊,相對獨立墓臭,分工明確蘸鲸,各謀其政。同時窿锉,各個模塊之間又可以在一定程度上相互組合酌摇,盡可能地進(jìn)行功能復(fù)用。但是嗡载,在具體使用上窑多,我覺得還是有一些偏好。
?保證結(jié)構(gòu)的清晰是一件非常重要的事鼻疮,對此怯伊,大多數(shù)情況下寧愿犧牲性能。這一點上我認(rèn)為 MVP 要比 MVC 做的好判沟,職責(zé)劃分的更加清晰耿芹。Activity 只負(fù)責(zé)渲染,很清爽挪哄;當(dāng)然吧秕,這就意味著更多的處理邏輯需要搬到 Presenter 中去;Model 只負(fù)責(zé)向 Presenter 提供數(shù)據(jù)支持迹炼。為了保證邏輯的清晰砸彬,整個過程卻會顯得復(fù)雜,有些地方甚至沒必要斯入。View 層明明只是需要改一下 Model 的數(shù)據(jù)砂碉,都需要 Presenter 代勞。顯然刻两,這種清晰性犧牲了高效增蹭。
?結(jié)構(gòu)上的清晰,職責(zé)上分工更加明確磅摹,更細(xì)滋迈,也應(yīng)該就意味著更好的復(fù)用性霎奢,更加靈活。但是饼灿,同樣這也未必總是需要的幕侠。如果一個需求交互不多,Presenter 可能就會非常小碍彭,又何必將一個文件能夠搞定的事一定要分成三個文件去完成晤硕?

MVVM

?MVVM 是由 MVP 演化而來的。我覺得它主要解決了 MVP 沒有很好解決的兩個問題:

  • 對于 MVP 的 Presenter 層硕旗,由于要處理所有業(yè)務(wù)邏輯窗骑,又要完成 Model 和 View 的溝通,最終可能也會非常臃腫漆枚。
  • 通常情況下创译,我們總是要通過 findViewById 找到控件,然后進(jìn)行數(shù)據(jù)填充墙基,如果一個頁面很復(fù)雜软族,需要填充的數(shù)據(jù)很多,這樣在 View 層會顯得很不優(yōu)雅残制。
    ?這樣立砸,就交給 MVVM 來解決吧。


    MVVMPattern

?上圖(來自維基百科)中很好的解決了這兩個問題初茶。ViewModel 集合了 Presenter 的能力颗祝,同時兼顧了 View 需的數(shù)據(jù)基礎(chǔ)。它將數(shù)據(jù)直接綁定到 View上恼布,這種綁定是一種雙向綁定螺戳,即數(shù)據(jù)的變化會自動導(dǎo)致 UI 的刷新,而 UI 上的動作折汞,同樣會自動調(diào)用響應(yīng)的綁定的函數(shù)修改數(shù)據(jù)倔幼。
?Android 所提供的 DataBinding 技術(shù)很好的體現(xiàn)了這一點。之前翻譯過一篇官網(wǎng)上關(guān)于 DataBinding 的介紹爽待,感興趣的可以看一下∷鹜現(xiàn)在 View 層可以更加清爽,不用再為了填充數(shù)據(jù)而找出所有的 View鸟款,一個一個填充膏燃,而 View 也會由于某個用戶動作而自動回調(diào)修改數(shù)據(jù),這一切都是自動完成的何什。當(dāng)然组哩,有利必有弊,這種框架的使用,首先需要我們?nèi)チ私馑奶匦越矗欢易詣油瓿桑幢貢形覀兪謩油瓿尚矢呋舯龋喟霑奚糠中阅堋?/p>

小結(jié)

?架構(gòu)幕袱, 一種理念,一種思想悠瞬,一個工具们豌。它的目的,旨在幫助我們更好地面對浅妆、處理變化望迎;更加清晰地認(rèn)知我們正在做什么。
?工具是有了凌外,這只是一個基礎(chǔ)辩尊。更為關(guān)鍵的我覺得還是對這種工具的把控能力。因此康辑,也并非是說你使用了 MVVM 摄欲, 你的項目應(yīng)對變化的能力就一定會比 MVC 好。對于需求的理解疮薇,將需求進(jìn)行抽象的能力胸墙,以及對于技術(shù)扎實的能力,這些都將會對架構(gòu)的把控提出挑戰(zhàn)按咒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迟隅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子励七,更是在濱河造成了極大的恐慌智袭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呀伙,死亡現(xiàn)場離奇詭異补履,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)剿另,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門箫锤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雨女,你說我怎么就攤上這事谚攒。” “怎么了氛堕?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵馏臭,是天一觀的道長。 經(jīng)常有香客問我,道長括儒,這世上最難降的妖魔是什么绕沈? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮帮寻,結(jié)果婚禮上乍狐,老公的妹妹穿的比我還像新娘。我一直安慰自己固逗,他們只是感情好浅蚪,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著烫罩,像睡著了一般惜傲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贝攒,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天盗誊,我揣著相機(jī)與錄音,去河邊找鬼隘弊。 笑死浊伙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的长捧。 我是一名探鬼主播嚣鄙,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼串结!你這毒婦竟也來了哑子?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肌割,失蹤者是張志新(化名)和其女友劉穎卧蜓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體把敞,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡弥奸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奋早。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盛霎。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耽装,靈堂內(nèi)的尸體忽然破棺而出愤炸,到底是詐尸還是另有隱情,我是刑警寧澤掉奄,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布规个,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏诞仓。R本人自食惡果不足惜缤苫,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望墅拭。 院中可真熱鬧榨馁,春花似錦、人聲如沸帜矾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屡萤。三九已至,卻和暖如春掸宛,著一層夾襖步出監(jiān)牢的瞬間死陆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工唧瘾, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留措译,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓饰序,卻偏偏與公主長得像领虹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子求豫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355

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