開(kāi)發(fā)一個(gè)項(xiàng)目图云,軟件架構(gòu)是第一步惯悠,而我認(rèn)為項(xiàng)目的分層是軟件架構(gòu)中重要的一步。
項(xiàng)目分層是指代碼的組織方式竣况,說(shuō)的直白點(diǎn)就是如何去組織文件和文件夾克婶,好的項(xiàng)目分層使項(xiàng)目具有很好的可讀性和擴(kuò)展性。
一般說(shuō)來(lái)丹泉,項(xiàng)目的分層分為兩種:按類(lèi)別和按功能鸠补。
一、項(xiàng)目分層方式
1. 按類(lèi)別
在 Android 開(kāi)發(fā)早期嘀掸,很多項(xiàng)目都是按照類(lèi)別分層的紫岩,就是按照 activity、fragment睬塌、adapter 等來(lái)進(jìn)行分層泉蝌,按照類(lèi)別進(jìn)行分層的項(xiàng)目的目錄結(jié)構(gòu)大概是下面這種:
相信大家對(duì)這種結(jié)構(gòu)非常熟悉,這種分層方式的好處是:
- 簡(jiǎn)單明了揩晴,很容易知道每個(gè)子包下存放的是什么勋陪。
- 一旦項(xiàng)目采用這種分層方式,將來(lái)項(xiàng)目無(wú)論怎么迭代和變化硫兰,目錄結(jié)構(gòu)都不需要做太大的改動(dòng)诅愚。
但這種方式缺點(diǎn)也是很明顯的,如果項(xiàng)目太大劫映,有上百個(gè)界面违孝,那么在 activity 子包下會(huì)有上百個(gè)類(lèi),那樣要定位到具體某個(gè)功能模塊的 activity 會(huì)變得很困難泳赋,也就是說(shuō)這種方式不夠精細(xì)雌桑,隨著項(xiàng)目迭代功能越來(lái)越多,會(huì)導(dǎo)致代碼導(dǎo)航越來(lái)越困難祖今。
2. 按功能
這種分包方式是按照模塊劃分的校坑,同一功能模塊相關(guān)的類(lèi)都在一個(gè)文件夾下,項(xiàng)目的目錄結(jié)構(gòu)大概如下:
以上的分層可以看到有一個(gè)叫feature的包千诬,這里面包含了 app 的一些功能耍目,如 freshnews、login分別代表 app 內(nèi)部的新鮮事徐绑、登錄等一些功能模塊邪驮,這種按功能模塊的分層好處很明顯:
- 很直觀,可以很方便的根據(jù) app 的功能模塊定位到具體的代碼泵三。
- 擴(kuò)展性良好耕捞,如果想在此基礎(chǔ)上再按照 MVC、MVP的模式去進(jìn)一步分層烫幕,或者想在此基礎(chǔ)上再按照類(lèi)別去分層俺抽,依然可以,只需要 feature 包下某個(gè)具體的功能下面再加一層就好了较曼。
- 高度的模塊化磷斧,也就是所謂的“高內(nèi)聚”。隨著 app 的迭代捷犹,如果 app 過(guò)于龐大弛饭,想要實(shí)現(xiàn)插件化、組件化萍歉,這種分層模式可以省不少事侣颂。
但是這種方式也有一些缺點(diǎn),比如有些項(xiàng)目初期功能一直在變化枪孩,如果按照功能木塊劃分憔晒,會(huì)導(dǎo)致項(xiàng)目結(jié)構(gòu)一直在變化荣病。另一方面掏秩,如果項(xiàng)目很小,本身就沒(méi)多少界面印荔,按照這么分層感覺(jué)顆粒度太細(xì)攻询,有點(diǎn)大材小用的感覺(jué)从撼。
綜合以上分析,使用場(chǎng)景如下:
- 對(duì)于小型項(xiàng)目钧栖,推薦按照第一種分層方式低零。
- 對(duì)于大中型項(xiàng)目,推薦按照第二種分層方式拯杠。
當(dāng)然毁兆,這只是我自己一些想法,具體在項(xiàng)目中可以自己決定阴挣。隨著項(xiàng)目的龐大气堕,會(huì)導(dǎo)致按照功能分層的每個(gè)目錄下也會(huì)有很多文件,不易于定位功能代碼畔咧,這種情況可以按照功能+類(lèi)別的方式進(jìn)行分層茎芭,看起來(lái)像這樣:
二、軟件架構(gòu)方式和項(xiàng)目分層的關(guān)系
現(xiàn)在流行的軟件架構(gòu)方式誓沸,比如 MVC梅桩、MVP、MVVM等拜隧,這些是軟件架構(gòu)方式宿百,和項(xiàng)目分層是兩個(gè)維度的概念趁仙。
項(xiàng)目分層是指如何去組織文件夾和文件,而軟件架構(gòu)是指類(lèi)職責(zé)的劃分垦页、類(lèi)之間的通信方式雀费、類(lèi)的依賴(lài)關(guān)系以及數(shù)據(jù)在類(lèi)之間的流轉(zhuǎn)等。
如果你采用MVP模式痊焊,如果按照類(lèi)別進(jìn)行分層盏袄,項(xiàng)目結(jié)構(gòu)看起來(lái)可能是如下這樣:
而如果按照功能分包的方式,結(jié)構(gòu)可能是這樣:
三薄啥、小結(jié)
以上就是關(guān)于項(xiàng)目分層的兩種形式以及使用場(chǎng)景辕羽,值得強(qiáng)調(diào)的是,這種分層方式不是標(biāo)準(zhǔn)和固定的垄惧,完全可以結(jié)合實(shí)際場(chǎng)景進(jìn)行選擇和變通刁愿。對(duì)項(xiàng)目進(jìn)行分層是整個(gè)架構(gòu)的一部分,但項(xiàng)目架構(gòu)遠(yuǎn)不止于此到逊,接下來(lái)的文章會(huì)介紹架構(gòu)相關(guān)的知識(shí)酌毡,以及目前Android開(kāi)發(fā)領(lǐng)域比較流行的一些軟件架構(gòu)模式,比如 MVC蕾管、MVP枷踏、MVVM和Clean。