Android 項(xiàng)目組件化重構(gòu)的一些考慮

重構(gòu)的目的

一言以蔽之:重構(gòu)就是為了改善既有代碼的設(shè)計(jì)。

在既不修正錯(cuò)誤,又不增加新的功能性前提下,重構(gòu)是用于提高代碼的可維護(hù)性、改善代碼內(nèi)部結(jié)構(gòu)與設(shè)計(jì)、移除冗余代碼、增強(qiáng)代碼可閱讀性、降低業(yè)務(wù)耦合的重要手段。

通過重構(gòu)代碼來增進(jìn)內(nèi)部的清晰性和一致性,面向代碼未來的生命周期,使其在將來更具有維護(hù)性,可以說這是一種項(xiàng)目可持續(xù)的技術(shù)演進(jìn)。

重構(gòu)內(nèi)容

考慮到實(shí)際中的項(xiàng)目情況,項(xiàng)目重構(gòu)的主要工作內(nèi)容分為下面幾個(gè)方面:

  • 構(gòu)建組件化多模塊項(xiàng)目架構(gòu),分離業(yè)務(wù)組件和基礎(chǔ)模塊,提高業(yè)務(wù)組件的可測(cè)試性和基礎(chǔ)模塊的可復(fù)用性;
  • 重復(fù)代碼的提煉,剔除重復(fù)代碼,提出核心庫;
  • 按照實(shí)際需求場(chǎng)景,整理競(jìng)品相關(guān)資料,統(tǒng)一業(yè)務(wù)邏輯、規(guī)范接口、解耦、增強(qiáng)模塊擴(kuò)展性;
  • 代碼優(yōu)化,拆分冗長的類,Review 代碼邏輯,完善業(yè)務(wù)流程;
  • 提取繼承體系中重復(fù)的屬性與方法到父類,重新封裝提告可復(fù)用性;

具體實(shí)施過程

構(gòu)建模塊化基礎(chǔ)架構(gòu)

這個(gè)可以根據(jù)項(xiàng)目實(shí)際情況,針對(duì)項(xiàng)目組件化開發(fā)進(jìn)行預(yù)研,確定了合適的技術(shù)選型方案,并考慮構(gòu)建了組件化的項(xiàng)目基礎(chǔ)架構(gòu)。

關(guān)于組件化和模塊化的區(qū)別,相信很多開發(fā)者對(duì)于兩者的定義都有各自的理解。

模塊化就是將一個(gè)程序按照其功能做拆分,分成相互獨(dú)立的模塊,以便于每個(gè)模塊只包含與其功能相關(guān)的內(nèi)容。模塊我們相對(duì)熟悉,比如登錄功能可以是一個(gè)模塊,搜索功能可以是一個(gè)模塊。

組件化就是基于可重用的目的,將一個(gè)大的軟件系統(tǒng)按照分離關(guān)注點(diǎn)的形式,拆分成多個(gè)獨(dú)立的組件,降低耦合。所以一個(gè)組件也可以是模塊,一個(gè)模塊也可以是一個(gè)組件。

模塊化和組件化本質(zhì)思想是一樣的,都是“大化小”,兩者的目的都是為了重用和解耦,如果非要說區(qū)別,那么可以認(rèn)為模塊化粒度更小,更側(cè)重于代碼功能上的重用,而組件化粒度稍大于模塊,更側(cè)重于業(yè)務(wù)解耦。

所以組件化的核心思想其實(shí)是為業(yè)務(wù)解耦服務(wù)的,一個(gè)組件最大的特點(diǎn)是具有了獨(dú)立運(yùn)行的能力,可以作為一個(gè)能偶進(jìn)行獨(dú)立開發(fā)、運(yùn)行、測(cè)試、發(fā)布的工程項(xiàng)目,所以最大的優(yōu)勢(shì)是大大縮減了工程結(jié)構(gòu)直接降低了編譯時(shí)間,讓開發(fā)和測(cè)試可以同時(shí)進(jìn)行,業(yè)務(wù)既可以整合也可以獨(dú)立拆分。

縱向維度劃分——分層架構(gòu)思想

說到分層結(jié)構(gòu),就不得不提到 Uncle Bob 寫的 The Clean Architecture 這篇文章。關(guān)于這篇文章中提到的 Clean 模型,有一個(gè)很重要的思想就是:代碼結(jié)構(gòu)用一個(gè)依賴規(guī)則分離到洋蔥狀的層來表示:內(nèi)層不應(yīng)該知道任何關(guān)于外層的東西,也就是外層依賴應(yīng)該指向里面。

The Clean Architecture.png

通常在 App 開發(fā)中提到的 3 層架構(gòu)可以說是一種物理分層概念,從上往下即展示層、業(yè)務(wù)層、持久層,也從上往下由上一層依賴下一層。不同層之間也是高內(nèi)聚低耦合的體現(xiàn),層內(nèi)高內(nèi)聚,層間低耦合,所謂的層是對(duì)層內(nèi)具體工作的高度抽象。低耦合則是依賴倒轉(zhuǎn)原則體現(xiàn)出來,高層依賴于下層的抽象而不是具體。

傳統(tǒng)的過程性系統(tǒng)的設(shè)計(jì)方法傾向于使高層次的模塊依賴于低層次的模塊,抽象層次依賴于具體層次。倒置原則就是要把這個(gè)錯(cuò)誤的依賴關(guān)系倒轉(zhuǎn)過來。也就是常說的要針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程。高層的模塊依賴于低層的模塊時(shí),這些高層模塊就很難在不同的環(huán)境中復(fù)用。但是當(dāng)那些高層模塊獨(dú)立于低層模塊時(shí),它們就能很簡(jiǎn)單地被復(fù)用了。這正是位于框架設(shè)計(jì)的最核心之處的原則。

而對(duì)于項(xiàng)目中開發(fā)中經(jīng)常提到的采用了 M-V-C 或 M-V-P 或 M-V-VM 架構(gòu)設(shè)計(jì),其實(shí)為了區(qū)別開 3 層架構(gòu)的分層結(jié)構(gòu),M-V-X更適合說是一種項(xiàng)目設(shè)計(jì)模式,這些都是為了解決擁有圖像界面的程序開發(fā)復(fù)雜性而產(chǎn)生的模式。

按照我開發(fā)中所面對(duì)的實(shí)際業(yè)務(wù)場(chǎng)景,如果從開發(fā)者 App 到 SDK 從外到內(nèi)這個(gè)過程來劃分,項(xiàng)目大致可分為業(yè)務(wù)核心層、數(shù)據(jù)模型層、 基礎(chǔ)服務(wù)層三個(gè)層次。按照事件從外到內(nèi),數(shù)據(jù)從里及外的傳遞。每一層都有各自獨(dú)立的功能模塊,上層依賴于下一層的服務(wù),下一層為上層的業(yè)務(wù)提供服務(wù)支撐。

這里舉個(gè)之前做 SDK 開發(fā)的例子。我們把現(xiàn)有業(yè)務(wù) SDK 的不同業(yè)務(wù)類型作為劃分業(yè)務(wù)組件的依據(jù),實(shí)現(xiàn)了業(yè)務(wù)組件之間的相互獨(dú)立,業(yè)務(wù)邏輯不會(huì)有相互耦合,而組件內(nèi)部又是可以單獨(dú)開發(fā)、運(yùn)行調(diào)試、打包測(cè)試、單獨(dú)發(fā)布。項(xiàng)目的基礎(chǔ)服務(wù)層實(shí)現(xiàn)了多模塊化,網(wǎng)絡(luò)請(qǐng)求、緩存控制作為了數(shù)據(jù)核心模塊單獨(dú)提出,從各業(yè)務(wù)模塊中抽離可共用的公共模塊,提升可復(fù)用性,為上層業(yè)務(wù)提供統(tǒng)一的基礎(chǔ)服務(wù)。

基礎(chǔ)架構(gòu).png

參考資料:

The Clean Architecture

Android業(yè)務(wù)組件化開發(fā)實(shí)踐

Android 跨 module 交互和方法調(diào)用

Android架構(gòu)思考(模塊化、多進(jìn)程)

Android 開發(fā):由模塊化到組件化(一)

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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