【objc-zen-book】1.條件語(yǔ)句&Case語(yǔ)句的注意

這個(gè)小系列是從 "Zen and the Art of the Objective-C Craftsmanship"中 進(jìn)行的摘抄,共分成6篇,大部分是講代碼風(fēng)格及美化,偶爾看看也不錯(cuò)。


  • 條件語(yǔ)句

    條件語(yǔ)句體應(yīng)該總被大括號(hào)包圍。只有一行代碼最好也加上,否則會(huì)帶來安全隱患。

    // 推薦
    if (!error) {
        return success;
    }
    
    // 不推薦
    if (!error)
        return success;
    
    if (!error) return success;
    
  • 尤達(dá)表達(dá)式(Yoda)

    不要使用尤達(dá)表達(dá)式。(名字起源于星球大戰(zhàn)中尤達(dá)大師的講話方式,總是用倒裝的語(yǔ)序)

    // 推薦
    if ([myValue isEqual:@42]) { ...
    
    // 不推薦
    if ([@42 isEqual:myValue]) { ...
    
  • nil和BOOL的檢查

    一些人喜歡用這樣的方式來檢查nil:

    if (nil == myValue) { ...
    

    這樣做可以避開少些一個(gè)"=“的錯(cuò)誤,因?yàn)橐坏┥賹懸粋€(gè)”=“,那么nil是不能被賦值的,編譯器會(huì)報(bào)錯(cuò)。

    但是前面提到,最好不要使用尤達(dá)表達(dá)式。所以更好的解決方法是用”!”來完成nil和BOOL的檢查。

    // 推薦
    if (someObject) { ...
    if (![someObject boolValue]) { ...
    if (!someObject) { ...
    
    // 不推薦
    if (someObject == YES) { ... // Wrong
    if (myRawValue == YES) { ... // Never do this.
    if ([someObject boolValue] == NO) { ...
    
  • 不要嵌套多個(gè)if語(yǔ)句

    不要嵌套多個(gè)if語(yǔ)句,而是使用多個(gè)return來避免增加復(fù)雜度,并提高代碼可讀性。

    也就是說,在一個(gè)方法中,重要的部分盡量不要放在if語(yǔ)句中,而是將”其它情況”放在if中。

    // 推薦
    - (void)someMethod {
      if (![someOther boolValue]) {
          return;
      }
    
      //Do something important
    }
    
    // 不推薦
    - (void)someMethod {
      if ([someOther boolValue]) {
        //Do something important
      }
    }
    
  • 復(fù)雜的表達(dá)式

    當(dāng)一個(gè)判斷條件很復(fù)雜時(shí),應(yīng)該將它們提取出來賦值給一個(gè)BOOL變量。

    BOOL nameContainsSwift  = [sessionName containsString:@"Swift"];
    BOOL isCurrentYear      = [sessionDateCompontents year] == 2014;
    BOOL isSwiftSession     = nameContainsSwift && isCurrentYear;
    
    if (isSwiftSession) {
        // Do something very cool
    }
    
  • 三元運(yùn)算符

    三元運(yùn)算符要保證可讀性。

    // 推薦
    result = a > b ? x : y;
    
    // 不推薦
    result = a > b ? x = c > d ? c : d : y;
    

    當(dāng)三元運(yùn)算符的第二個(gè)參數(shù)(if 分支)返回和條件語(yǔ)句中已經(jīng)檢查的對(duì)象一樣的對(duì)象的時(shí)候,下面的表達(dá)方式更靈巧:

    // 推薦
    result = object ? : [self createObject];
    
    // 不推薦
    result = object ? object : [self createObject];
    
  • 錯(cuò)誤處理

    有些方法通通過參數(shù)返回 error 的引用,使用這樣的方法時(shí)應(yīng)當(dāng)檢查方法的返回值,而非 error 的引用。

    // 推薦
    NSError *error = nil;
    if (![self trySomethingWithError:&error]) {
        // Handle Error
    }
    
  • switch語(yǔ)句中的case,如果只有一行代碼可以不必加上大括號(hào),但是多行需要加上。

    switch (condition) {
        case 1:
            // ...
            break;
        case 2: {
            // ...
            // Multi-line example using braces
            break;
           }
        case 3:
            // ...
            break;
        default: 
            // ...
            break;
    }
    
  • 枚舉類型

    使用NS_ENUM()這個(gè)宏來定義枚舉,它有更強(qiáng)大的的類型檢查和代碼補(bǔ)全。

    typedef NS_ENUM(NSUInteger, ZOCMachineState) {
        ZOCMachineStateNone,
        ZOCMachineStateIdle,
        ZOCMachineStateRunning,
        ZOCMachineStatePaused
    };
    

所有文章
【objc-zen-book】1.條件語(yǔ)句&Case語(yǔ)句的注意
【objc-zen-book】2.命名
【objc-zen-book】3.類
【objc-zen-book】4.Category & NSNotification
【objc-zen-book】5.美化代碼 & 代碼組織
【objc-zen-book】6.Block & self的循環(huán)引用

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

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