Это приемлемый дизайн программного обеспечения?

В настоящее время я работаю над игрой на C ++. поскольку нет сборщика мусора, всегда нужно тщательно удалять объекты, а также следить за тем, чтобы к таким объектам больше не обращались после их удаления.
Теперь по мере роста проекта на некоторые объекты могут ссылаться все больше и больше мест. Например, на мои юниты в игре могут ссылаться рендерер, иерархия сцены, механизм выбора, HUD и так далее. сейчас - если объект будет удален, необходимо убедиться, что все другие классы, которые ссылаются на этот объект, будут уведомлены об этом.
Или скажем иначе: если я создам новый класс, который может ссылаться на один из моих модулей, мне также придется изменить код модуля (или диспетчера модулей, или любого другого модуля, удаляющего модуль, если он получает уничтожен), чтобы этот новый модуль знал, когда конкретный модуль, на который он ссылается, будет удален.

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

class DeletableBase;//forward declaration

class ISubscriber{
public:
    virtual someObjectGotDeleted(DeletableBase* deletedObject)=0;
};

class DeletableBase{
private:
    vector<ISubscriber*> subscribers;
public:
    virtual ~DeletableBase(){
        for(int i=0; i<subscribers.size(); i++)
            subscribers[i]->someObjectGotDeleted(this);
    }
    subscribeForDeleteEvent(ISubscriber* subscriber){
        subscribers.push_back(subscriber);
    }
};

с этим - если я буду ссылаться на какой-либо объект, который наследуется от этого класса из нового класса, я могу просто добавить себя в качестве подписчика, и если объект будет удален из любого другого места, я получу уведомление об этом.

это "чистый" способ кодирования?

5
задан Stormenet 2 February 2011 в 14:58
поделиться