构建iOS稳定应用架构时方案选择的思考,主要涉及工程结构,数据流思想和代码规范...
工程結(jié)構(gòu)架構(gòu),減少耦合混亂以及防治需求大改造成結(jié)構(gòu)重構(gòu),如何構(gòu)建穩(wěn)定可擴(kuò)展可變換的工程結(jié)構(gòu)的思考
我打算采用Information flow的方式自上而下,兩大層分為基礎(chǔ)層和展現(xiàn)層的結(jié)構(gòu)?;A(chǔ)層分為多層,展現(xiàn)層也可分為多層。主要思想是將基礎(chǔ)層的最下一層當(dāng)做零部件,將業(yè)務(wù)層最下層當(dāng)做組裝大部件,通過(guò)流程串起來(lái)形成一個(gè)完整的產(chǎn)品,做零件時(shí)按照做出一個(gè)就扔進(jìn)對(duì)應(yīng)基礎(chǔ)層的籃子里思路來(lái),目錄結(jié)構(gòu)也可以按照這種來(lái)進(jìn)行。這兩大層的最下層按照零件拆得越小越容易應(yīng)對(duì)需求變化越容易保護(hù)鞏固上層的思路來(lái)就好。拿微信這個(gè)大家都熟悉的產(chǎn)品的幾個(gè)功能來(lái)簡(jiǎn)單示例說(shuō)明下這個(gè)思路構(gòu)建后的結(jié)構(gòu),模塊比較多,一些模塊就不深入到最底層分析了:
基礎(chǔ)層 - 網(wǎng)絡(luò) -- 收發(fā)數(shù)據(jù) ---單例(持續(xù)使用數(shù)據(jù)) ---本地(緩存和持續(xù)化存儲(chǔ)數(shù)據(jù)對(duì)業(yè)務(wù)的封裝輸出) ---單次使用(API接口Model封裝輸出和業(yè)務(wù)邏輯封裝的ViewModel,將這些做為業(yè)務(wù)零件) - 存儲(chǔ) --- NSUserDefault(對(duì)輕量需要存儲(chǔ)的添加下一層業(yè)務(wù)零件封裝) --- keychain(對(duì)安全級(jí)別較高需要存儲(chǔ)的添加下一層業(yè)務(wù)零件封裝) --- 文件存儲(chǔ)(對(duì)時(shí)效需求短的需要存儲(chǔ)的添加下一層業(yè)務(wù)零件封裝) --- 數(shù)據(jù)庫(kù)存儲(chǔ)(對(duì)數(shù)據(jù)量大的需要存儲(chǔ)的添加下一層業(yè)務(wù)零件封裝,業(yè)務(wù)層上一層加一層封裝CoreData或SQLite方便日后切換數(shù)據(jù)庫(kù)用) - 動(dòng)畫(huà)(下層將動(dòng)畫(huà)框架輸出成各個(gè)可以復(fù)用的動(dòng)畫(huà)功能小零件) - 視圖風(fēng)格 - 列表控件 -- 上拉加載更多 -- 下拉刷新 -- GuideView - WebView控件 - AlertView - iOS系統(tǒng)空間封裝 -- 拍照控件 -- 通訊錄 - 二維碼 - 語(yǔ)音 - 安全 - 支付 - 統(tǒng)計(jì) - 日志展現(xiàn)層 - 首頁(yè) -- 訂閱 -- 掃描二維碼 -- 發(fā)布視頻 - 列表 -- 時(shí)間軸列表 --- Listview頭部封面 --- 外鏈情況Cell --- 圖片Cell --- 廣告插入Cell --- 留言評(píng)論 --- 贊區(qū)域 -- 我的列表 -- 訂閱列表 -- 文章列表 - 詳細(xì)頁(yè) -- 分享 -- 內(nèi)容區(qū) -- 評(píng)論 - 登錄 -- 注冊(cè) -- 登錄 -- 忘記密碼 -- 條款 -- 上傳頭像 -- 個(gè)人信息修改基礎(chǔ)層中各個(gè)模塊上層可以使用類(lèi)似CocoaPod或Cathage方式,下一層再對(duì)其引用進(jìn)行業(yè)務(wù)封裝。
這里注意最下層需要拆的粒度越細(xì)越好。減少橫向依賴(lài)。類(lèi)似Common這樣的東西可以拆到基礎(chǔ)層的對(duì)應(yīng)模塊里,比如說(shuō)配置文件里和統(tǒng)計(jì)相關(guān)的放到基礎(chǔ)層的統(tǒng)計(jì)里,網(wǎng)絡(luò)相關(guān)的放到網(wǎng)絡(luò)里,顏色字體放到視圖風(fēng)格里,不要都堆在一個(gè)文件里。再或者是各種第三方的Category也放到對(duì)應(yīng)的組里,比如說(shuō)UIView+Additions和UIColor+Expanded就放到視圖風(fēng)格這個(gè)模塊中,不要專(zhuān)門(mén)搞個(gè)Category放所有的Category。
數(shù)據(jù)流控制模式MVC和MVCS/MVVM/VIPER的選擇
其實(shí)這些都是對(duì)MVC的擴(kuò)展,只是擴(kuò)展的方向不同而已。VIPER把視圖和數(shù)據(jù)拆得過(guò)細(xì)變相增加了復(fù)雜度很多人也都不熟也沒(méi)有意愿去了解它的實(shí)現(xiàn),但是模塊復(fù)用卻達(dá)到了最優(yōu),MVCS是這幾個(gè)里對(duì)MVC優(yōu)化最簡(jiǎn)單的只是把數(shù)據(jù)的存儲(chǔ)拆開(kāi)了。MVVM正好介于VIPER和MVCS之間,從ViewController里拆出來(lái)的ViewModel能夠?qū)?shù)據(jù)經(jīng)過(guò)邏輯處理用于View的顯示,View有操作用過(guò)ReactiveCocoa將信號(hào)傳給ViewModel來(lái)處理。
如果是我個(gè)人選擇我會(huì)選擇VIPER,因?yàn)樗霞?xì)粒度模塊劃分的思想。但是用在團(tuán)隊(duì)多人開(kāi)發(fā)上,還是偏向MVVM這種折中方案。MVVM按照先前對(duì)應(yīng)用的結(jié)構(gòu)分層,會(huì)將View和ViewController放到展現(xiàn)層的最下面的兩層里,將ViewModel和Model放到基礎(chǔ)層對(duì)應(yīng)模塊的最下面一層中。最后要說(shuō)的是無(wú)論選擇哪種,只要是按照減少ViewController大小,將改胖的地方放到Model或View都是可以的,招式學(xué)多后最高境界就是無(wú)招勝有招嘛,有時(shí)也不需要刻板的在一個(gè)項(xiàng)目中將所有的模塊都按照統(tǒng)一的思路給框死,比如說(shuō)一個(gè)模塊很簡(jiǎn)單就用MVC,一般復(fù)雜就用MVVM,要是項(xiàng)目本身業(yè)務(wù)非常龐大可以整體采用VIPER來(lái)進(jìn)行ViewController的完全拆分。
可以通過(guò)下列圖表看其中的不同:
| MVC | View + ViewController | + Model |
| MVCS | View + ViewController + Store | + Model |
| MVVM | View + ViewController + ViewModel | + Model |
| VIPER | View + ViewController + Wireframe + Presenter + Interactor + Data Manager | + Entity(Model) |
代碼規(guī)范
這塊最有權(quán)威的應(yīng)該是蘋(píng)果自己提出的https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html,按照這套來(lái)肯定是沒(méi)問(wèn)題的,而且首先應(yīng)該遵守。代碼結(jié)構(gòu)主要根據(jù)不同團(tuán)隊(duì)的經(jīng)驗(yàn)來(lái)做。下面舉個(gè)我常用的代碼結(jié)構(gòu)
@property ... #pragma mark - Life cycle 生命周期,類(lèi)似addSubview和Notification的監(jiān)聽(tīng)和銷(xiāo)毀都放在這里#pragma mark - Interface 接口#pragma mark - Event response#pragma mark - Private method 如果是ViewController,這個(gè)地方就是瘦身的關(guān)鍵,業(yè)務(wù)和邏輯功能相關(guān)的就放到ViewModel里。#pragma mark - Delegate 代理#pragma mark - Getters and Setters 建議所有的Property都設(shè)置,這樣修改配置會(huì)比較方便,看起來(lái)不會(huì)很混亂?
轉(zhuǎn)載:http://www.starming.com/index.php?v=index&view=83
轉(zhuǎn)載于:https://www.cnblogs.com/kenshinobiy/p/4889412.html
總結(jié)
以上是生活随笔為你收集整理的构建iOS稳定应用架构时方案选择的思考,主要涉及工程结构,数据流思想和代码规范...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: FreeMark将long类型的时间格式
- 下一篇: C语言 实现一个函数判断year是不是