#swift #oop #singleton #observer-pattern #nsnotificationcenter
#swift #ооп #синглтон #наблюдатель-шаблон #nsnotificationcenter
Вопрос:
Предыстория
Я работаю над игрой для iOS в Swift, в которой есть обновления темы в реальном времени. По сути, это означает, что SKSpriteObjects меняют свой цвет при изменении темы. Поскольку я его реализую, я хотел бы сделать это так, чтобы это было хорошей практикой ООП и хорошо для масштабируемости (множество объектов делают это одновременно). У меня есть две идеи для достижения этой цели:
Метод первый: уведомитель / Наблюдатель синглтон
-Зарегистрируйте все обновляемые SKSpriteObjects в качестве наблюдателей для ключа «updateTheme» -Создайте синглтон с именем GameState с текущими цветами темы -Когда будет запущено уведомление «updateTheme», каждый из наблюдателей получит синглтон для своих новых цветов.
Метод второй: уведомитель / Наблюдатель переданный объект
-Зарегистрируйте все обновляемые SKSpriteObjects в качестве наблюдателей для ключа «updateTheme» — Объект, который запускает уведомление «updateTheme», создаст и присоединит объект к уведомлению, который содержит атрибуты текущей темы. -При появлении уведомления «updateTheme» каждый из наблюдателей развернет объект, а затем получит доступ к обновленным цветам из этого развернутого объекта.
Вопрос
Хотя я думаю, что передача объекта в уведомлении — лучшая практика ООП, я полагаю, что все происходящее разворачивание не будет лучшей идеей для скорости. Итак, с этим я более склонен использовать одноэлементный подход. Что вы думаете? Возможно, есть лучший способ, о котором я не подумал, массово обновлять все объекты в моей игре.
Ответ №1:
Никогда к синглтону.
Или, выражаясь другими словами:
Всякий раз, когда у вас есть два варианта, и один из них включает синглтон, выберите другой вариант.
Моя рекомендация заключалась бы в том, чтобы сначала правильно написать свою игру, а затем посмотреть, страдает ли она с точки зрения производительности, и если и только если это произойдет, тогда беспокоиться о производительности. И что обычно имеет тенденцию происходить, так это то, что вы найдете несколько мест, где вы можете предоставить приятные и аккуратные алгоритмические оптимизации, которые улучшат производительность вашей игры, вместо того, чтобы настраивать и взламывать весь исходный код для экономии тактовых циклов здесь и там.
Как уже было сказано, рассмотрим еще одну альтернативу: обычным шаблоном для наблюдателей событий является передача им в качестве первого параметра ссылки на объект, выдающий уведомление. Итак, почему бы наблюдаемому не передать наблюдателям ссылку на себя, чтобы наблюдатели могли затем получить все, что им нужно, из наблюдаемого?
Комментарии:
1. Я пойду по пути избегания синглтона и вместо этого передам ссылку на объект, который будет содержать любую информацию, необходимую наблюдателям. Спасибо за отзыв!