2010-11-09 98 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]; 
}