2012-08-22 57 views
2

互联网的尊敬长辈,Objective-C的正确使用的if/else

我试图处理一系列词典,不同的数据集将需要不同的处理,并且每个数据集需要处理创建,更新和删除操作。很简单,我在寻找这样做的更有效的/聪明的办法...

- (NSDictionary*)processUpdatesForDataSet:(NSString*)dataSet ofType:(NSString*)type { 


if ([dataSet isEqualToString:@"countries"]) { 

    if ([type isEqualToString:@"CREATE"]) { 


    } else if ([type isEqualToString:@"UPDATE"]) { 


    } else if ([type isEqualToString:@"DELETE"]) { 


    } 

} else if ([dataSet isEqualToString:@"connections"]) { 

    if ([type isEqualToString:@"CREATE"]) { 


    } else if ([type isEqualToString:@"UPDATE"]) { 


    } else if ([type isEqualToString:@"DELETE"]) { 


    } 

} else if ([dataSet isEqualToString:@"sites"]) { 

    if ([type isEqualToString:@"CREATE"]) { 


    } else if ([type isEqualToString:@"UPDATE"]) { 


    } else if ([type isEqualToString:@"DELETE"]) { 


    } 

} 

} 
+0

是否每个dataSet类型的创建,更新和删除代码都不同?如果是这样,你可能想看看你的数据模型。如果没有,你可能想看看每种类型的公共处理程序,而不是每个数据集。 – Kalle

+0

这实际上并不是插入代码,这是在此之前的一个步骤,但是对于每个dataSet类型,进程都会有所不同。不幸的是,我用来提取这些数据的API不会以数据模型的正确格式返回,所以我需要将其转换。数据模型无法更改:( – Sammio2

+0

...如果这是您的目标(和您的问题),我必须告诉您所提供的“if ... else”语句是正确的。我可以制作更复杂的动态解决方案类似的问题与'NSDictionary'对象和'块',但我不太确定现在是否有必要。 – holex

回答

3

这是一个相当特殊的情况,我相信有些人会认为这种做法是有点走火入魔,但你有它。

有两种选择。一个是设置块来处理数据集。缺点是你必须保留这些块在一些字典或类似的。我不打算进入这种方法。另一种方法是根据数据集生成选择器并检查并调用该方法。

在processUpdates方法,你将不得不

NSString *dataSelString = [NSString stringWithFormat:@"dataSet_%@:", dataSet]; 
SEL dataSel = NSStringFromSelector(dataSelString); 
if ([self respondsToSelector:dataSel)] { 
    [self performSelector:dataSel withObject:type]; 
} else { 
    NSLog(@"warning: unknown dataSet: %@", dataSet); 
    // deal with unknown data set, e.g. alerting user or such 
} 

对于每一个数据集类型,那么你将不得不在self的方法,例如

- (void)dataSet_countries:(NSString *)type 
{ 
    // handle each type accordingly 
} 

你可以精简的if else到交换机情况下,如果你想,在选择来电显示法(processUpdates)一次检查的类型。例如:

在顶部

typedef enum { 
    DataTypeInsert = 0, 
    DataTypeUpdate = 1, 
    DataTypeDelete = 2, 
    DataTypeUnknown = NSNotFound 
} DataType; 
static NSArray *typeValues = nil; 

// in processUpdates method 
if (typeValues == nil) { 
    // we set up typeValues once 
    typeValues = [[NSArray alloc] initWithObjects:@"INSERT", @"UPDATE", @"DELETE", nil]; 
} 
// since 'unknown' is NSNotFound, this will work out fine always 
NSNumber *typeVal = [NSNumber numberWithInt:[typeValues indexOfObject:type]]; 

这样,你会提供typeVal,而不是类型的selectored方法和方法本身就如做周围的.m文件

- (void)dataSet_countries:(NSNumber *)type 
{ 
    DataType dataType = [type intValue]; 
    switch (dataType) { 
    case DataTypeInsert: 
     break; 
    // ... 
    case DataTypeUnknown: 
     // alert user or such that the type was invalid 
    } 
} 

希望能给你一些想法。

+0

感谢这个,我实际上实现了一个以前使用模块的方法......但是代码似乎变得越来越难以阅读了!这个方法并且一定要把它标记为当我完成时回答! – Sammio2

+0

我的关于使用字典映射字符串到块的第一个想法的评论是不这样做的。基本上,这正是Objective-C的方法调度确实,但它使用高度优化的马赫ine代码。你的第二个解决方案会更快。 – JeremyP