iOS 架構(gòu)來(lái)自 Google I/O的啟發(fā)

架構(gòu)原則:
關(guān)注分離
模型驅(qū)動(dòng)UI,優(yōu)先持久化模型

Android O以及Kotlin被官方認(rèn)可。我發(fā)現(xiàn)了原來(lái)還有發(fā)布官方的架構(gòu)庫(kù),以及推薦使用指南

  • 如上圖所示,為新的架構(gòu)模式:

監(jiān)聽(tīng)ViewModel,當(dāng)VIewModel數(shù)據(jù)更新時(shí)刷新UI

監(jiān)聽(tīng)用戶(hù)事件反饋到ViewModel。ViewModel

持有保存,或者想Repository來(lái)獲取UI層需要的數(shù)據(jù)

響應(yīng)UI層的事件,執(zhí)行響應(yīng)的操作

響應(yīng)變化,并且通知到UI層

■ Repository

App的完全的數(shù)據(jù)模型,ViewModel交互的對(duì)象

提供簡(jiǎn)單的數(shù)據(jù)修改和獲取的接口

配合好網(wǎng)絡(luò)層數(shù)據(jù)的更新與本地持久化數(shù)據(jù)的更新,同步等

■ Data Source

包含本地的數(shù)據(jù)庫(kù)等,網(wǎng)絡(luò)api等

這些基本上和現(xiàn)有的一些MVVM,以及Clean架構(gòu)的組合比較相似,不過(guò)谷歌提供了一些新的類(lèi)庫(kù)來(lái)幫助我們實(shí)現(xiàn)這個(gè)架構(gòu)。

■谷歌的新玩具

本地IO大會(huì)谷歌提供了新的類(lèi)庫(kù)來(lái)實(shí)現(xiàn)這個(gè)功能,小標(biāo)題我寫(xiě)新玩具是因?yàn)檫@個(gè)庫(kù)目前還在alpha1版本,官方只建議在個(gè)人小項(xiàng)目中使用。

這個(gè)類(lèi)庫(kù)包含如下一些東西:

■ Lifecycle

Android聲明周期的回調(diào),幫助我們將原先需要在onStart()等生命周期回調(diào)的代碼可以分離到Activity或者Fragment之外。

■ LiveData

一個(gè)數(shù)據(jù)持有類(lèi),持有數(shù)據(jù)并且這個(gè)數(shù)據(jù)可以被觀察被監(jiān)聽(tīng),和其他Observer不同的是,它和Lifecycle是綁定的。

■ ViewModel

用于實(shí)現(xiàn)架構(gòu)中的ViewModel,同時(shí)是與Lifecycle綁定的,使用者無(wú)需擔(dān)心生命周期。方便在多個(gè)Fragment之前分享數(shù)據(jù),比如旋轉(zhuǎn)屏幕后Activity會(huì)重新create,這時(shí)候使用ViewModel可以方便使用之前的數(shù)據(jù),不需要再次請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)。

■ Room

谷歌推出的一個(gè)Sqlite ORM庫(kù),不過(guò)使用起來(lái)還不錯(cuò),使用注解,極大簡(jiǎn)化數(shù)據(jù)庫(kù)的操作。

■框架補(bǔ)充

工具庫(kù)幫助我們進(jìn)行開(kāi)發(fā),如果不滿(mǎn)足官方的庫(kù)其實(shí)可以自己實(shí)現(xiàn)。比如LiveData在某些情況下可使用RxJava代替。

數(shù)據(jù)層官方推薦使用Room或者Realm或者其他Sqlite ORM等都可以,同時(shí)從某些方面看Room風(fēng)格很像Retrofit。網(wǎng)絡(luò)請(qǐng)求也被推薦使用Retrofit。

各層之間的耦合推薦使用服務(wù)發(fā)現(xiàn)(Service Locator)或者依賴(lài)注入(DI),會(huì)上推薦了Dagger。

測(cè)試

各層之間的合理分層,為測(cè)試提供極大的方便。

UI層測(cè)試

使用Android Instrumentation Test,借助Espresso庫(kù)進(jìn)行,借助Mock的ViewModel,可以專(zhuān)注于測(cè)試UI

ViewModel 測(cè)試

使用Mock的Repository來(lái)提供數(shù)據(jù),使用JUnit測(cè)試,因?yàn)椴簧婕癠I,運(yùn)行速度會(huì)快很多。

Repository測(cè)試

數(shù)據(jù)層Mock一些數(shù)據(jù)返回給Repository,使用JUnit測(cè)試即可

數(shù)據(jù)層測(cè)試

使用JUnit測(cè)試

數(shù)據(jù)庫(kù),使用Room的話官方提供了測(cè)試支持,在測(cè)試時(shí)候創(chuàng)建內(nèi)存數(shù)據(jù)庫(kù)即可。

網(wǎng)絡(luò)請(qǐng)求,使用MockWebServer來(lái)提供假的服務(wù)端即可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容