最近一直在忙新項(xiàng)目的事情,所以有的坑一直沒填?!,F(xiàn)在看來可能一時(shí)半會兒還填不了,倒不如記錄一下新項(xiàng)目的搭建。 試想一下,如果沒有歷史負(fù)擔(dān),沒有KPI壓力,去新搭建一個(gè)項(xiàng)目,你會怎么設(shè)計(jì)和實(shí)現(xiàn)呢? Application specific類似clean architecture,分為三層 presentation - data - domain。 關(guān)于Clean Architecture由于國內(nèi)的一些文章和項(xiàng)目都多少有偏離和錯誤,建議直接看
兩篇文章。 domain為純領(lǐng)域模型,是Java library,包含了use case(Interactor)、DO、repository接口等domain package,目標(biāo)是在任何Java語言的平臺上都能直接使用,所以必須是平臺無關(guān),對平臺沒有任何依賴,能使用Java的方法(JUnit Mockito)來直接進(jìn)行測試。 data為domain的實(shí)現(xiàn),是Android library,從MVP的角度來說,即是M層,內(nèi)部隱藏所有數(shù)據(jù)細(xì)節(jié),cache、數(shù)據(jù)庫、網(wǎng)絡(luò)、PO、exception(根據(jù)業(yè)務(wù)特點(diǎn)自定義的exception)、repository的具體實(shí)現(xiàn)(內(nèi)部屏蔽數(shù)據(jù)細(xì)節(jié),可能來自網(wǎng)絡(luò)、數(shù)據(jù)庫、緩存等)。使用Robolectric 3 JUnit Mockito進(jìn)行集成測試。 presentation即展示層,是Android application module,對data不存在實(shí)際感知,依賴僅僅是Dagger注入的實(shí)例化,所有訪問都通過接口進(jìn)行,可見的是domain里的接口。包含了error message factory(所有exception都會被factory生成對應(yīng)的message)、DI、mapper(vo轉(zhuǎn)換)、VO(data binding進(jìn)行MVVM)、navigation、presenter(不強(qiáng)制,僅在一些特別復(fù)雜的場景引入)、usersystem、utils(業(yè)務(wù)相關(guān))、view(activity、fragment、adapter等)、application實(shí)現(xiàn)、業(yè)務(wù)常量等??梢允褂肊spresso和Android Instrumentation進(jìn)行UI測試。 整個(gè)項(xiàng)目類似MVP MVVM的混合(誰跟你說的MVP和MVVM是互斥的?),不過P層不一定存在,以避免為了模式而模式所導(dǎo)致的開發(fā)壓力。 Common librariesaar依賴以避免對編譯速度造成影響,不過這里比較巧妙的是依賴作為module引入,所以當(dāng)需要源碼依賴的時(shí)候在build.gradle里進(jìn)行注釋/反注釋就能迅速切換,十分方便。 lib_uiframework: UI framework,包含了各種Base類,如BaseActivity、BaseFragment、Navigator(應(yīng)用中的一切通過scheme跳轉(zhuǎn))、ActivityManager、FragmentBackHelper等。 lib_uikit: 各種自定義view、第三方view的gradle或者源碼依賴。 lib_im: 即時(shí)通訊庫。 lib_component: 組件庫,如cache、gif、ClassLoaderInjecter、Log、SP、Web等。 lib_authorize: 第三方認(rèn)證(登陸),目前包括QQ、微信、微博、LinkedIn。 lib_share: 第三方分享,目前包括QQ、微信、微博。 …等等 Third party librariesDagger, jsr250: 依賴注入框架讓我們省了很多代碼,jsr250則是Dagger注入時(shí)的一個(gè)annotation根據(jù),我們的domain依賴了jsr250。 Rx大家族: RxJava, RxAndroid, RxBinding。新時(shí)代Android開發(fā)必備,還用說嗎? Retrofit: 裝逼,喔,不對,高效率開發(fā)必備的網(wǎng)絡(luò)框架。使用注解生成API,方便極了。我這里的實(shí)踐是根據(jù)業(yè)務(wù)劃分多個(gè)API接口,然后通過Dagger module進(jìn)行實(shí)例化注入。 EventBus: 有了RxJava還要EventBus?當(dāng)然,事件并不總是一對一的。舉個(gè)簡單的例子,feed詳情信息更新后(比如點(diǎn)贊數(shù)據(jù)),外部可能有2個(gè)timeline頁面也需要更新這個(gè)數(shù)據(jù),這個(gè)時(shí)候EventBus就可以優(yōu)雅地進(jìn)行事件廣播。 Realm:一個(gè)不依賴于SqlLite的ORM庫,特點(diǎn)就是…快。還有同時(shí)有多個(gè)平臺的方案: ReactNative, OC, Swift, Java… Google Support庫, data binding: Google家的,不用說了吧。 LeakCanary, BlockCanary: 開發(fā)階段必備工具,前者是square家檢測內(nèi)存泄露的,后者是我自己做的卡頓檢測工具。 Glide, Glide Transformation: 不折騰fresco,乖乖用Glide。 |
|