【问题标题】:Objective-c Refactoring, where does the code belong?Objective-c 重构,代码属于哪里?
【发布时间】:2013-01-01 17:12:48
【问题描述】:

我正在开发一个用于 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”控制器类并在此处存储这样的方法,或者将其放入我的模型中。哪种方法是最好/正确的方法?

【问题讨论】:

    标签: objective-c ios core-data refactoring


    【解决方案1】:

    DRY - Don't Repeat Yourself 原则不仅可以节省代码,更重要的是允许在一个地方而不是多个地方进行维护。

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

    从而消除重复代码。

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

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

    鉴于良好的命名约定,这也将使代码更易于遵循。

    【讨论】:

      【解决方案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];
      

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

      【讨论】:

      • 把它放在一个类别中怎么样?
      • 类方法通常没有被使用,但它的好处是清楚地表明没有实例变量的副作用。
      • @KevinM 类别通常不是一个好的选择。现在创建一个类不需要太多样板。
      • 我假设 OP 可以访问 User 类(我猜他可以),所以我提出了一个类方法。如果 OP 无法修改 User 类,则可以选择类别。
      猜你喜欢
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 2011-08-02
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多