APP架構(gòu)和模塊化 組件化

框架是一個APP的骨骼齿尽,核心,一個項目的所有功能以及以后的迭代都是在此基礎(chǔ)上進(jìn)行的灯节,它是開展一個項目的至關(guān)重要的一步循头。如果這一步做的不好,會導(dǎo)致結(jié)構(gòu)散亂炎疆、閱讀性和擴(kuò)展性差卡骂,影響開發(fā)效率甚至導(dǎo)致代碼重構(gòu)

APP主要做哪些事情

調(diào)用網(wǎng)絡(luò)API

頁面展示

數(shù)據(jù)的本地持久化

動態(tài)部署方案

收集用戶數(shù)據(jù),給產(chǎn)品和運營提供參考

合理地組織各業(yè)務(wù)方開發(fā)的業(yè)務(wù)模塊形入,以及相關(guān)基礎(chǔ)模塊

每日app的自動打包全跨,提供給QA工程師的測試工具

架構(gòu)原則:易讀性、易維護(hù)性亿遂、易擴(kuò)展性

常見的分層架構(gòu):視圖層浓若、業(yè)務(wù)層渺杉、網(wǎng)絡(luò)層、數(shù)據(jù)層

所謂好架構(gòu)

有嚴(yán)格的代碼規(guī)范挪钓,結(jié)構(gòu)目錄清晰是越,功能模塊分類明確

注釋統(tǒng)一明確,有一致規(guī)范

避免復(fù)雜的依賴關(guān)系碌上,確保代碼的高封裝性和高復(fù)用性英妓,減少冗余代碼

沒有橫向依賴,盡可能少的跨層訪問

對業(yè)務(wù)方該限制的地方有限制绍赛,該靈活的地方要給業(yè)務(wù)方創(chuàng)造靈活實現(xiàn)的條件

易測試蔓纠,易拓展

接口少,接口參數(shù)少

低內(nèi)存吗蚌,高性能

提高模塊化程度腿倚,增加組件粒度

項目目錄結(jié)構(gòu)

1. 應(yīng)用入口(AppDelegate)

AppDelegate是應(yīng)用的代理,應(yīng)用級的事件都委托它處理蚯妇,包含啟動退出敷燎、推送等事件,以及IM箩言、支付等第三方的回調(diào)硬贯,這使得AppDelegate內(nèi)代碼龐大,錯綜復(fù)雜陨收,十分不利于閱讀和維護(hù),因此可以新增了一個AppDelegate+AppService類別饭豹,用來處理生命周期之外的業(yè)務(wù),AppDelegate作為事件入口务漩,具體實現(xiàn)直接調(diào)用類別里的方法拄衰,只為更清晰

2. 功能模塊(Modules)

Modules包含了應(yīng)用內(nèi)的功能模塊,一般根據(jù)底部Tab欄劃分并關(guān)聯(lián)實體文件夾,根據(jù)需求也可以增加Resource和Service文件夾饵骨,Service封裝數(shù)據(jù)請求翘悉,VC里調(diào)用拿數(shù)據(jù)即可;至于Resource為什么在這,我認(rèn)為當(dāng)功能模塊層級較多時居触,每個大功能模塊都對應(yīng)許多資源妖混,對應(yīng)到模塊內(nèi)用起來方便;當(dāng)然也可以放到最外層的Resource文件夾里,建立對應(yīng)的模塊名稱轮洋,在這兒我是選擇把公共的放到最外層Resource里制市,功能相關(guān)的放到模塊里的Resource文件夾內(nèi),只為更清晰;

3. 管理模塊(Manager)

Manager的定義是全局基礎(chǔ)服務(wù)砖瞧,通常使用類方法或者單例來實現(xiàn)息堂,主要包含對應(yīng)用、用戶的管理和服務(wù),例如網(wǎng)絡(luò)狀態(tài)監(jiān)聽荣堰,廣告頁應(yīng)用介紹頁等床未;用戶快速登錄退出操作以及登錄狀態(tài)的獲取等

4. 工具類(Utils)

Utils文件夾內(nèi)主要包含全局通用工具,來源于對三方框架的二次封裝振坚,或是自己寫的工具類薇搁。在這個項目里,我封裝了帶AES加密網(wǎng)絡(luò)請求工具渡八,全局Toast提示啃洋,廣告頁等

5. 基類(Base)

Base文件夾用來存放項目的基類,基類作用包含一些定制化的內(nèi)容屎鳍,例如頁面樣式宏娄,空數(shù)據(jù)頁面等,使用基類來實現(xiàn)逮壁,可以統(tǒng)一控制孵坚,利于維護(hù),減少冗余

6. 分類(Category)

對系統(tǒng)類窥淆、自定義類增加的類別都放在這里

7. 宏定義卖宠、頭文件(Define)

全局宏顧名思義是定義了一些全局通用宏、枚舉

一般是這幾種:工具宏定義(UtilsMacros):比如獲取屏幕寬高忧饭,系統(tǒng)版本扛伍,顏色賦值,數(shù)據(jù)類型驗證等

接口宏定義(URLMacros):定義服務(wù)器接口地址以及環(huán)境開關(guān)

枚舉(Enumerate):全局的枚舉

8. 第三方庫(ThridParty)

第三方文件夾放一些第三方的類庫和對第三方封裝词裤,比如第三方登錄刺洒、支付、IM等(靜態(tài)庫)

9. 資源文件(Resource)

主要是各種文件亚斋,json作媚、xml、dat帅刊、圖片,視頻,聲音等

10. 支持文件(Supporting Files)

主要放 PCH漂问,Assets.xcassets赖瞒,LaunchScreen.storyboard,Info.plist蚤假,main.m等系統(tǒng)文件

11. Pods(管理第三方庫)

CocoaPods是iOS項目的依賴管理工具栏饮,開發(fā)iOS項目不可避免地要使用第三方開源庫,CocoaPods的出現(xiàn)使得我們可以節(jié)省設(shè)置和第三方開源庫的時間

模塊化

就是將一個現(xiàn)有的工程磷仰,拆分成一個個可獨立編譯的子模塊的過程,同時袍嬉,需要提供一種機(jī)制,讓各個模塊間可以相互調(diào)用通信

各模塊間通過中介者M(jìn)ediator通信,使得各個模塊間沒有直接的引用伺通。而這箍土,也就是模塊化思想的核心,這也延伸出了一個問題,Mediator 必須知道每一個模塊的存在,這就在模塊和Mediator間產(chǎn)生了強(qiáng)耦合

業(yè)界給出了兩種方式:

1. 運用OC特有的語言機(jī)制罐监,就是runtime反射調(diào)用吴藻。

2. 設(shè)計注冊機(jī)制,每一個模塊主動向Mediator注冊自己弓柱,在Mediator中統(tǒng)一通過抽象的Class類型來管理這些模塊沟堡。用戶通過模塊對應(yīng)的key向Mediator索要對應(yīng)的模塊,然后在Mediator外部自行調(diào)用模塊的功能

這兩種方式矢空,都可以使得Mediator不再關(guān)心具體的模塊類型航罗,使得Mediator的實現(xiàn)與模塊解耦

CTMediator的核心思路

1.CTMediator核心,負(fù)責(zé)runtime反射的核心實現(xiàn)屁药,不需要引入其他模塊任何內(nèi)容

2,CTMediator的Category們伤哺,這些分類是跟模塊走的,有幾個模塊者祖,就應(yīng)該有幾個Category立莉。Category用于告訴調(diào)用者該模塊可以提供哪些功能,在CTMediator庫中七问,所提供的這些功能被稱為action蜓耻。Category會調(diào)用CTMediator核心的runtime接口,將任務(wù)發(fā)送到對應(yīng)的target;為了能夠讓CTMediator Category中能夠真正調(diào)用到對應(yīng)模塊的功能械巡,每個模塊還會提供一個對應(yīng)的target刹淌。target和模塊是強(qiáng)耦合的,target會直接引用模塊中的類型和接口

所謂基于注冊的模塊化方案讥耗,核心思想是:在Mediator中有勾,維護(hù)一個key-vaule形式的字典。模塊所提供的所有服務(wù)(或稱功能)古程,作為key蔼卡,而其真正提供服務(wù)的模塊對象,則作為vaule挣磨。當(dāng)客戶需要特定服務(wù)時雇逞,只需要向Mediator輸入對應(yīng)的key,便可以得到其對應(yīng)的服務(wù)對象;Service則表示該模塊能夠?qū)ν馓峁┑姆?wù),Service應(yīng)該是從屬與Module的

基于注冊的方案也有其優(yōu)點:因為所有的模塊都被注冊到Mediator中茁裙,因此對于一些模塊關(guān)心的系統(tǒng)或自定義事件塘砸,在Mediator中可以很方便的傳遞給每個模塊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晤锥,一起剝皮案震驚了整個濱河市掉蔬,隨后出現(xiàn)的幾起案子廊宪,更是在濱河造成了極大的恐慌,老刑警劉巖女轿,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箭启,死亡現(xiàn)場離奇詭異,居然都是意外死亡谈喳,警方通過查閱死者的電腦和手機(jī)册烈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婿禽,“玉大人赏僧,你說我怎么就攤上這事∨で悖” “怎么了淀零?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長膛壹。 經(jīng)常有香客問我驾中,道長,這世上最難降的妖魔是什么模聋? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任肩民,我火速辦了婚禮,結(jié)果婚禮上链方,老公的妹妹穿的比我還像新娘持痰。我一直安慰自己,他們只是感情好祟蚀,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布工窍。 她就那樣靜靜地躺著,像睡著了一般前酿。 火紅的嫁衣襯著肌膚如雪患雏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天罢维,我揣著相機(jī)與錄音淹仑,去河邊找鬼。 笑死言津,一個胖子當(dāng)著我的面吹牛攻人,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悬槽,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瞬浓!你這毒婦竟也來了初婆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎磅叛,沒想到半個月后屑咳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡弊琴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年兆龙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敲董。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡紫皇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腋寨,到底是詐尸還是另有隱情聪铺,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布萄窜,位于F島的核電站铃剔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏查刻。R本人自食惡果不足惜键兜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望穗泵。 院中可真熱鬧普气,春花似錦、人聲如沸火欧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苇侵。三九已至赶盔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榆浓,已是汗流浹背于未。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留陡鹃,地道東北人烘浦。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像萍鲸,于是被迫代替她去往敵國和親闷叉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容