在我正在编程的游戏中,我为游戏中的所有实体使用复合对象。实体由组件对象组成,这些组件对象定义了小块功能,例如健康或运动。
我的问题是:
是否可以从组件发布通知,但将其父实体引用为发送通知的对象?
我很想这样做,因为向实体添加观察者更容易,而不是在实体中找到正确的组件。
有人告诉我,您永远不应该为另一个对象发布通知。
优缺点都有什么?
在我正在编程的游戏中,我为游戏中的所有实体使用复合对象。实体由组件对象组成,这些组件对象定义了小块功能,例如健康或运动。
我的问题是:
是否可以从组件发布通知,但将其父实体引用为发送通知的对象?
我很想这样做,因为向实体添加观察者更容易,而不是在实体中找到正确的组件。
有人告诉我,您永远不应该为另一个对象发布通知。
优缺点都有什么?
通常你认为通知是“来自”一个对象。因此,如果您正在调试并且想要查找通知的来源,您可以在该对象本身中查找代码。
违反这种期望并不违法,但是当他们不得不更加努力地寻找通知的真正来源时,它可能会让某人有点诅咒你。
此外,如果您有很多单独的组件都发布通知,那么如果您想更改通知(例如,其中的 userInfo),重构代码会变得更加困难。
如果您可以保证您的组件始终具有指向其父级的有效指针,那么最好的解决方案是让组件要求其父级发布通知:
@implementation ComponentA
- (void)someMethod
{
[self.parent pleasePostSomethingChangedNotification];
}
@end
@implementation Parent
- (void)pleasePostSomethingChangedNotification
{
// Parent may post the notification immediately,
// or may selectively post the notification based on some other condition,
// or post it later on after coalescing changes from several components,
// or ...
}
@end