0

如何为以下(目标 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 方法,使用了包含每个 Artist 对象的 NSMutableArray 实例变量 _artists。

这两种方法都通过将输入对象的文本属性与数组中的文本属性进行比较,将对象插入到 NSMutableArray 中。

目前上述方法包含一些重复但很容易理解(在我的例子中)。我在想是否有办法将其简化为更通用的方法,并且不会损害可读性?

4

1 回答 1

3

没有一般规则,但这里有一些一般规则:

  • 有时像这样组合代码是有意义的,有时则不然。很多优点/缺点。
  • 有时最好将操作的一部分抽象出来,而让另一部分自定义。
  • 一般来说,如果你有很多“如果事情A那么做这个,否则做那个”的逻辑,你做错了(或者根本不应该做)。
  • 当您可以编写一个例程并只传递不同的参数(不仅仅是布尔开关)来区分多种情况时,这是最好的。
  • 这个很难(硬。

而且,作为一般规则,在我有几乎相同逻辑的第三个实例之前,我不会太努力地抽象。

(通常来说,一般来说。)

于 2013-03-27T15:13:51.527 回答