if - else 代碼段的優(yōu)化處理

概述

使用 if - else 的兩種常見場景:

    // 1.非空異常判斷
    id object;
    if (object == nil) {
        // code
    } else {
        // code
    }
    
    // 2.值狀態(tài)判斷
    if ([object isMemberOfClass:[NSObject class]]) {
        // code
    } else {
        // code
    }

對于第一種情況,可采取的優(yōu)化方式有

  • 合并條件表達(dá)式
  • 減少嵌套
  • 移除臨時變量等
    原則是盡可能地維持正常流程代碼在最外層腾啥,異常判斷最先判斷猪狈。

對于第二種情況

  • 可以將每個狀態(tài)對應(yīng)的代碼段封裝成一個方法晰赞,這樣代碼可以更清晰
  • 使用多態(tài)替代 if - else 代碼段

值得注意的是括儒,對于第一種使用 if-else 的情況,可以多多優(yōu)化罢洲,但對于第二種情況踢故,要慎重使用,不能為了優(yōu)化而優(yōu)化惹苗。

非空異常判斷 if - else 代碼段的優(yōu)化

1.合并表達(dá)式殿较,使代碼更清晰易懂

    int number = 100;
    
    // 優(yōu)化前
    if (number > 10) {
        return nil;
    }
    if (number < -10) {
        return nil;
    }
    if (number == 5) {
        return nil;
    }
    
    // 使用合并表達(dá)式條件優(yōu)化后
    if (number > 10 || number < -10 || number == 5) {
        return nil;
    }

2.減少 if - else 嵌套,將包含關(guān)系改為平行關(guān)系桩蓉,避免邏輯嵌套太深淋纲,使代碼邏輯清晰明了,一目了然院究。

    int money = 6;
    
    // 優(yōu)化前
    if (money < 0) {
        return @"食不果腹洽瞬,衣不蔽體";
    } else if (money > 100) {
        return @"財(cái)務(wù)自由";
    } else if (money > 10) {
        return @"小康家庭";
    } else if (money > 5) {
        return @"溫飽不愁";
    } else {
        return @"貧困家庭";
    }
    
    // 優(yōu)化后
    if (money < 0) {
        return @"食不果腹,衣不蔽體";
    }
    if (money > 100) {
        return @"財(cái)務(wù)自由";
    }
    if (money > 10) {
        return @"小康家庭";
    }
    if (money > 5) {
        return @"溫飽不愁";
    }
    return @"貧困家庭";

3.將異常判斷放在最前面业汰,且盡量減少臨時變量改用return直接返回伙窃,使代碼邏輯清晰。

     int number = 10;
    BOOL flag = NO;
    BOOL otherFlag = NO;
    
    // 優(yōu)化前
    if (number > 10) {
        return nil;
    }

    if (otherFlag) {
        int result = 0;
        if (flag) {
            result = number * 2;
        } else {
            result = number *-2;
        }
        return result;
    }
    return nil;
    
    // 將上面的異常判斷放在最前面样漆,且較少臨時變量的使用, 再合并表達(dá)式且將判斷改為平行關(guān)系为障。異常條件先退出這一條可適用于請求網(wǎng)絡(luò)數(shù)據(jù)后,對網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行判斷格式檢查時,先將異常情況的處理放在最前面鳍怨。
    if (number > 10 && !otherFlag) {
        return nil;
    }
    if (flag) {
        return number * 2;
    }
    return number *-2;

值狀態(tài) if-else 的優(yōu)化

1.將每種狀態(tài)下的長段代碼提取成一個函數(shù)

    int number = 10;

    // 優(yōu)化前
    if (number > 10) {
        // code balabala...
    } else {
        // code balabala...
    }
    
    // 優(yōu)化前
    if (number > 10) {
        [self funationA];
    } else {
        [self funationB];
    }

2.使用多態(tài)替代 if-else

以上闡述其他的優(yōu)化方式只能優(yōu)化 if-else 代碼段結(jié)構(gòu)呻右,但使用多態(tài)可以替代 if-else 。
這里使用多態(tài) + map + 反射具體實(shí)現(xiàn)鞋喇,當(dāng)然還有其他幾種實(shí)現(xiàn)方式,比如策略模式 + 工廠模式声滥,不過我認(rèn)為這種實(shí)現(xiàn)方式過于龐大。
舉例來說侦香,現(xiàn)在有個業(yè)務(wù)需求:根據(jù)汽車品牌落塑,獲取汽車配置。

使用 if-else 實(shí)現(xiàn)需求

    NSString *carBrand = @"BMW";
    
    if ([carBrand isEqualToString:@"BMW"]) {
        // BMW Configuration
    } else if ([carBrand isEqualToString:@"Benz"]) {
        // Benz Configuration
    }

使用多態(tài) + map + 反射實(shí)現(xiàn)

//1. 聲明汽車抽象類
@interface Car : NSObject
// 這個方法也可以提取到一個protocol中
- (NSString *)configuration;
@end
//2. 聲明具體的汽車子類罐韩,并實(shí)現(xiàn)其相應(yīng)方法
//2.1 聲明 BenzCar 類
@interface BenzCar : Car

@end

@implementation BenzCar
- (NSString *)configuration {
    return @"BenzCar configuration";
}
@end

//2.2 聲明 BMWCar 類
@interface BMWCar : Car
@end

@implementation BMWCar
- (NSString *)configuration {
    return @"BMWCar configuration";
}
@end
//3. 實(shí)現(xiàn)使用map + 反射機(jī)制的依托類

// 3.1 類的聲明
@interface CarConfigurationHelper : NSObject
+ (NSString *)carConfigurationWithCarBrand:(NSString *)brand;
@end

// 3.2 類的實(shí)現(xiàn)
@implementation CarConfigurationHelper

+ (NSString *)carConfigurationWithCarBrand:(NSString *)brand {
    static NSDictionary *map = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        map = @{
                @"Benz" : [BenzCar class],
                @"BMW"  : [BMWCar class]
                };
    });
    if (!map[brand]) {
        return nil;
    }
    Car *car = [[map[brand] alloc] init];
    return [car configuration];
}

@end

//4.客戶端的使用
- (void)function {
    NSString *configuration =  [CarConfigurationHelper carConfigurationWithCarBrand:@"BMW"];
    NSLog(@"Car configuration: %@",configuration);
}

參考:《重構(gòu)_改善既有代碼的設(shè)計(jì)》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芜赌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子伴逸,更是在濱河造成了極大的恐慌,老刑警劉巖膘壶,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件错蝴,死亡現(xiàn)場離奇詭異,居然都是意外死亡颓芭,警方通過查閱死者的電腦和手機(jī)顷锰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亡问,“玉大人官紫,你說我怎么就攤上這事≈菖海” “怎么了束世?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長床玻。 經(jīng)常有香客問我毁涉,道長,這世上最難降的妖魔是什么锈死? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任贫堰,我火速辦了婚禮,結(jié)果婚禮上待牵,老公的妹妹穿的比我還像新娘其屏。我一直安慰自己,他們只是感情好缨该,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布偎行。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睦优。 梳的紋絲不亂的頭發(fā)上渗常,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音汗盘,去河邊找鬼皱碘。 笑死,一個胖子當(dāng)著我的面吹牛隐孽,可吹牛的內(nèi)容都是我干的癌椿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼菱阵,長吁一口氣:“原來是場噩夢啊……” “哼踢俄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晴及,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤都办,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后虑稼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琳钉,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年蛛倦,在試婚紗的時候發(fā)現(xiàn)自己被綠了歌懒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡溯壶,死狀恐怖及皂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情且改,我是刑警寧澤验烧,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站钾虐,受9級特大地震影響噪窘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜效扫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一倔监、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菌仁,春花似錦浩习、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洽蛀。三九已至,卻和暖如春疟赊,著一層夾襖步出監(jiān)牢的瞬間郊供,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工近哟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驮审,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓吉执,卻偏偏與公主長得像疯淫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子戳玫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,504評論 25 707
  • 用兩張圖告訴你熙掺,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,693評論 2 59
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5咕宿? 答:HTML5是最新的HTML標(biāo)準(zhǔn)币绩。 注意:講述HT...
    kismetajun閱讀 27,422評論 1 45
  • 第6天:第六章戚繼光——孤獨(dú)的將領(lǐng) 從歷史上來看,戚繼光應(yīng)該算是成功的府阀。在帝國类浪,文官做為有文化的人,是瞧不起武官的...
    白色石南閱讀 860評論 0 1
  • 2017.8.8 快遞終于到了 想了很久的禮物終于要開始準(zhǔn)備了 很早之前就想過要準(zhǔn)備什么了 還是會拖到最后 誰讓我...
    彼得小屋閱讀 1,365評論 0 0