一、引言
? ? ? ? 經(jīng)過前段時間的一番瘋狂面試,終于算是安定下來了,剛?cè)肼氁患腋杏X不錯的公司。公司想要在原來產(chǎn)品的基礎(chǔ)之上再做一個新的項目,之前在上一家公司做項目的時候總覺得app的一個層次不如意,但是在原有的項目上去改又比較費(fèi)時費(fèi)力,再加上公司項目不斷的加需求,改需求,根本有多少時間去細(xì)化分析目錄結(jié)構(gòu)。這次正好借做新項目的機(jī)會,我就根據(jù)自己的經(jīng)驗從零開始搭建整個App的目錄結(jié)構(gòu),當(dāng)然這離項目架構(gòu)來說還差很遠(yuǎn),不過一個好的App目錄結(jié)構(gòu)不僅能使app有一個好的層次分級,使邏輯清晰,還便于維護(hù),提高開發(fā)效率。
? ? ? 當(dāng)然,我在此只是說一下我個人的一些觀點,畢竟每個人可能一些習(xí)慣或者思維方式是不一樣的,加上我個人還算不上大神,所以只是把自己的經(jīng)驗與大家分享,以供我們相互借鑒,也希望大家提供寶貴意見。
二、開始前的思考
? ? ? ? 既然從零開始,那么在創(chuàng)建項目目錄結(jié)構(gòu)的時候我考慮到的問題有:
1、項目中有哪些功能?
2、各功能如何實現(xiàn)?
3、怎么樣能快速定位到要找功能?
萬事開頭難,在創(chuàng)建項目之前,我對比看了之前的項目目錄結(jié)構(gòu),也從網(wǎng)上看了一些關(guān)于app目錄結(jié)構(gòu)的經(jīng)驗分享,想了很多方面,下面我們來看上面所列的問題:
1、項目中有哪些功能?
? ? ? ? 這個問題其實就是看自己對要做的項目的一個整體了解,要知道所做App重點在什么地方,用到最多的是哪方面的知識,一個整體的交互是什么樣的,因為不同功能的app無論是在功能還是交互上都是差別很大的,所以一定要清楚項目整體功能,知道項目中有哪些模塊,你可以把不同模塊作為不同層次的分類依據(jù),這樣App就可以按照不同模塊分成若干層級,然后再具體實現(xiàn)。當(dāng)然我們也可以找到不同模塊中相同的地方,再來按照他們的業(yè)務(wù)層次來劃分層級,不管我App中有多少功能,那都離不開我們?nèi)龑蛹軜?gòu),那好,我就按照不同業(yè)務(wù)層次給你劃分模塊,這樣也可以。
2、各模塊如何實現(xiàn)?
? ? ? 說完了第一個問題,接著上一個問題我們再來說各模塊如何實現(xiàn)?有些人可能會說,這怎么說,項目開發(fā)過程中一步步實現(xiàn)就行了啊。其實我想說的并不是每個模塊如何具體實現(xiàn),更準(zhǔn)確地是想說如何實現(xiàn)各個模塊之間高效的交流,如何避免冗余代碼,如何讓程序更健壯,更輕量級。模塊之間高效交流指的就是跨層、跨模塊訪問,避免冗余代碼就提現(xiàn)了封裝等思想,所以要實現(xiàn)這些模塊的功能,我們就一定會用到一些額外的功能來解決這些問題。無論是在問題1中提到的是以模塊來作為劃分依據(jù)還是以業(yè)務(wù)層次來作為劃分依據(jù),都少不了這些額外的功能,比如我們會用到很多第三方,那么我們可以吧這些第三方統(tǒng)一放到一個地方,這樣可以更好地管理。此外,在不同模塊實現(xiàn)的時候我們很可能會用到同樣的方法,那我們就可以進(jìn)行封裝作為工具類,還有想自定義的控件等等。。。
3、如何快速定位到要找的功能(類)?
? ? ? ? 當(dāng)項目出現(xiàn)問題或者需求改變的時候,我們?nèi)绾文芸焖俣ㄎ坏侥繕?biāo)類,個人感覺也算是一個要考慮的地方,問題1和2中所考慮的會直接影響這一步,我的想法是先找到目標(biāo)所對應(yīng)的模塊或者所對應(yīng)的業(yè)務(wù)層次,再找具體實現(xiàn)點。對于頻繁接觸的地方如我們項目中的網(wǎng)絡(luò)請求和接口這樣的單獨分層。
三、具體實現(xiàn)
考慮了以上問題,對于項目結(jié)構(gòu)我們可以從以下方面著手:
1、主項目目錄先按照MVC層次劃分,內(nèi)層目錄再按照項目功能模塊劃分;
2、主項目目錄先按照功能劃分,內(nèi)層目錄再按照MVC層次劃分。
3、輔助功能單獨劃分層級。
4、內(nèi)容較多時,采用1和2結(jié)合的方式。
方式一:主項目目錄先按照MVC層次劃分,內(nèi)層目錄再按照項目功能模塊劃分

采用這種分類方式我們可以直接將項目分Model Controller View三層,然后Model里面存放各個模塊的model,所有控制器全放在Controller里面,視圖放在View里面,然后在相應(yīng)的業(yè)務(wù)層次里面再根據(jù)MVC方式進(jìn)行劃分業(yè)務(wù)層次。
優(yōu)點:業(yè)務(wù)層次之間結(jié)構(gòu)清晰明了
缺點:當(dāng)項目較大時不容易找到相應(yīng)的模塊,每個模塊之間太過于分散,開發(fā)起來不是很方便。
方式二: 主項目目錄按照模塊功能劃分,內(nèi)層目錄再按照MVC層次劃分

這一種方式再實際開發(fā)過程中應(yīng)該用的比較多,我個人也是比較習(xí)慣用這一種方式,這樣的分類方式需要我們對項目的一個結(jié)構(gòu)有一個整體的了解,項目一共有幾個主要模塊,每個模塊都有什么功能,每個模塊之間會有哪些交互,清楚了這些,我們在做項目目錄的時候就容易多了,比如我現(xiàn)在要做一個微信的項目,那我可以首先將其分為“消息”、“通訊錄”、“發(fā)現(xiàn)”、和“我的”四大模塊,然后在這四大模塊中再次進(jìn)行小模塊的劃分,如“我的”模塊中有“錢包”、“收藏”、“相冊”等,再次作為一個小模塊,在小模塊中再進(jìn)行業(yè)務(wù)層次劃分。當(dāng)然這種方式也有其優(yōu)缺點,。
優(yōu)點:從目錄結(jié)構(gòu)就能清晰看出整個項目的層次,能快速找到對應(yīng)的功能
缺點:模塊比較分散,不同模塊用到相通類時不好歸類。
三、總結(jié)
? ? ? 以上兩種方式是比較常見的兩種思路,當(dāng)然也絕不只有這兩種方式,在以上兩種方式中沒有絕對的熟好熟劣,只是各有優(yōu)點,在開發(fā)中我們可以將二者優(yōu)點結(jié)合起來,比如我可以先將項目主目錄結(jié)構(gòu)按照模塊功能劃分,這一分級是針對項目主要功能,還是拿微信舉例,對于微信來說,下面TabBar上這4大功能顯然是最主要的分級,那么我們可以按照此分級現(xiàn)將項目分為這四個模塊。然后對于消息這樣的模塊,子模塊較少,我們可以直接在這個模塊下將其按照業(yè)務(wù)層次劃分,將所有的Controllers、Models、Views歸類,對于像“我的”這個模塊,里面還會有很多模塊,比如“錢包”、”收藏“、“設(shè)置”等,可以再將其按照模塊分類,然后第三級再按業(yè)務(wù)層次分類。個人覺得這樣的方式結(jié)合更方便一些,當(dāng)然這樣看每個人的開發(fā)習(xí)慣。不過不論按照哪種方式分類,分類的層級建議不要超過三級,除非一些特別復(fù)雜,內(nèi)容特別多的模塊,否則會讓項目感覺比較雜,物極必反,太細(xì)分一個結(jié)構(gòu),反而會降低開發(fā)的效率。

? ? ? ? 以上說的目錄形式,指的都是針對項目中的主要功能,一些具體的模塊,一個項目,無論其大其小,總有些類或者模塊是為整個項目服務(wù)的,像這樣的我們不論按照哪種分級方式都不是很合理,單獨給他們做分級是比較好的選擇,因為他們是整個項目中用的最多,跨度最廣的。比如說有些工具類,我們用到的網(wǎng)路封裝、宏定義、延展,或者自己公司的一些Custom等我們就可以單獨拿出來,還有一些雖然不常用但是比較重要的比如說AppDelegate,一些Base基類,frame,sdk等也可以單獨為他們做一個目錄。還有一個我們項目中很有可能會用到第三方,對于第三方的管理我們該怎么去做,是手動管理還是用cocopods管理等這些都需要考慮,另外比較容易忽略的一點在Xcode中我們建目錄的時候在項目中是不會創(chuàng)建文件夾的,我們最好是在項目中創(chuàng)建文件夾把響應(yīng)分級對應(yīng)到不同的文件夾中而不是僅僅Xcode中創(chuàng)建的分組。

Class:存放的是App中所有的模塊功能
Base:存放一些基類,比如BaseViewController,BaseModel等,共性直接在基類中去修改
Vendor:三方,因為我的項目中使用cocopods管理三方,所以這個文件夾中我在此放的是一些比較小的功能的第三方
Framework:存放一些類庫或者自己封裝的一些靜態(tài)庫
Resource:存放app中一些索引資源,比如圖片,文本等,或者將圖片打包的Bundle
Custom:這個文件夾我用來存放自己項目或者公司自己風(fēng)格的一些自定義的視圖,比如我們常見的上拉加載,下拉刷新的自定義頭部空間等
API:這個只專門用來做網(wǎng)絡(luò)處理的,因為這個項目基本上都會用到網(wǎng)絡(luò)請求,算是比較重要的一個部分,所以在此單獨拿出來作為一個分類
Support:這個用來存放一些比較小的模塊,比如常用的一些工具類,分類,宏定義,PCH文件等
Main:專門存放AppDelegate或者AppDelegate的Category
? ? ? ? 以上就是個人對于項目目錄結(jié)構(gòu)的一些看法,沒有說絕對好的目錄結(jié)構(gòu),只有我們不斷優(yōu)化的目錄結(jié)構(gòu),在開發(fā)中我們更重要的還是要結(jié)合自己項目本身,具體情況具體分析,當(dāng)然思想才是最重要的,希望大家多提寶貴意見,一起進(jìn)步。