XMNetworking 是今天微博上看到的 南峰子 他們團(tuán)隊(duì)一個(gè)同學(xué)開(kāi)源的一個(gè)網(wǎng)絡(luò)框架.
這個(gè)框架是基于 AFNetworking 的再次封裝, 接口簡(jiǎn)潔, 使用簡(jiǎn)單.
這引起了我的一個(gè)簡(jiǎn)單的小思考, 什么才是一個(gè)好的封裝呢?
這個(gè)問(wèn)題其實(shí)是個(gè)很個(gè)人的問(wèn)題, 我只能說(shuō)說(shuō)我自己的想法.
我認(rèn)為簡(jiǎn)單的封裝就是把搜有的流程變成 三個(gè)步驟, 并且簡(jiǎn)化這三個(gè)步驟
配置->執(zhí)行->響應(yīng)
其實(shí)任何類庫(kù)往小了說(shuō)也就是這三個(gè)步驟, 把他們優(yōu)雅非切開(kāi), 就是我對(duì)封裝的理解.
我們往往希望的就是在一個(gè)地方把我需要的配置設(shè)置好, 在需要的時(shí)候去執(zhí)行方法, 然后統(tǒng)一的得到結(jié)果,處理結(jié)果.
希望是美好的,事實(shí)是殘酷的,我們往往面對(duì)的是一堆不知所云的的參數(shù),一些不知什么時(shí)候調(diào)用的代理,還有一堆各色各樣的執(zhí)行方法,我覺(jué)得這個(gè)時(shí)候,我會(huì)想起來(lái)曾經(jīng)聽(tīng)到的一個(gè)小笑話, 如何評(píng)價(jià)一個(gè) java 程序員的好壞呢? 就是看他對(duì) Spring 知道的有多少.... 當(dāng)然,我不會(huì) java, 就當(dāng)我瞎說(shuō)的吧.
那我們結(jié)合 XMNetworking 來(lái)說(shuō)一下我對(duì)這三個(gè)步驟的理解
XMNetworking 一個(gè)分為三個(gè)大類 XMRequest XMCenter XMEngine, 其實(shí)這三個(gè)類也就可以簡(jiǎn)單的映射為我之前說(shuō)的三個(gè)步驟, 當(dāng)然不得不說(shuō) 這個(gè)庫(kù)的確是個(gè)很簡(jiǎn)單的類庫(kù), 如果稍微復(fù)雜一點(diǎn), 也不能這么簡(jiǎn)單的分為三塊.
XMRequest 對(duì)應(yīng)的就是配置, XMCenter 對(duì)應(yīng)的是調(diào)用和響應(yīng), XMEngine 對(duì)應(yīng)的具體的執(zhí)行
XMRequest 看名字我們也都知道,它代表著一個(gè)請(qǐng)求, 當(dāng)我們發(fā)起一個(gè)請(qǐng)求的時(shí)候,只需要設(shè)置這個(gè) request 的參數(shù), 然后把它傳遞給 XMCenter 就大功告成了.
當(dāng)然, 我希望看到的是清爽配置清單, 而不知數(shù)以百計(jì)復(fù)雜的參數(shù). 這個(gè)又要說(shuō)一個(gè)笑話, 就是如何看一個(gè)軟件是否擁有設(shè)計(jì)師, 就看它的主頁(yè)上是否羅列了一大堆參數(shù)設(shè)置項(xiàng).
所以, 我認(rèn)為在對(duì)配置進(jìn)行封裝的時(shí)候要把常用的參數(shù)暴露出來(lái), 把復(fù)雜的不經(jīng)常使用的參數(shù)隱藏起來(lái).
那么我們就一定要把所有配置放在一起設(shè)置嗎, 當(dāng)然不是, 我們還要根據(jù)需求, 把他們?cè)俅芜M(jìn)行區(qū)分, 并且放到合適的地方. 比如說(shuō) XMNetworking 就把全局的參數(shù)都放到了 XMCenter 中去設(shè)置.
XMCenter, 這個(gè)是一個(gè)殼, 我們通過(guò)它, 把參數(shù)傳進(jìn)去, 然后再通過(guò)它觸發(fā)回調(diào), 好的封裝是我只需要關(guān)心殼, 而不需要必須去探尋底層的實(shí)現(xiàn), 如果有一些庫(kù)要求我們?cè)偕弦粚诱{(diào)用之后還要進(jìn)入到下層中處理回調(diào), 我相信是沒(méi)有人愿意使用它的. 而且我想說(shuō)的是 代理模式, 不得不承認(rèn) 代理 在一些情景中是十分正確高效的, 但是在處理一些簡(jiǎn)單的邏輯或者說(shuō)是流式/鏈?zhǔn)降倪壿嫷臅r(shí)候感覺(jué)有點(diǎn)復(fù)雜, 我更希望使用 callback block 來(lái)處理, 而代理呢, 我覺(jué)得更適用于處理事件的觸發(fā), 比如 tableview.
還有一點(diǎn)值得說(shuō)的就是 XMCenter 提供的調(diào)用接口, 為了用戶體驗(yàn), 它提供了很多簡(jiǎn)化的接口, 這也是讓人很舒服的一點(diǎn), 并且考慮到使用場(chǎng)景提供了 單例 和 生成對(duì)象兩種模式. 能夠簡(jiǎn)單的應(yīng)付大多數(shù)問(wèn)題
XMEngine這個(gè)類相對(duì)前面的兩個(gè)類就復(fù)雜的多了, 他封裝了所有對(duì) AFN 的操作, 這也就是把所有復(fù)雜的東西封裝起來(lái), 多余的就不說(shuō)了.
最后還有一點(diǎn)說(shuō)的就是, 封裝難道就是僅僅把原有的方法優(yōu)雅的重構(gòu)一遍?當(dāng)然不是, 我們往往在封裝的時(shí)候還可以吧我們的一些邏輯和行為進(jìn)行再次封裝, 從而簡(jiǎn)化我們的操作, TTRequest 提供了兩個(gè)類 XMChainRequest XMBathRequest, 我希望大家自己去看看源碼, 然后自己體會(huì)一下.
總結(jié)
先說(shuō)明一點(diǎn), 肯定沒(méi)有絕對(duì)正確的理論, 尤其是這種很個(gè)人的封裝方式的討論.
具體的解決問(wèn)題的方式還要根據(jù)具體的需求來(lái)進(jìn)行判斷.
表面上, 讓類庫(kù)變得簡(jiǎn)單而優(yōu)雅.
內(nèi)在呢, 要把結(jié)構(gòu)變得低耦合, 清晰, 可拓展
最后就是在基礎(chǔ)功能的基礎(chǔ)之上還要加上額外的便利功能.
這就是我對(duì)封裝的不成熟的個(gè)人理解.