2015-06-27 11 views
1

Я борюсь с шаблонами дизайна и хотел бы следовать лучшим практикам при переписывании моего текущего приложения с Objective-C на Swift.iOS Design Pattern Implementation

У меня есть игра, в которой игрок получает дополнительные баллы/специальные призы за, скажем, решение определенного количества уровней. Достигнуты несколько этапов (например, 10 уровней завершены/50 уровней завершены). У меня разные режимы игры, поэтому у меня есть несколько подклассов класса Gameplay. После поворота каждого игрока -checkSolution вызывается, чтобы проверить, решил ли игрок уровень. В случае успеха я увеличиваю игровой счет игрока и отправляю его на новый уровень. И здесь я также вызываю -checkForMilestone класса ScoreManager, чтобы проверить, достигнут ли какой-либо из этапов.

Я не уверен, можно ли позвонить -checkForMilestone внутри -checkSolution. Или было бы лучше создать обратный вызов с использованием блоков или использовать KVO для наблюдения (из класса ScoreManager), был ли счет игрока изменен, а затем отреагировать соответствующим образом.

ответ

0

Я бы сохранил все просто. Вы можете использовать KVO, события или другие методы, но из вашего описания я не вижу никакой пользы, но добавляю сложность кода и затрудняет отладку. Если вы уже вызываете checkSolution(), и знаете, что это единственное место, которое вызовет изменение вехи, тогда вы должны держать эти два метода плотно вместе. Если, с другой стороны, этапы могут быть отделены от успешных решений, например, игрок, покупающий их с помощью микроплатежей или вкладов друзей, добавляющих к вехам игрока, тогда вы можете создать наблюдаемый шаблон на счету или что-то другое, чтобы вещи обновлялись.

+0

Спасибо. Думаю, я должен пойти с Наблюдателем. Я просто знаю, что в будущем мой контроллер просмотра будет встроен в массивный контроллер просмотра. – autobot

0

Во-первых, хорошо, что вы даже рассматриваете это. Ключевыми понятиями, принимаемыми в решении, являются «объем ответственности» и «разделение проблем».

Вы, вероятно, может определить лучший вариант, рассматривая:

  1. Какие события могут спровоцировать веху быть достигнуто?
  2. Какой класс несет ответственность за это действие?
  3. Могла ли веха быть достигнута отдельно от уровня, который решается?
+0

Хорошо, отвечая на вышеперечисленные вопросы, я бы сказал: 1. Для игровых режимов это «решение уровня». Для другого игрового режима это «выработка определенного количества правильных ответов». Таким образом, 2 разных метода из 2 слегка разных подклассов класса Gameplay могут вызвать достижение вехой. 2. Подкласс класса Gameplay отвечает за '-checkSolution', а класс ScoreManager отвечает за общий расчет счета и проверку того, была ли достигнута этап. 3. Да. См. Ответ 1. – autobot

+0

Я знаком с термином SRP, в любом случае трудно найти лучшее решение. Я бы не стал думать о таких вещах, например. PHP, но здесь, в iOS, я вижу широкий спектр сладких вещей, которые я мог бы использовать вместо того, чтобы просто призывать методы другого экземпляра класса, когда захочу :) – autobot

+0

Думая об этом по-другому, «кто знает об изменениях, которые могут повлиять на веху и когда они это знают? – picciano