1

私は Web サービス用の iOS クライアントで作業しています。Json API からデータを取得し、それを解析して CoreData に保存します。主にオブジェクトを解析して保存する方法に重複があります。1つの例は、2つのコントローラーでほぼ同じユーザーを作成する方法です(おそらく将来的には増えるでしょう):

- (User *)createUserFromDict:(NSDictionary *)dictionary
{

    User *user;

    NSNumberFormatter *numberFormatter= [[NSNumberFormatter alloc] init];
    NSNumber * userId = [numberFormatter numberFromString:(NSString *)[dictionary valueForKey:@"id"]];
    NSEntityDescription *userDescription = [NSEntityDescription entityForName:@"User" inManagedObjectContext:[appController managedObjectContext]];
    NSEntityDescription *imageDescription = [NSEntityDescription entityForName:@"Image" inManagedObjectContext:[appController managedObjectContext]];

    user = [[User alloc] initWithEntity:userDescription insertIntoManagedObjectContext:[appController managedObjectContext]];
    user.name = [dictionary valueForKey:@"name"];
    [...]

    Image *userAvatrar = [[Image alloc] initWithEntity:imageDescription    insertIntoManagedObjectContext:[appController managedObjectContext]];
    userAvatrar.url = [dictionary valueForKeyPath:@"avatar_image.url"];
    [...]
    NSError *error;
    [[appController managedObjectContext] save:&error];

    return user;
}  

この複製が必要なのか、それともより良い方法があるのか​​ はわかりません。「cacheManager」コントローラー クラスを作成し、このようなメソッドをここに格納するか、モデルに配置することを考えています。それを行うための最良/正しい方法はどれですか?

4

2 に答える 2

3

DRY - Don't Repeat Yourself の原則は、コードを節約するだけでなく、さらに重要なことに、複数ではなく 1 か所でメンテナンスできるようにします。

単一責任の原則では、各ユニット (クラス/メソッド) は 1 つのことだけを行うべきであると述べています。

したがって、重複したコードを削除します。

クラスかメソッドかは、キャッシングがどの程度関与しているか、および将来のニーズに依存します。理にかなっている場合は、メソッドをゆっくり使用して、後でクラスにリファクタリングできます。

それを使用する 2 つのコントローラーが別々のクラスである場合、おそらく新しいクラスが進むべき道のようです。

また、適切な命名規則を使用すると、コードが理解しやすくなります。

于 2013-01-01T17:20:14.153 に答える
2

最善の方法は、それを User オブジェクトのクラス メソッドにすることです。

+ (User *)insertUserFromDictionary:(NSDictionary *)dictionary inManagedObjectContext: (NSManagedObjectContext*) moc
{

    User *user = nil;

    NSNumberFormatter *numberFormatter= [[NSNumberFormatter alloc] init];
    NSNumber * userId = [numberFormatter numberFromString:(NSString *)[dictionary valueForKey:@"id"]];
       NSEntityDescription *userDescription = [NSEntityDescription entityForName:@"User" inManagedObjectContext: moc];
    NSEntityDescription *imageDescription = [NSEntityDescription entityForName:@"Image" inManagedObjectContext: moc];

    user = [[User alloc] initWithEntity:userDescription insertIntoManagedObjectContext:moc];
    user.name = [dictionary valueForKey:@"name"];
    [...]

    Image *userAvatrar = [[Image alloc] initWithEntity:imageDescription    insertIntoManagedObjectContext: moc];
    userAvatrar.url = [dictionary valueForKeyPath:@"avatar_image.url"];
    [...]
    NSError *error;
    [moc save:&error];

    return user;
}  

もちろん、次のように呼び出します。

User *newUser = [User insertUserFromDictionary: userDictionary inManagedObjectContext: appcontroller.managedObjectContext];

また、コンテキストの保存操作をこのクラス メソッドの外に移動し、ユーザーが挿入された後に "自分で" 呼び出すことも検討してください。これはここでは行っていません。

于 2013-01-01T17:19:17.037 に答える