如何优化if else if

2020-06-22  本文已影响0人  小_梦

最近在优化以前的旧代码,发现代码中有大量的if else if的代码块

主要存在以下问题:

问题1: if else 嵌套层次比较多

问题2: 代码中if else if第一层就多大大十几个 (吓死宝宝了)

针对以上两个问题简单的说一下自己的思路,同时也是对最近工作的一个总结,希望对大家有帮助

解决问题:

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

条件合并之后:

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

}
  1. 把if else 中的业务分散到函数中
函数1{
   if(条件1){
    调用函数2;
} 

函数2{
   if(条件2){
} 
  1. 拆成一个一个的函数后,最外层还是有很多if else,同时if中的条件是比较有一定规范的时候可以采用动态调用函数的方式

a. 把条件和函数名设置成数据源

b. 使用for循环来动态决定调用哪个函数

下面是我的项目中实际用到的,大家可以参考一下

+ (RB_LinkUtil *)share{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        linkUtil = [[RB_LinkUtil alloc]init];
        // 采用单利的方式为了数据源只初始化一次
        [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字符串后,用于所有业务需要的参数都存放在此处
 *link:使用规制说明
     去掉了之前十多个if else if的判断采用了objc_msgSend方式来触发函数
     新增link规制需要改动
     1. 数据源处需要添加上对应的link和函数名字 例如:@{@"link":@"link链接", @"methodName":@"函数名字"}
     2. 函数名字的定义是带三个参数的 如:- (void)to_ft_linkgo:(NSString *)linkStr currentVC:(UIViewController *)currentVC dataDic:(NSMutableDictionary *)dataDic
     to_ft_link是函数名名字,参数必须跟上面一致
     3. 所有的注释按照已经实现的注释写,注释只能比现有的多不能没有注释
 */
- (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 - 自己定义的跳转规则 #/resautantDetail
- (void)goto_resautantDetail:(NSString *)linkStr currentVC:(UIViewController *)currentVC dataDic:(NSMutableDictionary *)dataDic{
    
}

下面是很多if 条件中调用的函数
上一篇 下一篇

猜你喜欢

热点阅读