0

以下の同様のメソッドをリファクタリングするにはどうすればよいですか (Objective 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 に挿入します。

現在、上記の方法には重複が含まれていますが、理解しやすいです(私の場合)。より一般的な方法に単純化する方法があり、読みやすさを損なわないかどうかを考えていましたか?

4

1 に答える 1

3

一般的なルールはありませんが、いくつかの一般的なルールがあります。

  • このようにコードを組み合わせることが理にかなっている場合もあれば、そうでない場合もあります。プラス/マイナスがたくさん。
  • 場合によっては、操作の一部を抽象化し、他の部分をカスタムのままにしておくのが最善の方法です。
  • 一般に、「thingA の場合はこれを実行し、それ以外の場合はそれを実行する」というロジックがたくさんある場合、それは間違っています (または、まったく実行すべきではありません)。
  • 複数のケースを区別するために、単一のルーチンを作成し、さまざまなパラメーター (単純なブール スイッチではない) を渡すだけでよい場合に最適です。
  • それは難しい。

そして、原則として、ほぼ同じロジックの 3 番目のインスタンスが得られるまで、抽象化しようとはしません。

(一般的に言えば。)

于 2013-03-27T15:13:51.527 に答える