前言:
之前看了Casa大神的架構設計文章,醍醐灌頂,一直想開個系列文章記錄一下(這次就做個小小搬運工,別打臉),公司項目實在太忙,最近稍好些,就開始著手做這件事,這個系列共以下幾篇:
1. 搭建優質的App框架
2. view層的組織和調用方案(常用架構模式-MVC、MVCS、MVVM)
3. 網絡層設計方案
4. 數據持久化設計方案及動態部署
5. 組件化方案
框架是一個APP的骨骼,核心,一個項目的所有功能以及以后的迭代都是在此基礎上進行的,它是開展一個項目的至關重要的一步。如果這一步做的不好,會導致結構散亂、閱讀性和擴展性差,影響開發效率甚至導致代碼重構。
APP主要做哪些事情?
- 調用網絡API
- 頁面展示
- 數據的本地持久化
- 動態部署方案
- 收集用戶數據,給產品和運營提供參考
- 合理地組織各業務方開發的業務模塊,以及相關基礎模塊
- 每日app的自動打包,提供給QA工程師的測試工具
架構原則:易讀性、易維護性、易擴展性。
常見的分層架構:視圖層、業務層、網絡層、數據層。
因此針對每一層我們都要有對應的設計方案。
所謂好架構:
- 有嚴格的代碼規范,結構目錄清晰,功能模塊分類明確
- 注釋統一明確,有一致規范
- 避免復雜的依賴關系,確保代碼的高封裝性和高復用性,減少冗余代碼
- 沒有橫向依賴,盡可能少的跨層訪問
- 對業務方該限制的地方有限制,該靈活的地方要給業務方創造靈活實現的條件
- 易測試,易拓展
- 接口少,接口參數少
- 低內存,高性能
- 提高模塊化程度,增加組件粒度
一、項目目錄結構
確保目錄中每一項都為實體文件夾,而非創建的是Group。
一般包含這么幾項(文件夾):
- 應用入口(APPDelegate)
- 功能模塊(Modules)
- 管理模塊(Manager)
- 工具類(Utilities)
- 基類(Base)
- 分類(Category)
- 宏定義、頭文件(Define)
- 資源文件(Resource)
- 第三方庫(ThridParty)
- Pods(管理第三方庫):可對第三方庫進行二次封裝供頂層使用,當第三方庫的接口發生改變的時候,我們只需要改我們所封裝中的接口就可以了。
1. 應用入口(APPDelegate)
AppDelegate是應用的代理,應用級的事件都委托它處理,包含啟動退出、推送等事件,以及IM、支付等第三方的回調,這使得AppDelegate內代碼龐大,錯綜復雜,十分不利于閱讀和維護,因此可以新增了一個AppDelegate+AppService類別,用來處理生命周期之外的業務,AppDelegate作為事件入口,具體實現直接調用類別里的方法,只為更清晰。
2. 功能模塊(Modules)
Modules包含了應用內的功能模塊,一般根據底部Tab欄劃分并關聯實體文件夾(默認是虛擬的要手動建立實體文件夾拖進來),每個模塊內使用的是MVC模式,一般包含Model、View、Controller這三個文件夾,根據需求也可以增加Resource和Service文件夾,Service封裝數據請求,VC里調用拿數據即可,至于Resource為什么在這,我認為當功能模塊層級較多時,每個大功能模塊都對應許多資源,對應到模塊內用起來方便,當然也可以放到最外層的Resource文件夾里,建立對應的模塊名稱,在這兒我是選擇把公共的放到最外層Resource里,功能相關的放到模塊里的Resource文件夾內,只為更清晰。
3. 管理模塊(Manager)
Manager的定義是全局基礎服務,通常使用類方法或者單例來實現,主要包含對應用、用戶的管理和服務,例如網絡狀態監聽,廣告頁應用介紹頁等;用戶快速登錄退出操作以及登錄狀態的獲取等。
4. 工具類(Utilities)
Utils文件夾內主要包含全局通用工具,來源于對三方框架的二次封裝,或是自己寫的工具類。
5. 基類(Base)
Base文件夾用來存放項目的基類,基類作用包含一些定制化的內容,例如頁面樣式,空數據頁面等,使用基類來實現,可以統一控制,利于維護,減少冗余。
6. 分類(Category)
對系統類、自定義類增加的類別都放在這里。
7. 宏定義文件
全局宏顧名思義是定義了一些全局通用宏、枚舉。
一般是這幾種:工具宏定義(UtilsMacros):比如獲取屏幕寬高,系統版本,顏色賦值,數據類型驗證等;
接口宏定義(URLMacros):定義服務器接口地址以及環境開關;
枚舉(Enumerate):全局的枚舉
8. 資源文件(Resource)
主要是各種文件,json、xml、dat、圖片等。
9. 第三方庫(ThridParty)
第三方文件夾放一些第三方的類庫和對第三方封裝,比如第三方登錄、支付、IM等。
10. CocoaPods
包管理工具,方便我們更新管理第三方庫
全篇精髓參考Casa大神:Casa架構設計