XMNetworking: 通過(guò)一個(gè)網(wǎng)絡(luò)庫(kù)談?wù)劮庋b

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í)任何類(lèi)庫(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è)小笑話(huà), 如何評(píng)價(jià)一個(gè) java 程序員的好壞呢? 就是看他對(duì) Spring 知道的有多少.... 當(dāng)然,我不會(huì) java, 就當(dāng)我瞎說(shuō)的吧.

那我們結(jié)合 XMNetworking 來(lái)說(shuō)一下我對(duì)這三個(gè)步驟的理解
XMNetworking 一個(gè)分為三個(gè)大類(lèi) XMRequest XMCenter XMEngine, 其實(shí)這三個(gè)類(lèi)也就可以簡(jiǎn)單的映射為我之前說(shuō)的三個(gè)步驟, 當(dāng)然不得不說(shuō) 這個(gè)庫(kù)的確是個(gè)很簡(jiǎn)單的類(lèi)庫(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è)笑話(huà), 就是如何看一個(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)用接口, 為了用戶(hù)體驗(yàn), 它提供了很多簡(jiǎn)化的接口, 這也是讓人很舒服的一點(diǎn), 并且考慮到使用場(chǎng)景提供了 單例 和 生成對(duì)象兩種模式. 能夠簡(jiǎn)單的應(yīng)付大多數(shù)問(wèn)題

XMEngine這個(gè)類(lèi)相對(duì)前面的兩個(gè)類(lèi)就復(fù)雜的多了, 他封裝了所有對(duì) AFN 的操作, 這也就是把所有復(fù)雜的東西封裝起來(lái), 多余的就不說(shuō)了.

最后還有一點(diǎn)說(shuō)的就是, 封裝難道就是僅僅把原有的方法優(yōu)雅的重構(gòu)一遍?當(dāng)然不是, 我們往往在封裝的時(shí)候還可以吧我們的一些邏輯和行為進(jìn)行再次封裝, 從而簡(jiǎn)化我們的操作, TTRequest 提供了兩個(gè)類(lèi) XMChainRequest XMBathRequest, 我希望大家自己去看看源碼, 然后自己體會(huì)一下.

總結(jié)

先說(shuō)明一點(diǎn), 肯定沒(méi)有絕對(duì)正確的理論, 尤其是這種很個(gè)人的封裝方式的討論.
具體的解決問(wèn)題的方式還要根據(jù)具體的需求來(lái)進(jìn)行判斷.
表面上, 讓類(lèi)庫(kù)變得簡(jiǎn)單而優(yōu)雅.
內(nèi)在呢, 要把結(jié)構(gòu)變得低耦合, 清晰, 可拓展
最后就是在基礎(chǔ)功能的基礎(chǔ)之上還要加上額外的便利功能.
這就是我對(duì)封裝的不成熟的個(gè)人理解.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,765評(píng)論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,045評(píng)論 4 61
  • 朱麗,本人承諾,文章內(nèi)容為原創(chuàng),且為在其它平臺(tái)發(fā)布。 我本是風(fēng) 無(wú)拘無(wú)束 無(wú)影無(wú)蹤無(wú)牽絆 如果有一天我愿意停留 那...
    Troublemak_3c51閱讀 225評(píng)論 0 0
  • 在幼兒園的時(shí)候,我的情竇就開(kāi)了,可能是看電視看多了吧,因?yàn)樾r(shí)候爸媽都很忙,經(jīng)常把我一個(gè)人鎖在家里看電視,神奇...
    不喜歡自己的女孩閱讀 237評(píng)論 0 0
  • by http://www.devio.org/2016/10/09/INSTALL-FAILED-CONFLIC...
    zbmzly閱讀 545評(píng)論 0 0

友情鏈接更多精彩內(nèi)容