目标C:如何重构这个长的if - else语句?

时间:2015-01-04 03:39:49

标签: ios objective-c

这个if / else语句占据了我班级的很大一部分,坦白说它很烦人。有什么办法可以让这个更小更少的代码吗?这只是我实际代码的一个示例,但是如果有人可以帮我减小尺寸,我可以将它应用到我的实际代码中。

if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) {

    if ([self.currentSearchStr length] == 0) {

        phoneViewController = [[viewController alloc] initWithNibName:@"viewController"
                                                               bundle:nil
                                                                 list:self.list
                                                                index:indexPath.row
                                                                title:self.title];
    } else {
        phoneViewController = [[viewController1 alloc] initWithNibName:@"viewController1"
                                                                bundle:nil
                                                                  list:self.list1
                                                                 index:indexPath.row
                                                                 title:self.title];
    }

} else {

    if ([self.currentSearchStr length] == 0) {

        padViewController = [viewController alloc] initWithNibName:@"viewController"
                                                            bundle:nil
                                                              list:self.list
                                                             index:appDelegate.mSelectedRow
                                                             title:self.title];

    } else {

        padViewController = [[viewController1 alloc] initWithNibName:@"viewController1"
                                                              bundle:nil
                                                                list:self.list1
                                                               index:appDelegate.mSelectedRow
                                                               title:self.title];
    }

3 个答案:

答案 0 :(得分:6)

也许你可以像这样重构?使用? :

BOOL searchEmpty = [self.currentSearchStr length] == 0;
BOOL isIPhone = [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone;

Class ViewControllerCls = searchEmpty ? [ViewController class] : [ViewController1 class];
NSString* nibName = searchEmpty ? @"viewController" : @"viewController1";
NSArray* list = searchEmpty ? self.list : self.list1;

NSInteger index = isIPhone ? indexPath.row : appDelegate.mSelectedRow;

viewController = [[ViewControllerCls alloc] initWithNibName:nibName
                                                     bundle:nil
                                                       list:list
                                                      index:index
                                                      title:self.title];

答案 1 :(得分:2)

编辑:我更喜欢童年安迪的回答,因为它是我自己的一个更清洁的版本,但我会把这个留下来,这样你就可以理解if-else逻辑Andy的?:陈述背后。


是的,您可以通过在将initWithNibName:参数插入单initWithNibName:语句之前根据条件设置NSString *nibName; NSArray *list; if ([self.currentSearchStr length] == 0) { nibName = @"viewController"; list = self.list; } else { nibName = @"viewController1"; list = self.list1; } int index; if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) { index = indexPath.row; } else { index = appDelegate.mSelectedRow; } padViewController = [[viewController1 alloc] initWithNibName:nibName bundle:nil list:list index:index title:self.title]; 参数来压缩逻辑。

{{1}}

答案 2 :(得分:0)

这个特殊情况可以重构为initWithNibName的一次调用,参数作为变量(如其他答案所示)。

但是,如果这种类型的代码全部结束,请考虑将文件分成两个子类,一个用于iPad,另一个用于iPhone。公共代码可以存在于基类中。像这样打破这个课程并不总是正确的事情,但是值得考虑(理想情况是在单个文件太大之前!)。