Избегайте статических классов и переменных



Избегайте статических классов и переменных

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

Статические переменные подобны глобальным, так как они доступны из большинства классов, но одновременно может существовать только один экземпляр такой переменной. Существует несколько классов, таких как ClassOperatingSystem, ClassGameSound и ClassFileSystem, которые действительно подразумевают наличие единственного экземпляра класса. Некоторые другие классы выглядят так, будто для них тоже должен существовать только один экземпляр, хотя иногда допускается наличие и нескольких экземпляров. Классический пример подобного статического класса - ClassGameWorld:

class ClassGameWorld
{
public:

// статические данные игрового мира
static void* m_GameWorldData;


// статические компоненты-функции
static bool Install(void);
static bool Remove(void);
static bool AddObject(GameObject& _obj);

};



После определения класса программист мог использовать функцию World::AddObject() в любом месте в своих модулях, что удобно, но позволяет работать только с одним игровым миром. Если в дальнейшем замысел игры изменится и потребуется наличие многих игровых миров (например в случае большой сетевой игры), придется кардинально переписывать весь код игры.

Более правильным решением будет создать нестатическую версию класса ClassGameWorld, а затем завести статический шаблон списка игровых миров где-нибудь еще, например в классе ClassGame:

class ClassGame
{
private:

static TemplateList<ClassGameWorld*> m_GameWorldList;

public:

static ClassGameWorld& GetWorld(int _nWorld);

};

Это позволит программе иметь доступ ко многим экземплярам данного класса и в то же время сохранить только одно место для доступа ко всем данным игровых миров.

В главе 3 приведены общие советы Аллена Джексона по разработке игр.



Содержание Назад Вперед