Лучший вариант для управления классами модулей - PullRequest
6 голосов
/ 30 июля 2011

Моя игровая база состоит из серии модулей, организованных в виде классов, которые создаются, обновляются и взаимодействуют по мере необходимости.

Вот несколько примеров: CWindowManager, CGraphicsManager, CPhysicsManagerи т. д.

Мне стыдно сказать, что в настоящее время я использую для них глобальные указатели (extern CWindowManager* g_WindowManager;), и я знаю, что это, вероятно, плохая вещь.

В любом случае, дело в том, что эти модули нужно создавать и удалять динамически, и, конечно, в правильном порядке.Также проблема в том, что такие модули, как CPhysicsManager, зависят от сцены, поэтому они удаляются при переключении сцены, а затем снова создаются.

Теперь я бы хотел отказаться от использования глобальных переменных.для работы с модулями в моей игре.

Я не боюсь рефакторинга, но я не могу думать о том, что было бы лучшей альтернативой глобалам.

IЯ думал о создании класса CModuleManager и сохранении экземпляров модулей в нем как членов, которые затем являются производными от базового класса CModule.Хотя я не могу придумать, как это будет работать в деталях.

Кажется, это общая проблема в разработке программного обеспечения и особенно в разработке игр, поэтому:

- Что такоелучший вариант для управления модулями, по сравнению с простым использованием глобальных указателей?

1 Ответ

1 голос
/ 22 августа 2011

Некоторые вещи, которые следует учитывать при использовании глобальных данных:

  • многопоточность.Вы должны быть осторожны, если к глобальным данным могут обращаться разные потоки одновременно.
  • тестируемость.Если вы пишете модульные тесты, то глобальные данные должны быть инициализированы, прежде чем какой-либо код получит доступ к глобальным данным.

Альтернативой использованию глобальных данных является передача экземпляров объекта, которые требуются каждому классу / методу в качестве параметра.Преимущество этого заключается в том, что все зависимости класса явно из API.Это также значительно облегчает написание юнит-тестов.Недостатком является то, что код может запутаться, если вы передаете объекты повсюду.

Ваша идея иметь ModuleManager звучит как шаблон Service Locator - что, я думаю, является возможным решением.Эта ссылка может помочь: http://gameprogrammingpatterns.com/service-locator.html.

Если вы решите продолжать использовать глобальные указатели, то динамическое удаление глобальных данных может быть достигнуто в C ++ с помощью интеллектуальных указателей (auto_ptr).

...