2010-11-09 121 views
1

基本上我有2个功能相似的方法。唯一的区别是不同的类容器。我试图实现的是统一这两种方法,并以某种方式使容器变得动态。2重复方法的代码重构

这里有2种方法:

-(NSMutableArray*) parseRequest:(NSArray*)elements { 
    NSMutableArray *currentStruct = [NSMutableArray array]; 
    for (id element elemets) { 
     // This is where the difference is 
     FriendRequest *friend = [[FriendRequest alloc] init]; 

     if(nickname != nil) { 
      friend.nickname = [element objectAtIndex:0]; 
     } 
     [currentStruct addObject:friend]; 
     [friend release]; 

    } 
    return currentStruct; 
} 

二:

-(NSMutableArray*) parseRequest:(NSArray*)elements { 
    NSMutableArray *currentStruct = [NSMutableArray array]; 
    for (id element elemets) { 
     // This is where the difference is 
     Friend *friend = [[Friend alloc] init]; 

     if(nickname != nil) { 
      friend.nickname = [element objectAtIndex:0]; 
     } 
     [currentStruct addObject:friend]; 
     [friend release]; 

    } 
    return currentStruct; 
} 

回答

1

对该类的参数。

-(NSMutableArray*) parseRequest:(NSArray*)elements withClass:(Class)friendClass { 
    NSMutableArray *currentStruct = [NSMutableArray array]; 
    for (id element elemets) { 
     // This is where the difference is 
     id friend = [[friendClass alloc] init]; // <--- 

     if(nickname != nil) { 
      [friend setNickname:[element objectAtIndex:0]]; 
     } 
     [currentStruct addObject:friend]; 
     [friend release]; 

    } 
    return currentStruct; 
} 

... 

-(NSMutableArray*) parseRequest:(NSArray*)elements { 
    return [self parseRequest:elements withClass:[Friend class]]; 
} 
1

或者你可以使用工厂模式:


-(NSMutableArray*) parseRequest:(NSArray*)elements factory:(SEL)factory { 
    NSMutableArray *currentStruct = [NSMutableArray array]; 
    for (id element elemets) { 
     NSObject *friend = [self performSelector:factory]; 

     if(nickname != nil) { 
      [friend performSelector:@selector(setNickname) withObject:[element objectAtIndex:0]]; 
     } 
     [currentStruct addObject:friend]; 

    } 
    return currentStruct; 
} 

-(Friend*) friendFactory { 
    return [[[Friend alloc] init] autorelease]; 
}