? ? ? 很多小伙伴在開發(fā)的過程當中會見到一個很神秘的詞--鏈式編程,那么到底什么是鏈式編程,鏈式編程到底有什么神奇之處呢唐全?一開始我是很怵這個詞的唆垃,總感覺它特別的高深莫測肛真,但最近由于工作需要袁铐,對這個詞進行一番琢磨推敲之后,我才發(fā)現(xiàn)這個家伙原來真的別有洞天淘衙,也收獲一些心得传藏,跟大家分享一下:
? ? ? 鏈式編程-顧名思義,鏈式,連貫性為其主要特征毯侦,放在編程領(lǐng)域來講哭靖,說簡單點就是把一系列的代碼執(zhí)行動作串聯(lián)起來,不用單獨一個一個的執(zhí)行侈离,話不多說试幽,來舉個例子:就是在很多文章中出現(xiàn)的計算器模型(CaculatorManager),我也是根據(jù)這個模型來理解鏈式編程的卦碾,所以我用自己理解的方式來給大家解析這個例子:
1. ?我們先直觀看一下這個鏈式編程用代碼寫出來是什么樣子:
好吧铺坞,我相信很多朋友第一次看到這坨代碼之后是一臉的MB(至少我是),這是什么鬼洲胖?莫急济榨,接下來我們就來看看這到底是什么東東。雖然一臉MB绿映,但細心的小伙伴會發(fā)現(xiàn)一個很關(guān)鍵的部分擒滑,就是那條“鏈”--caculator.add(1).add(10).sub(2),這句代碼看起來確實很像一條鏈子呦叉弦,但這啥意思呢橘忱?沒見過這樣寫代碼的啊卸奉!莫急,冷靜颖御,再看榄棵,有沒有發(fā)現(xiàn)這個有點類似平時我們用的點語法呢?嗯潘拱,的確疹鳄,但是沒見過這么一大串的點語法啊,你這又不是model取值芦岂,咋實現(xiàn)氨窆?
2. ?好了禽最,下面腺怯,就是見證奇怪的時刻:
(個人理解)鏈式編程的關(guān)鍵在于點語法的左邊代碼必定為點語法右邊代碼的執(zhí)行對象,即:(執(zhí)行對象).(方法)川无,也就是說呛占,無論“.”左邊的代碼鏈有多長,最終會返回一個對象來執(zhí)行“.”右邊的方法懦趋,因為本例中的CaculatorManager類型對象包含add與sub兩個實例方法晾虑,所以上圖中的對象caculator調(diào)用方法add(1),必定返回一個CaculatorManager類對象,來調(diào)用后面的方法帜篇,上圖:
如此糙捺,這就是我所理解的鏈式編程的基本原理(當然不僅僅局限于一個類);
朋友們看到這笙隙,腦海中可能有那么一點點閃光了洪灯,哦~原來是醬紫,但是逃沿,僅僅如此嗎婴渡?具體咋實現(xiàn)呢?
3. ?下面就介紹鏈式編程另一個關(guān)鍵點--block:
先來看一下一個完整的block咋寫呢凯亮?
/******?返回值 (^block名稱) (參數(shù))*******/
如此边臼,上文所說到的返回類對象就應(yīng)該寫為/****** CaculatorManager * (^block名稱) (參數(shù))*******/,這樣這個對象調(diào)用這個block的時候返回self就可以了假消;
上代碼:.h文件中代碼如下:
可見柠并,我們將先前討論的block命名為CaculBlock,返回值為CaculatorManager類型,參數(shù)為int型(這個就是加數(shù))富拗;
緊接著定義加法函數(shù):- (CaculBlock) add; 這個方法的返回值為上面的CaculBlock類型臼予,而且這個CaculBlock是帶參數(shù)的,所以在調(diào)用這個函數(shù)的時候啃沪,雖然這個函數(shù)沒有參數(shù)粘拾,但是這個返回block可以帶參數(shù),相當于對這個block進行調(diào)用创千,例如實現(xiàn)“+10”功能缰雇,傳統(tǒng)寫法為:[對象? add](10), 點語法調(diào)用為:對象.add(10)追驴,返回值仍為同類對象;
再來看.m文件中的代碼:
可見械哟,方法內(nèi)部實現(xiàn)了一個CaculBlock,對傳進來的參數(shù)做累加處理,用自身屬性result保存殿雪,add函數(shù)看似是返回一個block暇咆,實則返回的是self,減法函數(shù)同理丙曙;
現(xiàn)在我們再返回看一下本文的第一張圖片爸业,現(xiàn)在應(yīng)該差不多明白中間的那行代碼是啥意思了吧,就是(1+10-2)河泳;但是沃呢,最外面那一層又是什么意思呢?還是表示MB拆挥;其實薄霜,最外一層的代碼就是一個調(diào)用計算器的過程某抓;
4. ?調(diào)用計算器:
給 NSObject 新建一個類目(Caculator)——(個人感覺這樣是為了方便調(diào)用),直接上代碼:
至此惰瓜,就與文章開頭銜接上了否副,這也只是一個初步的認識,希望會對大家有所幫助崎坊,也希望大家多提寶貴意見备禀,謝謝!