使用Block提高代碼可讀性

最近一直在思考并持續(xù)的擴(kuò)充著自己的技術(shù)棧,比如每天堅(jiān)持著學(xué)習(xí)前端知識(shí),并且時(shí)常想著在移動(dòng)端這條路上,自己的技術(shù)盲區(qū)。誠然,想要在一個(gè)領(lǐng)域達(dá)到一定的技術(shù)高度是挺困難的一件事情,操之過急萬萬不可,最主要的還是保持對技術(shù)的熱情,慢慢沉淀。

以前的公司并不需要高強(qiáng)度的加班,所以時(shí)長有時(shí)間去發(fā)掘一些新鮮玩意兒,圈內(nèi)有了技術(shù)熱潮,也能及時(shí)跟進(jìn)觀望或者學(xué)習(xí),但是最近在一波高強(qiáng)度加班過后,這種業(yè)務(wù)代碼與自身學(xué)習(xí)之間的沖突也讓我產(chǎn)生了一些自己的看法。一個(gè)程序員,不論何時(shí),不能拋掉持續(xù)學(xué)習(xí)的習(xí)慣。

最近的大面積寫業(yè)務(wù)代碼,當(dāng)碰到兩個(gè)類之間的傳值問題,我習(xí)慣性的解決方案是使用delegate,我覺得delegate本身當(dāng)命名得當(dāng)并且功能單一時(shí),可閱讀性會(huì)比較好。在習(xí)慣了這種思維后,開發(fā)中也養(yǎng)成了自己的習(xí)慣。

但是在最近封裝代碼的時(shí)候,我發(fā)覺delegate對于我自己定義并編寫代碼來說,可讀性和使用性很好,但是當(dāng)他人來使用我封裝的代碼的時(shí)候,也許Block更容易被理解一點(diǎn)。舉個(gè)簡單的例子,就比如

    [UIView animateWithDuration:1 animations:^{
       //do something
    }];

這是我們?nèi)粘W畛S玫?code>Block結(jié)構(gòu)之一,需要執(zhí)行的事情,只要在Block中交代清楚就可以了,在閱讀他人的代碼時(shí),可以直接在Block中直接閱讀到執(zhí)行的事件,并不用再去關(guān)注各種delegate中執(zhí)行了什么。大大提高了代碼的可讀性。

我認(rèn)為,程序員首先是寫人能看得懂的代碼,順便運(yùn)行。

在這個(gè)理念的驅(qū)使下,我大概會(huì)在之后的開發(fā)過程中,對可讀性這個(gè)概念更上心一點(diǎn),能用block處理的事件,盡量的用block處理。很久以前我寫過一篇博客,講述的是blcok的傳值,iOS4.0開始,蘋果爸爸引入了block的特性,而自從block特性誕生之日起,似乎它就受到了蘋果爸爸特殊的照顧和青睞。字面上說,block就是一個(gè)代碼塊,但是它的神奇之處在于在內(nèi)聯(lián)(inline)執(zhí)行的時(shí)候(這和C++很像)還可以傳遞參數(shù)。同時(shí)block本身也可以被作為參數(shù)在方法和函數(shù)間傳遞,這就給予了block無限的可能。

在日常的coding里絕大時(shí)間里開發(fā)者會(huì)是各種block的使用者,但是當(dāng)你需要構(gòu)建一些比較基礎(chǔ)的,提供給別人用的類的時(shí)候,使用block會(huì)給別人的使用帶來很多便利。當(dāng)然如果你已經(jīng)厭煩了一直使用delegate模式來編程的話,偶爾轉(zhuǎn)轉(zhuǎn)寫一些block,不僅可以鍛煉思維,也能讓你寫的代碼看起來高端洋氣一些,而且因?yàn)榇a跳轉(zhuǎn)變少,所以可讀性也會(huì)增加。

今天我用一個(gè)判斷奇數(shù)偶數(shù)的例子,來說說如何在封裝的方法中,根據(jù)條件來執(zhí)行方法內(nèi)攜帶的block。

首先看看我們這個(gè)含有blcok的類是如何聲明的。

typedef void (^LixExcuteOperation)(NSInteger);
typedef void(^LixError)(void);

@interface LixBlock : NSObject

- (void)isOddNumber:(NSInteger)number Excute:(LixExcuteOperation)excute Lixerror:(LixError)error;

@end

結(jié)合下面的圖片,來看看block是如何聲明并且定義的。

block的聲明與定義

再來看看這個(gè)方法的內(nèi)部,是如何使用block的,因?yàn)槭鞘纠?,所以我很粗略的去判斷了奇偶?shù),并沒有考慮特殊情況,見諒,只是個(gè)栗子。

- (void)isOddNumber:(NSInteger)number Excute:(LixExcuteOperation)excute Lixerror:(LixError)error {
    BOOL isOddNum = number % 2 == 0 ? NO : YES;
    if (isOddNum && excute) {
        excute(number);
    }
    
    if (!isOddNum && error) {
        error();
    }
}

至于調(diào)用,就更加隨意了。

    LixBlock *block = [[LixBlock alloc] init];
    [block isOddNumber:9 Excute:^(NSInteger number) {
        NSLog(@"is OddNumber %ld", number);
    } Lixerror:^{
        NSLog(@"is not OddNumber");
    }];

至此,一個(gè)簡單的封裝block進(jìn)方法的栗子就已經(jīng)講完了。舉一反三的講,我們在對網(wǎng)絡(luò)請求進(jìn)行二次封裝,執(zhí)行success或者error狀態(tài)的閉包時(shí),就可以用到類似的思想了。代碼的可讀性是否如愿提升了呢。

簡單的栗子講到這里,Coding還是需要多寫多思考的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,544評(píng)論 25 708
  • iOS應(yīng)用架構(gòu)談 網(wǎng)絡(luò)層設(shè)計(jì)方案 前言 網(wǎng)絡(luò)層在一個(gè)App中也是一個(gè)不可缺少的部分,工程師們在網(wǎng)絡(luò)層能夠發(fā)揮的空間...
    其實(shí)也沒有閱讀 586評(píng)論 1 1
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,255評(píng)論 4 61
  • 30天之前也就是1月16日的每個(gè)場景,還是歷歷在目。是的,元寶寶今天滿月了,On Valentine's Day,...
    S___閱讀 404評(píng)論 0 0
  • 睡不著先生因?yàn)楹推鸷茉缧〗阍谝黄鹱兂闪怂恍严壬?起很早小姐因?yàn)楹退恢壬谝黄鹩谑亲兂闪似鸩粊硇〗?他們一定是...
    Sally_Xinnnnng閱讀 167評(píng)論 0 0