前言
最近事情好多檀咙,好久沒動筆了,不過最重要還是自己懶了嗦枢。人一但有了惰性,就真的是一拖再拖屯断。好了文虏,說了幾句廢話,來說說今天要寫的主題--組件化開發(fā)殖演。
組件化定義
相信組件化開發(fā)大家都有接觸氧秘,所謂組件化開發(fā)就是把功能盡可能的獨立出來,組件間解耦趴久,這樣更利于團隊協(xié)作及后期改造丸相。那這和模塊化有什么區(qū)別?其實沒什么區(qū)別彼棍,我個人理解都是為了邏輯重用和解耦灭忠,但要說區(qū)別,組件化比模塊化更徹底一些座硕,模塊化更像是一個項目中的弛作,就像在項目中建立了多個Module,邏輯上區(qū)分了多個模塊华匾,但在代碼里是直接依賴的映琳。組件化則每一個組件單獨成一個項目,單獨編譯運行蜘拉,也就是項目對組件的依賴是aar或jar級別的萨西,編譯后的依賴,而模塊化是代碼直接依賴旭旭。這只是我個人理解谎脯,不喜勿噴。
為什么要組件化
以前開發(fā)一個App都是直接起一個項目持寄,在里面玩命加功能穿肄,結(jié)果特別臃腫年局,后面改bug加功能都十分痛苦,牽一發(fā)而動全身咸产,相信初始階段大家都有過類似的經(jīng)歷矢否。特別是去到一個公司,公司里有大量「祖?zhèn)鞔a」并且沒有好好規(guī)劃代碼結(jié)構(gòu)時脑溢,那真的是怎一個『苦』字了得僵朗。
總結(jié)一下組件化好處:
- 可以分小組并行開發(fā)不同的組件,因為組件間解耦屑彻,提高開發(fā)效率验庙;
- 組件可單獨運行、單獨測試社牲,修改組件不會輕易引起其它組件的問題粪薛,項目質(zhì)量也會有所提高;
- 最終的App只是選擇組裝各個組件搏恤,按需加載违寿,對于產(chǎn)品化的公司很有好處,可隨時根據(jù)需求快速發(fā)布多款A(yù)pp熟空。
組件化實踐
組件化首先肯定是要將功能模塊化的藤巢,在模塊化的基礎(chǔ)上再好好分層,解耦息罗。
剛開始做模塊化掂咒,會把功能單獨好,但是依賴關(guān)系會比較亂迈喉,最后可能會變成網(wǎng)狀的依賴绍刮,導(dǎo)致無法把每個功能單獨出來運行。
整理后應(yīng)該是這樣的(層次清晰挨摸,上層依賴下層录淡,同層之間不相互依賴):
Github上已經(jīng)有很多關(guān)于組件化的開源實現(xiàn),比如 ModularizationArchitecture油坝、 ARouter等等嫉戚。核心原理就是增加一個路由層,由路由去幫各個組件跑腿通信澈圈,這樣可以實現(xiàn)組件間解耦彬檀,只對路由進行依賴。大家細看會發(fā)現(xiàn)瞬女,由于要完全解耦窍帝,所有開源的組件化框架都是基于一個Action,也就是一個字符串來進行通信的诽偷。這就要求每個組件把它的功能Action寫成文檔提供出來坤学,把所有Action對應(yīng)的功能參數(shù)寫出來疯坤,因為參數(shù)也是通過一個Map進行傳遞的,這樣會導(dǎo)致要調(diào)用其它組件時深浮,需要去看文檔找到對應(yīng)Action才能調(diào)用压怠,而且對于閱讀代碼的人來說,也不知道這個Action代表什么意思飞苇,沒有辦法自解釋菌瘫。
我這里提出了一個理念,也在項目中實踐了布卡,在解耦和方便之間取了一個折中雨让。大家都知道,調(diào)用方最希望的就是可以直接調(diào)用忿等,不需要調(diào)用一個就看一次文檔栖忠,可以直接在代碼中由IDE提示這個組件能提供什么功能,而且參數(shù)是什么類型贸街,多少個參數(shù)庵寞。要做到IDE提示,那就需要涉及API調(diào)用了匾浪。我的項目中是這么實現(xiàn)的:
同樣定義一個通信用的路由皇帮,另外定義了一個組件功能定義模塊卷哩,所有組件都要依賴路由和功能定義模塊蛋辈,這樣組件間調(diào)用時可以通過路由去直接通過API去調(diào)用了。
比如定義一個設(shè)置組件功能:
對于組件功能定義模塊将谊,也定義為一個組件冷溶,每次增加組件或更新組件對外提供的功能時,就需要修改這個組件功能定義模塊尊浓。劣勢就是每次增加組件逞频,都要在這里添加一個接口定義,好處就是調(diào)用者可以很方便地知道每個組件提供哪些功能栋齿,接口參數(shù)是什么苗胀,是在代碼中自解釋的,不需要去查看每個組件的文檔了瓦堵。
其它組件調(diào)用時就可以方便時由IDE提示了:
總結(jié)
這里主要提出了一個區(qū)別于網(wǎng)上組件化框架的點基协,避免使用字符串去進行組件間交互,這樣會不好理解也容易出錯菇用。替換方案就是使用接口定義澜驮,方便在IDE中提示并且代碼自解釋。目前我的項目在實踐中惋鸥,還沒有發(fā)現(xiàn)什么坑杂穷,有坑就填吧悍缠,畢竟是自己挖的!耐量!如果有其它好的方案歡迎拍磚~