在移動(dòng)開(kāi)發(fā)領(lǐng)域鞋邑,我們往往會(huì)遇到軟件的可擴(kuò)展性诵次、可復(fù)用性以及可維護(hù)性等問(wèn)題,這就涉及到如何做好軟件的架構(gòu)設(shè)計(jì)或者重構(gòu)優(yōu)化工作枚碗。結(jié)合實(shí)踐與思考逾一,本文對(duì)其中的Android應(yīng)用軟件架構(gòu)做些梳理,首先是層次結(jié)構(gòu)劃分肮雨,其次是技術(shù)選型的考慮遵堵。
這里層次結(jié)構(gòu)的劃分,可以從橫向和縱向兩個(gè)維度來(lái)考慮怨规。
橫向上的結(jié)構(gòu)層次陌宿,主要指代碼文件目錄結(jié)構(gòu)或者與之對(duì)應(yīng)的“包”(Package)的劃分。
對(duì)于使用了MVP架構(gòu)的應(yīng)用軟件波丰,結(jié)合實(shí)現(xiàn)方案壳坪,可以分為ui、presenter掰烟、model爽蝴、server、utils等媚赖。其中ui包括各種Activity霜瘪、Fragment,以及自定義的視圖組件惧磺、布局組件等颖对。而model包括業(yè)務(wù)模型、相關(guān)數(shù)據(jù)的定義等磨隘,server負(fù)責(zé)處理軟件和服務(wù)器的通信接口實(shí)現(xiàn)缤底、JSON數(shù)據(jù)解析等工作顾患。
在ui中,還可以按照業(yè)務(wù)功能來(lái)對(duì)Activity个唧、Fragment加以進(jìn)一步的劃分江解,這樣更方便團(tuán)隊(duì)分工維護(hù)。因?yàn)闃I(yè)務(wù)功能相關(guān)的UI大都體現(xiàn)在Activity或者與之關(guān)聯(lián)的Fragment徙歼,這樣劃分比較簡(jiǎn)明直觀犁河。
縱向上的層次結(jié)構(gòu),更側(cè)重邏輯調(diào)用和依賴關(guān)系魄梯,可分為業(yè)務(wù)層和組件層桨螺。
其中業(yè)務(wù)層,用于實(shí)現(xiàn)該軟件對(duì)應(yīng)的UI界面以及相關(guān)的功能邏輯酿秸,和用戶操作灭翔、展示關(guān)聯(lián)較多,可以選擇性地使用MVP架構(gòu)來(lái)實(shí)現(xiàn)辣苏。
因?yàn)樵摷軜?gòu)會(huì)增加類的數(shù)量并且至少涉及到三個(gè)層次的邏輯調(diào)用(在業(yè)務(wù)層之內(nèi))肝箱,建議只用在業(yè)務(wù)邏輯較多、UI顯示相對(duì)復(fù)雜稀蟋,或者后續(xù)更有可能需要擴(kuò)展的地方煌张。
具體到相關(guān)實(shí)現(xiàn),又有不同的策略糊治,例如我們可以使用Activity/Fragment/Adapter等組件來(lái)封裝擴(kuò)展Presenter唱矛,規(guī)避其復(fù)雜的生命周期變化、資源/變量的初始化和釋放等操作對(duì)業(yè)務(wù)邏輯的影響井辜。也可以將Activity/Fragment作為視圖層主體绎谦,通過(guò)接口和Presenter實(shí)現(xiàn)互相調(diào)用。這里還是需要結(jié)合業(yè)務(wù)特點(diǎn)粥脚,在架構(gòu)實(shí)現(xiàn)復(fù)雜度與可讀性窃肠、可維護(hù)性之間加以權(quán)衡,選擇合適的實(shí)現(xiàn)方案刷允,滿足要求即可冤留。
組件層,主要是獨(dú)立于上述業(yè)務(wù)邏輯之外的树灶,但與之有一定關(guān)聯(lián)的功能組件纤怒,例如推送服務(wù)、圖像識(shí)別天通、社會(huì)化分享以及支付組件等泊窘,通常作為模塊組件的方式支持業(yè)務(wù)層。如果進(jìn)一步細(xì)分,組件層還可以分為功能組件和基礎(chǔ)組件層烘豹。例如網(wǎng)絡(luò)連接管理瓜贾、日志管理等組件,相對(duì)更為通用携悯,和業(yè)務(wù)邏輯的直接關(guān)聯(lián)也更少一些祭芦,可以認(rèn)為是基礎(chǔ)組件。
在架構(gòu)設(shè)計(jì)過(guò)程中憔鬼,通常還涉及到各種技術(shù)選型龟劲,這也是為了避免重復(fù)造輪子,更好地利用已有成果逊彭、提高開(kāi)發(fā)效率咸灿。例如,業(yè)務(wù)層選用MVP還是MVVM架構(gòu)侮叮?在哪些子模塊使用?組件層悼瘾,圖像異步加載使用UIL還是Picasso囊榜?網(wǎng)絡(luò)連接管理采用OkHttp還是Volley?諸如此類亥宿。
這部分涉及較多的開(kāi)源項(xiàng)目卸勺、相關(guān)組件以及第三方服務(wù)商的優(yōu)缺點(diǎn)分析,例如不同組件的性能烫扼、sdk文件體積曙求、組件的配套使用等因素,后面繼續(xù)探討映企。