重构目标C的类似方法

时间:2013-03-27 15:08:57

标签: objective-c refactoring nsmutablearray

如何为以下(目标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中,方法是将输入对象的text属性与数组中的text属性进行比较。

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

1 个答案:

答案 0 :(得分:3)

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

  • 有时将这样的代码组合起来是有意义的,有时则不然。很多优缺点。
  • 有时最好抽象部分操作,并将其他部分保留为自定义。
  • 一般来说,如果你有很多“if thingA然后这样做,那么”逻辑,你做错了(或根本不应该这样做)。
  • 最好只编写一个例程并传入不同的参数(不仅仅是布尔开关)来区分多个案例。
  • 很难。

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

(一般来说。)