最近在優(yōu)化以前的舊代碼,發(fā)現(xiàn)代碼中有大量的if else if的代碼塊
主要存在以下問題:
問題1: if else 嵌套層次比較多
問題2: 代碼中if else if第一層就多大大十幾個 (嚇死寶寶了)
針對以上兩個問題簡單的說一下自己的思路,同時也是對最近工作的一個總結,希望對大家有幫助
解決問題:
- 條件合并
if(條件1){
if(條件2){
}
}
條件合并之后:
if(條件1 && 條件2){
}
- 把if else 中的業(yè)務分散到函數(shù)中
函數(shù)1{
if(條件1){
調用函數(shù)2;
}
函數(shù)2{
if(條件2){
}
- 拆成一個一個的函數(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ù)