2013-03-27 2 views
0

다음과 같은 목적으로 유사한 방법을 리팩터링하는 방법 (목표 C)?객관적인 C에 대한 유사한 방법 리펙토링

- (void)insertNewSong:(Song *)newSong forArtist:(Artist *)artist { 
    NSMutableArray *newSongList = [[artist songs] mutableCopy]; 

    BOOL hasInserted = NO; 

    for (int i = 0; i < [[artist songs] count]; i++) { 
     Song *existingSong = [[artist songs] objectAtIndex:i]; 
     if ([[newSong title] caseInsensitiveCompare:[existingSong title]] == NSOrderedAscending) { 
      [newSongList insertObject:newSong atIndex:i]; 
      hasInserted = YES; 
      break; 
     } 
    } 

    if (hasInserted == NO) { 
     [newSongList addObject:newSong]; 
    } 
    artist.songs = newSongList; 
} 

- (void)insertNewArtistToSongList:(Artist *)newArtist { 
    BOOL hasInserted = NO; 

    for (int i = 0; i < [_artists count]; i++) { 
     Artist *existingArtist = [_artists objectAtIndex:i]; 

     if ([[newArtist name] caseInsensitiveCompare:[existingArtist name]] == NSOrderedAscending) { 
      [_artists insertObject:newArtist atIndex:i]; 
      hasInserted = YES; 
      break; 
     } 
    } 

    if (hasInserted == NO) { 
     [_artists addObject:newArtist]; 
    } 
} 

insertNewSong 메서드의 경우 각 Song 개체가 들어있는 NSMutableArray [아티스트 노래]가 사용됩니다. insertNewArtist 메소드의 경우 각 아티스트 객체를 포함하는 NSMutableArray 인스턴스 변수 _artists가 사용됩니다.

두 가지 방법 모두 입력 개체의 텍스트 속성과 배열 내에있는 텍스트 속성을 비교하여 개체를 NSMutableArray에 삽입합니다.

현재 위의 방법에는 몇 가지 중복이 있지만 이해하기 쉽습니다 (필자의 경우). 좀 더 일반적인 방법으로 단순화하는 방법이 있을지, 가독성을 해치지 않습니까?

+0

배열이어야합니까? 배열이 아닌 변경 가능 세트를 사용하면 기본 addObject 메소드가 사용자 정의 클래스의 isEqual을 오버라이드하여 적절한 문자열 특성을 비교할 때 필요한만큼 제공합니다. – mbehan

답변

3

은 더 일반적 없지만, 여기에 몇 가지 일반적인 규칙은 다음과 같습니다

  • 때로는 때로는하지, 다음과 같은 코드를 결합하는 의미가 있습니다. 많은 플러스/마이너스.
  • 경우에 따라 작업의 일부를 추상화하고 다른 부분을 사용자 정의하는 것이 가장 좋습니다.
  • 일반적으로 "if thingA then then else that"논리를 사용하면 잘못했거나 전혀 수행하지 않아야합니다.
  • 단일 루틴을 작성하고 여러 가지 경우를 구별하기 위해 단순히 부울 스위치가 아닌 다른 매개 변수를 전달할 때 가장 좋습니다.
  • 어렵습니다.

그리고 일반적으로 거의 동일한 논리의 세 번째 인스턴스가 있기 전까지는 추상화하기가 너무 어렵습니다.

(일반적으로 말하기)

관련 문제