2015-06-27 182 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