如何優(yōu)化if else if

最近在優(yōu)化以前的舊代碼,發(fā)現(xiàn)代碼中有大量的if else if的代碼塊

主要存在以下問題:

問題1: if else 嵌套層次比較多

問題2: 代碼中if else if第一層就多大大十幾個 (嚇死寶寶了)

針對以上兩個問題簡單的說一下自己的思路,同時也是對最近工作的一個總結,希望對大家有幫助

解決問題:

  1. 條件合并
if(條件1){
    if(條件2){
    
    }
}

條件合并之后:

if(條件1 && 條件2){

}
  1. 把if else 中的業(yè)務分散到函數(shù)中
函數(shù)1{
   if(條件1){
    調用函數(shù)2;
} 

函數(shù)2{
   if(條件2){
} 
  1. 拆成一個一個的函數(shù)后,最外層還是有很多if else,同時if中的條件是比較有一定規(guī)范的時候可以采用動態(tài)調用函數(shù)的方式

a. 把條件和函數(shù)名設置成數(shù)據源

b. 使用for循環(huán)來動態(tài)決定調用哪個函數(shù)

下面是我的項目中實際用到的,大家可以參考一下

+ (RB_LinkUtil *)share{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        linkUtil = [[RB_LinkUtil alloc]init];
        // 采用單利的方式為了數(shù)據源只初始化一次
        [linkUtil initDataSource];
    });
    return linkUtil;
}

- (void)initDataSource{
    _dataArray = @[
        @{@"link":@"XXXX", @"methodName":@"goto_ft_link"},
        
        @{@"link":@"XXXX", @"methodName":@"goto_resautantDetail"},
        
        @{@"link":@"XXXX", @"methodName":@"goto_ordersList"},
        
        @{@"link":@"XXXX", @"methodName":@"goto_ordersDetail"},
        
        @{@"link":@"XXXX", @"methodName":@"goto_tracking"},
        
        @{@"link":@"XXXX", @"methodName":@"goto_couponsList"},
        
        @{@"link":@"XXXX", @"methodName":@"goto_messages_person"},
        
        @{@"link":@"XXXX", @"methodName":@"goto_messagesList"},
        
        @{@"link":@"XXXX", @"methodName":@"goto_restaurants"},

    ];
}

/**
 *所有的link跳轉
 *linkStr:link
 *dataDic:除去link字符串后,用于所有業(yè)務需要的參數(shù)都存放在此處
 *link:使用規(guī)制說明
     去掉了之前十多個if else if的判斷采用了objc_msgSend方式來觸發(fā)函數(shù)
     新增link規(guī)制需要改動
     1. 數(shù)據源處需要添加上對應的link和函數(shù)名字 例如:@{@"link":@"link鏈接", @"methodName":@"函數(shù)名字"}
     2. 函數(shù)名字的定義是帶三個參數(shù)的 如:- (void)to_ft_linkgo:(NSString *)linkStr currentVC:(UIViewController *)currentVC dataDic:(NSMutableDictionary *)dataDic
     to_ft_link是函數(shù)名名字,參數(shù)必須跟上面一致
     3. 所有的注釋按照已經實現(xiàn)的注釋寫,注釋只能比現(xiàn)有的多不能沒有注釋
 */
- (void)linkJupActionLink:(NSString *)linkStr dataDic:(nullable NSDictionary *)dataDic{
    PublicClass*public = [PublicClass setPublicClass];
    public.publicRestaurantModel = nil;
    UIViewController *currentVC = [ViewUtil jsd_getCurrentViewController];

    [_dataArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSDictionary *theObjec = (NSDictionary *)obj;
        if ([linkStr containsString:theObjec[@"link"]]) {
            NSString *methodName = theObjec[@"methodName"];
            NSString *sSelectorStr = [NSString stringWithFormat:@"%@:currentVC:dataDic:",methodName];
            SEL linkMehtodSEL = NSSelectorFromString(sSelectorStr);
            if ([self respondsToSelector:linkMehtodSEL]) {
                ((void( *)(id, SEL, id, id, id))objc_msgSend)(self, linkMehtodSEL, linkStr, currentVC, dataDic);
            }
            *stop = TRUE;
        }
    }];
    
}

#pragma mark - 跳轉到webview ft_link
- (void)goto_ft_link:(NSString *)linkStr currentVC:(UIViewController *)currentVC dataDic:(NSMutableDictionary *)dataDic{

}
#pragma mark - 自己定義的跳轉規(guī)則 #/resautantDetail
- (void)goto_resautantDetail:(NSString *)linkStr currentVC:(UIViewController *)currentVC dataDic:(NSMutableDictionary *)dataDic{
    
}

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容