深层嵌套函数调用或事件的替代方法

时间:2013-07-12 14:02:05

标签: actionscript-3 design-patterns communication

我在多个项目中反复遇到过这个问题: 我最终得到了需要与该结构外部的对象进行通信的对象(嵌套在一个结构中)。

目前我有Game类实例化Hud和ObjectsList类 Hud实例化各种抬头显示面板,它们自己实例化包含可见TextFields的较小部分 ObjectsList实例化各种游戏对象,包括Player类 为了让玩家与特定的Hud面板进行通信,我目前需要触发一系列自定义事件直到Game,然后让游戏调用Hud上的方法,该方法在相应的Hud面板上调用该方法。
这似乎相当笨拙和低效。 我可以通过玩家对Hud的引用,因为可以说玩家'有'作为'Hud。但紧密耦合是什么?而且,鉴于我不希望在其他地方重用此代码,这有关系吗? 我还可以使用观察者模式并注册Hud面板来监听来自Player的更新,但是当玩家和hud面板都无法立即访问Game时,这会被管理到哪里?
或者,所有的实例都应该在Game中发生,然后结构'组成'?

我很想知道是否有一些我不理解的东西会使这些看似笨重的嵌套结构发生,或者它们只是必要的副产品。
如果我建议的结构有任何根本性的错误,我会很高兴知道实际的替代方案是什么(最好是用非语言的语言,因为我是一名自学编码器)。
欢呼声。

1 个答案:

答案 0 :(得分:0)

假设玩家收集了一些硬币,您需要更新HUD中的某些内容以反映硬币的数量。

你无法逃避这是一个特定问题的事实,除非你花费大量时间开发一个动态的哥特式解决方案来解决你所有的沟通问题并制作早餐,否则这个逻辑将无法完全重复使用。

但是你可以做的是,使用许多不同的OO模式(组合等)尽可能地从可重用的类(即:PlayerHudLabel)中分离出这个逻辑。

我对此问题的个人主观解决方案是在Player类中使用基本通用逻辑,并使用类CoinGamePlayer之类的子类扩展它,其中所有项目特定逻辑驻留。然后使用组合引用中央通信器类。这也适用于GoldCoinHudLabel

作为旁注,请看一下Signals框架。到目前为止,AS3项目的最佳事件解决方案:

https://github.com/robertpenner/as3-signals

http://www.developria.com/2010/10/an-introduction-to-as3-signals.html