Objective c 我应该将托管对象上下文作为参数包含到方法中吗?

Objective c 我应该将托管对象上下文作为参数包含到方法中吗?,objective-c,cocoa,methods,coding-style,Objective C,Cocoa,Methods,Coding Style,问题 在处理核心数据时,我将托管对象上下文作为方法的参数 虽然这使得代码更容易测试,但它很混乱 问题 这是好的还是坏的做法 有没有一种更简洁、更简单的方法来保持方法的可测试性 背景 下面的示例是一个具有自己上下文的后台操作 任何来自更有经验的程序员的建议都将不胜感激 代码 @interface JGTrainingGroupCleanupOperation : JGCoreDataOperation { NSManagedObjectContext *imoc; } ... @

问题

在处理核心数据时,我将托管对象上下文作为方法的参数

虽然这使得代码更容易测试,但它很混乱

问题

  • 这是好的还是坏的做法
  • 有没有一种更简洁、更简单的方法来保持方法的可测试性
背景

下面的示例是一个具有自己上下文的后台操作

任何来自更有经验的程序员的建议都将不胜感激

代码

@interface JGTrainingGroupCleanupOperation : JGCoreDataOperation {
    NSManagedObjectContext  *imoc;
}

...

@implementation JGTrainingGroupCleanupOperation

-(void)main {
    [self startOperation];                    // Setting up the local context etc
    [self cleanupTrainingGroupsInMOC:imoc];   
    [self finishOperation];
}

-(void)cleanupTrainingGroupsInMOC:(NSManagedObjectContext *)moc {
    NSSet *trainedGroups = [self fetchAllTrainedGroupsInMOC:moc];

    [self deleteDescendantsOfGroups:trainedGroups fromMOC:moc];
    [self removeStubAncestorsOfGroups:trainedGroups fromMOC:moc];    
}

-(NSSet *)fetchAllTrainedGroupsInMOC:(NSManagedObjectContext *)moc_ {
    return [moc_ fetchObjectsForEntityName:kTrainingGroup withPredicate:[NSPredicate predicateWithFormat:@"projectEditedAtTopLevel == nil"]];
}

-(void)deleteDescendantsOfGroups:(NSSet *)trainedGroups fromMOC:(NSManagedObjectContext *)moc_ {
    // More code here
}

-(void)deleteDescendantsOfGroup:(JGTrainingGroup *)trainedGroup fromMOC:(NSManagedObjectContext *)moc_ {
    // More code here
}
在我看来(不是那么谦虚),这主要是风格的问题。您可以这样做,也可以
@合成
主运行中心并调用
[self-moc]
self.moc

我?我个人会选择访问器路径,主要是因为不必告诉类成员在哪里可以找到iVar取消引用的对象。如果要访问同一类中的iVar,我会直接使用iVar或访问器


我相信性能上的差异可以忽略不计,所以我不会在这方面花费太多精力(即使你没有问)

正如所有好的答案一样,事后看来,这是显而易见的。当然,这是做这件事的方法。真不敢相信我竟然没有想到这一点。非常感谢你的帮助!