使用Block提高代碼可讀性

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

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

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

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

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

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

我認為,程序員首先是寫人能看得懂的代碼,順便運行。

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

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

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

首先看看我們這個含有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的聲明與定義

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

- (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");
    }];

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

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

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

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,828評論 25 709
  • iOS應用架構(gòu)談 網(wǎng)絡層設計方案 前言 網(wǎng)絡層在一個App中也是一個不可缺少的部分,工程師們在網(wǎng)絡層能夠發(fā)揮的空間...
    其實也沒有閱讀 639評論 1 1
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,104評論 4 61
  • 30天之前也就是1月16日的每個場景,還是歷歷在目。是的,元寶寶今天滿月了,On Valentine's Day,...
    S___閱讀 461評論 0 0
  • 睡不著先生因為和起很早小姐在一起變成了睡不醒先生 起很早小姐因為和睡不著先生在一起于是變成了起不來小姐 他們一定是...
    Sally_Xinnnnng閱讀 196評論 0 0

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