2015-06-27 131 views
1

我很努力的设计模式,并希望按照最佳做法,同时重写我的当前应用程序从Objective-C到Swift。iOS设计模式实现

我有一个游戏,玩家获得额外的分数/或特殊奖品,比如说,解决一定数量的关卡。有几个里程碑要达成(例如完成10个等级/完成50个等级)。我有不同的游戏模式,所以我有几个Gameplay类的子类。每轮玩家调用-checkSolution以检查玩家是否解决了关卡。如果成功,我会增加玩家的游戏分数并将他发送到新的级别。在这里,我还呼叫ScoreManager类的-checkForMilestone来检查是否已达到任何里程碑。

我不确定在-checkSolution以内是否可以拨打-checkForMilestone。或者使用块创建回调或使用KVO观察(从ScoreManager类)是否玩家的得分发生了变化,然后做出适当反应可能会更好。

回答

0

我会保持简单。您可以使用KVO,事件或其他方法,但从您的描述中我看不到任何好处,但增加了代码的复杂性并使得更难调试。如果您已经在调用checkSolution(),并且您知道这是唯一会触发里程碑更改的地方,那么您应该将这两种方法紧密结合在一起。另一方面,如果里程碑可以与成功的解决方案分离开来,例如玩家通过小额支付购买里程碑,或者通过朋友捐款增加玩家的里程碑,那么您可以在分数上创建可观察的模式,或者触发事物更新。

+0

谢谢。我想我应该跟Observer一起去。我只是意识到把我的视图控制器变成未来的视图控制器:) – autobot

0

首先,即使考虑到这一点,对你也很好。决定中涉及的关键概念是“责任范围”和“关注点分离”。

可以容易确定通过考虑更好的选择:

  1. 什么事件可能引发的里程碑被达到?
  2. 这个行为是由哪一类人负责的?
  3. 里程碑是否可以与解决的水平分开实现?
+0

好吧,回答上面的问题,我会说: 1.对于游戏模式,它是“解决一个关卡”。对于另一种游戏模式,它是“产生一定数量的正确答案”。因此,2种略有不同的Gameplay类子类的两种不同方法可以触发正在达成的里程碑。 2. Gameplay子类负责'-checkSolution',ScoreManager类负责计算总分并检查是否已达到里程碑。 3.是的。请参阅答案1. – autobot

+0

我熟悉SRP术语,无论如何,很难提出最佳解决方案。我不会打扰自己在例如PHP,但是在iOS中,我可以看到很多甜蜜的东西,我可以使用它们而不是仅仅调用另一个类实例的方法:) – autobot

+0

以另一种方式思考它,“谁知道可能影响里程碑的变化和他们什么时候知道的?“ – picciano