最近在优化以前的旧代码,发现代码中有大量的if else if的代码块
主要存在以下问题:
问题1: if else 嵌套层次比较多
问题2: 代码中if else if第一层就多大大十几个 (吓死宝宝了)
针对以上两个问题简单的说一下自己的思路,同时也是对最近工作的一个总结,希望对大家有帮助
解决问题:
- 条件合并
if(条件1){
if(条件2){
}
}
条件合并之后:
if(条件1 && 条件2){
}
- 把if else 中的业务分散到函数中
函数1{
if(条件1){
调用函数2;
}
函数2{
if(条件2){
}
- 拆成一个一个的函数后,最外层还是有很多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 条件中调用的函数
网友评论