2012-04-14 2 views
1

Я рассматриваю этот шаблон проектирования для простой IOS игры в крестики-нолики:Базовый шаблон дизайна в простых играх

  • GameState синглтон класс, который отслеживает местоположения X и O на плате
  • GameDisplay singleton класс, который обрабатывает отображение платы и события касания

Это разделение состояния и дисплея кажется разумным imo. GameDisplay может пересылать ответвления на доске до GameState, где плата обновляется, и условия победы проверяются. GameState может в свою очередь рассказать GameDisplay, чтобы нарисовать еще один X/O или что игра завершена и кто победитель. Мой текущий план заключается в использовании методов, таких как GameState.playAtSquare(Square s), для связи между двумя синглтонами.

Является ли этот дизайн жертвой каких-либо серьезных недостатков использования синглетов? iirc есть некоторые разногласия по поводу использования одноэлементных классов.

ответ

1

Я утверждаю, что вы должны не использовать Singleton в этом случае.

Используйте объект для представления GameState (или Game), так как он позволяет разрешать (например) несколько игр одновременно.

GameDisplay должен быть single instance object, which is different than a Singleton. Объект GameDisplay должен быть передан к способам, в которых нуждается его через Dependency Injection.

1

По-прежнему будут возникать зависимости и потенциальные проблемы с потоками (если вы не примете превентивных мер).

В большинстве случаев синглтон можно избежать, и в этом случае это может быть также. Вместо этого, что вы не передаете ссылку на GameState и GameDisplay? Вместо того, чтобы быть одним синглом и жить на протяжении всей жизни приложения, вы можете иметь два класса, содержащихся в чем-то вроде класса GameApplication.

Если вы это сделаете, то избегайте GameState и GameDisplay от того, чтобы быть одиночными, поскольку они не обязательно должны быть едиными.

Для примера управления игровыми состояниями без одиночных игр см. Gamestate management without evil Singletons.

+0

Вы не объясняете, почему Синглтоны являются злыми. Пожалуйста, см.: Http://www.slideshare.net/kktv/how-is-a-paradigm-created –

+1

Это потому, что я предполагаю, что плакат знает, как зол одного сингла, который, если он помогает избежать этого. – josephthomas

1

Недостатки синглтонов в любом месте такие же, как недостаток глобальных переменных; то есть некоторый объект в вашей программе, который имеет состояние, напрямую доступен и модифицируется из любой точки вашей программы.

Что означает ваш дизайн, так это то, что вы строите жесткость в своей программе, сделав смелое предположение, что вы никогда не сможете использовать другой вид GameState или другой вид GameDisplay, потому что остальная часть вашей программы, скорее всего, быть зависимыми от существования этих синглетонов.

Проблемы часто возникают из-за этой ситуации после того, как синглтон был «сварит» в программу - любые последующие изменения в GameState и GameDisplay могут иметь непреднамеренные эффекты детонации для остальной части вашей программы и найти «обходные пути» для ограничения или прекратить действие этих изменений, может привести к уродливым/взломанным решениям в другом месте вашего кода.

Существует почти всегда предпочтительная альтернатива синглонам. В то время как некоторые люди испытывают соблазн от одиночных игр, потому что это связано с «небольшим сокращением набора текста», как только ваша программа начинает немного расти, она почти всегда оказывается источником ненужной сложности, особых случаев и причуд.

Смежные вопросы