Objective-c Refactoring,代码在哪里?

时间:2013-01-01 17:12:48

标签: objective-c ios core-data refactoring

我正在开发一个用于Web服务的iOS客户端,我从Json API获取数据,我将其解析并保存到CoreData中。我有一些重复,主要是我如何解析和保存对象。一个例子是创建用户的方法,这种方法在两个控制器中几乎完全相同(将来可能更多):

- (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”控制器类并在这里存储这样的方法,或者将它放在我的模型中。这是最好/最正确的方法吗?

2 个答案:

答案 0 :(得分:3)

DRY - 不要重复自己的原则不仅可以节省代码,更重要的是可以在一个地方而不是几个地方进行维护。

单一责任原则规定每个单位(类/方法)应该只做一件事。

因此消除了重复的代码。

类或方法取决于缓存和未来需求的相关程度。如果有意义的话,你可以慢慢使用一个方法然后重构为一个类。

如果使用它的两个控制器是单独的类,似乎新的类可能是继续进行的方式。

如果给出良好的命名约定,这也将使代码更容易理解。

答案 1 :(得分: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];

考虑将上下文的保存操作移出此类方法,并在插入用户后“自己”调用它,我在这里没有这样做。