Правильно ли я использую синглтон? (iOS-игра отсутствует) - PullRequest
0 голосов
/ 05 октября 2011

Я только начал пользоваться синглетами, и я просто хочу оценить, правильно ли я его использую. Я читал, что синглтоны - это зло. Я только начал с игры, поэтому такие вещи, как модульное тестирование и многопоточность, еще не достигли меня.

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

Я правильно поступаю?

Примеры:

  • В традиционной японской SRPG-игре (например, FFTactics) ячейки / сетка для карты тайла имеют свой собственный модуль. Персонаж взаимодействует с синглтоном этого модуля.

  • Все мои спрайты генерируются AssetManager (одноэлементным), который автоматически масштабирует спрайт в зависимости от наличия разрешения и разрешения устройства. Это делается просто путем вызова метода в синглтоне.

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Я определенно не согласен с тем, что одиночки - это зло. Возможно, их иногда используют слишком часто, но в некоторых случаях они идеально подходят для работы. В некоторых приложениях имеет смысл иметь какой-то общий менеджер данных. Шаблон Singleton широко используется в самом SDK (делегаты приложений, общие менеджеры, центры по умолчанию и т. Д.). Чаще всего это не «чистые» синглтоны, так как вы можете получить доступ к общему экземпляру, но также можете создавать новые экземпляры, если это необходимо.

Вопрос, который вам нужно задать себе, состоит в том, было бы полезно иметь доступ к одному экземпляру диспетчера данных из любого места в любое время, а если это не так, то, вероятно, единственная единица не нужна. Однако если вы собираетесь использовать синглтоны в многопоточных средах, вам нужно беспокоиться о состоянии гонки (может ли один поток изменить ресурс, пока другой обращается к нему), в документации есть хорошие объяснения того, как наилучшим образом добиться этого в Какао. ,

0 голосов
/ 05 октября 2011

Вы можете легко сделать это и с экземпляром.

Допустим, у вас есть класс GameMap и класс Tile. GameMap представляет двумерную сетку из Tile объектов. (Это ваш пример FFTactics).

GameMap *gameMap = [[GameMap alloc] init];
NSArray *theTiles = gameMap.tiles;

Экземпляр GameMap владеет сеткой плиток и создает плитки при создании игровой карты. Синглтон не нужен.

Вы можете сказать «но у меня есть только один GameMap за раз, в чем дело?». Как насчет загрузки сохраненных игр или загрузки новых уровней? Ну, это становится так же просто, как:

// In whatever class object owns the game map
self.gameMap = [[GameMap alloc] initWithSaveData:saveData];

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...