寫(xiě)在前面
-
工作環(huán)境
我加入的是一家創(chuàng)業(yè)公司(91分紅),我是唯一的iOS属铁。那時(shí)我剛剛大學(xué)畢業(yè)眠寿,我所具備的iOS技能可能還不如培訓(xùn)機(jī)構(gòu)出來(lái)的多(至少各種第三方庫(kù)我都不會(huì)用),但是公司給了我很大的空間焦蘑,讓我自由成長(zhǎng)盯拱,這使得我的學(xué)習(xí)能力得到了充分的發(fā)揮。</br>
-
我是如何學(xué)習(xí)新知識(shí)點(diǎn)的
對(duì)于一個(gè)新的東西例嘱,我一般會(huì)先google一下狡逢,看5-10篇blog,挑一個(gè)寫(xiě)得比較好的照著做一遍蝶防,這樣在兩三個(gè)小時(shí)內(nèi)甚侣,我能有一個(gè)感性的認(rèn)識(shí)。接下來(lái)我會(huì)去扒一下頭文件间学,大致看一下這東西都能怎么用殷费。然后就是上蘋(píng)果開(kāi)發(fā)者中心下載相關(guān)的文檔,讀讀讀低葫。這樣第一天我能大致把項(xiàng)目中的功能搭起來(lái)详羡,第二天做細(xì)節(jié)填充和優(yōu)化。接下來(lái)如果有時(shí)間我還會(huì)去簡(jiǎn)書(shū)之類(lèi)的論壇挖一些優(yōu)化帖嘿悬,參照著優(yōu)化這個(gè)部分实柠。</br>
-
入職時(shí)項(xiàng)目開(kāi)發(fā)的進(jìn)度
入職時(shí)項(xiàng)目已經(jīng)開(kāi)始開(kāi)發(fā)了,安卓端善涨、后臺(tái)窒盐、前端都已經(jīng)工作了兩周。我大致了解了一下這個(gè)創(chuàng)業(yè)項(xiàng)目是干什么钢拧,然后拿到了之前的iOS搭起來(lái)的框架蟹漓,發(fā)現(xiàn)很亂。Boss表示可以重新來(lái)源内,我果斷重建了項(xiàng)目葡粒。那么問(wèn)題就來(lái)了,怎么組織項(xiàng)目的工程結(jié)構(gòu)(目錄結(jié)構(gòu))呢膜钓?(至于需求分析嗽交、UE設(shè)計(jì),根本都沒(méi)有時(shí)間管颂斜,后面的章節(jié)會(huì)用另一個(gè)項(xiàng)目談一談這兩點(diǎn))</br>
-
正式著手開(kāi)發(fā)之前夫壁,我的工程目錄結(jié)構(gòu)
關(guān)于這個(gè)問(wèn)題,可能初學(xué)者根本都沒(méi)有考慮過(guò)焚鲜。當(dāng)時(shí)我自己學(xué)習(xí)iOS開(kāi)發(fā)的時(shí)候掌唾,工程目錄簡(jiǎn)直就是一坨翔放前。
-
我是如何想到“目錄結(jié)構(gòu)”這個(gè)問(wèn)題的
因?yàn)榈谝惶炷玫绞值墓こ檀a有好多文件啊——網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)庫(kù)糯彬、各種第三方凭语,亂七八糟的,看得我心煩撩扒。根據(jù)喬幫主的極簡(jiǎn)主義和我的各種強(qiáng)迫癥似扔,我必須讓工程目錄優(yōu)雅起來(lái)。</br>
如何組織項(xiàng)目的工程目錄
這個(gè)沒(méi)有通用的模版搓谆,我查閱了其他工程師分享的目錄結(jié)構(gòu)炒辉,發(fā)現(xiàn)與我的并不完全一致,但是有非常多相似的地方泉手,算是一種工程師之間的約定吧黔寇。我總結(jié)歸納如下:</br>
可以從兩個(gè)角度來(lái)編排目錄結(jié)構(gòu)</br>
從功能點(diǎn)的角度</br>
優(yōu)點(diǎn):可以降低工程目錄中各模塊的耦合程度</br>
缺點(diǎn):可能會(huì)使工程目錄</br>從APP使用流程的角度(聯(lián)系人列表 -> 聯(lián)系人詳情 -> 編輯聯(lián)系人信息)</br>
優(yōu)點(diǎn):可以根據(jù)功能點(diǎn)快速定位代碼,工程目錄有層次感</br>
缺點(diǎn):各功能模塊可能使用了相同的東西斩萌,這可能會(huì)增加目錄之間的耦合程度(應(yīng)用多處用到)</br>
目錄結(jié)構(gòu)通常會(huì)結(jié)合“功能點(diǎn)”和“APP使用流程”來(lái)編排缝裤。
其他人是如何搭建工程目錄的
iOS項(xiàng)目的目錄結(jié)構(gòu)和開(kāi)發(fā)流程</br>
知乎上有關(guān)于項(xiàng)目目錄結(jié)構(gòu)的討論</br>
我是如何搭建工程目錄的
-關(guān)于共識(shí)</br>
-
每個(gè)項(xiàng)目都會(huì)有網(wǎng)絡(luò)層和數(shù)據(jù)庫(kù)層,所以會(huì)產(chǎn)生以下目錄
- Tools
- Network
- Database
- Tools
-
每個(gè)項(xiàng)目都可能用到第三方庫(kù)(SDWebImage AFNetwrok等)颊郎,用Cocoapods管理第三方庫(kù)是最佳選擇憋飞,可以隨時(shí)將第三方庫(kù)更新到最新版本
(小白級(jí)的CocoaPods安裝使用教程)- SupportingFiles
- ThirdPartyFrameWork
- AFNetwor
- SDWebImage
- ThirdPartyFrameWork
- SupportingFiles
-
每個(gè)項(xiàng)目都可能會(huì)使用第三方接口(微信 微博 支付寶等),所以會(huì)產(chǎn)生以下目錄
- SupportingFiles
- ThirdPartInterface
- alipay
- gaode
- ...
- ThirdPartInterface
- SupportingFiles
-
每個(gè)項(xiàng)目都可能用到圖片姆吭、音頻榛做、視頻資源,所以會(huì)產(chǎn)生以下目錄
- Resources
- Image
- Video
- Audio
- Resources
-
每個(gè)項(xiàng)目都會(huì)用到系統(tǒng)庫(kù)内狸,所以會(huì)產(chǎn)生以下目錄
- SupportingFiles
- SystemFramework
- SupportingFiles
-個(gè)人偏好</br>
-
我會(huì)把AppDelegate和整個(gè)APP的根視圖控制器提出來(lái)检眯,因?yàn)檫@是整個(gè)應(yīng)用的入口
- Root
- AppDelegate.h / .m
- RootViewController.h / .m
- (main.m)
- Root
-
有些工程師喜歡把宏定義文件放在MICRO目錄里,我偏好于把全局的宏定義文件放在Root中昆淡,其余各部分的宏定義文件放在各個(gè)模塊對(duì)應(yīng)的目錄中轰传,方便管理
- Root
- Micro
- MICRO_MAIN
- ...
- Micro
- Root
-剩下的具體的實(shí)現(xiàn)文件(MVC)
我個(gè)人偏好于按照APP使用流程編排目錄(細(xì)分到每一個(gè)功能點(diǎn)),譬如說(shuō)“微信”這個(gè)APP瘪撇,我可能會(huì)產(chǎn)生如下目錄</br>
* Chats
* RecentChatsList
* Micro
* Model
* View
* Controller
* ...
* GroupChat
* Contacts
* ContactList
* ...
* RecommendedFriends
* Discover
* Moments
* ...
* Games
* Me
* Profile
* ...
* Settings
之前提到了如果按照使用流程編排目錄,可能會(huì)增加目錄的耦合度港庄,所以對(duì)于應(yīng)用多處使用到的功能模塊倔既,我會(huì)把他們抽出來(lái),放到一個(gè)Public目錄里鹏氧,譬如說(shuō)對(duì)于“微信”渤涌,項(xiàng)目中我可能會(huì)產(chǎn)生以下目錄
* PublicModule
* ScanQRCode
* AddContacts
*...
當(dāng)然,根據(jù)項(xiàng)目的具體情況可能還會(huì)產(chǎn)生其他一級(jí)目錄把还,譬如說(shuō)比較復(fù)雜的應(yīng)用會(huì)使用到相當(dāng)多的自定義控件</br>
* Custom
* Extension
* UIKit
* ...
總結(jié)
“如何組織工程目錄”并沒(méi)有統(tǒng)一的說(shuō)法实蓬,但是會(huì)有一些共識(shí)茸俭。譬如目錄名要表明這個(gè)目錄下的文件的作用(文件名也是一樣)、數(shù)據(jù)庫(kù)層和網(wǎng)絡(luò)層要抽出來(lái)單獨(dú)建立一個(gè)目錄安皱。根據(jù)工程師的風(fēng)格最終會(huì)產(chǎn)生不同風(fēng)格的目錄結(jié)構(gòu)调鬓,但是我認(rèn)為編排目錄是以管理為目的的吧,所以盡可能寫(xiě)得清楚一點(diǎn)酌伊。