班级等级 - 谁应该与谁交谈?

时间:2012-08-12 12:46:01

标签: objective-c ios xcode cocos2d-iphone

我正在开发一个整合了核心数据的游戏项目,我想让代码尽可能模块化。

现在我的核心数据“层次结构”链看起来像这样:

核心数据实体 - > SaveGame类 - > GameLogic类 - >接收器

SaveGame类处理与Core Data相关的所有内容,例如managedObjectContext,各种实体,保存和覆盖操作等。

GameLogic课程涉及游戏机制,并使用从核心数据传递的数据做一些事情,例如计算收入,当前金额,处理级别变化等。

我对这种设置不满意,原因之一是:如果接收方(例如HUD)要求核心数据提供数据,则必须通过该链传递数据,从而产生大量单行几乎什么都没做,像这样:

+(NSArray *)passCoreDataInfo
{
return [CoreDataEntity fetchCoreDataEntityInfo] // ExecuteFetchRequest
}

然后将在层次结构中较低的类中使用,如下所示:

+(NSArray *)passCoreDataInfoAgain
{
return [HigherClass passCoreDataInfo]
}

直到链子的某个地方,我的Receiver用它做了一些有用的事情:

(...)
NSArray *coreDataInfo = [SomeClass passCoreDataInfoYetAgain];
(...)

这可能会浪费大量的内存和处理能力,但我也不想屈服于可怕的“每个人都在和每个人交谈”模式。

你们可以给我一些关于如何更好地设置层次结构的提示,并绕过这个传递相同的数据吗?

2 个答案:

答案 0 :(得分:0)

为什么不让Receiver订阅从CoreDataEntities发送的(通用)消息?与其说是“每个人都在与每个人交谈”模式,而不是“每个人都可以关注那些他们感兴趣的人的推文”模型。

答案 1 :(得分:0)

为什么不创建共享实例,就像[CCDirector sharedDirector][CCSpriteFrameCache sharedSpriteFrameCache][CCTextureCache sharedTextureCache][SimpleAudioEngine sharedEngine]等?

只需将其命名为[CoreDataEntity sharedEntity]或其他内容:

static CoreDataEntity *instanceOfCoreDataEntity = nil;

@implementation CoreDataEntity

+ (CoreDataEntity *)sharedEntity {
    if (!instanceOfCoreDataEntity) {
        instanceOfCoreDataEntity = [[CoreDataEntity alloc] initWithSomething:@"something"];
    }
    return instanceOfCoreDataEntity;
}

....

然后你可以在任何地方使用它:

NSArray *coreDataInfo = [[CoreDataEntity sharedEntity] passCoreDataInfo];