Actualmente estoy trabajando en un juego en C++. dado que no hay un recolector de basura, uno siempre tiene que eliminar cuidadosamente los objetos y también asegurarse de que ya no se acceda a esos objetos una vez que se eliminaron.
Ahora, a medida que crece un proyecto, algunos objetos pueden obtener referencias de más y más lugares. Por ejemplo, mis unidades en el juego pueden ser referenciadas desde el renderizador, desde la jerarquía de escenas, desde el mecanismo de selección, desde el HUD, y así sucesivamente. ahora: si un objeto se elimina, uno debe asegurarse de que todas las demás clases que hacen referencia a este objeto recibirán una notificación al respecto.
O, por decirlo de otra manera: si creo una clase nueva que pueda hacer referencia a una de mis unidades, también tendré que cambiar el código de la unidad (o del administrador de la unidad o cualquier módulo que la elimine) se destruye) para asegurarse de que este nuevo módulo sepa cuándo se elimina la unidad en particular a la que hace referencia actualmente.¿es este un diseño de software aceptable?
Ahora creo que podría haber un enfoque de propósito general impulsado por eventos simples para resolver este problema mediante la creación de una clase base a la que otro objeto puede suscribirse. Algo como esto:
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);
}
};
con que - si hacer referencia a cualquier objeto que hereda de esta clase de una nueva clase i simplemente puedo añadir mi mismo como abonado y si el objeto se eliminará de cualquier otro lugar voy a conseguir notificaron al respecto.
¿Es esta una forma "limpia" de codificación?
Pertenece a http://codereview.stackexchange.com/. Sin embargo, tampoco quiero cerrar esto como 'Fuera del tema'. :/ –
Estoy de acuerdo; la pantalla de cierre necesita una opción para migrar a sitios que no sean los pocos que figuran en la lista. (¡Fuera de Meta!) –
Diría que pertenece a programmers.SE, no a la revisión del código. Creo que quien tuvo la brillante idea de tener 4 sitios de programación (en lugar de uno, que era bueno y autónomo) debería avergonzarse. –