Ogni volta che penso di rendere il mio codice fortemente sicuro, giuro di non farlo perché richiederebbe così tanto tempo. Considera questo frammento relativamente semplice:
Level::Entity* entity = new Level::Entity();
entity->id = GetNextId();
entity->AddComponent(new Component::Position(x, y));
entity->AddComponent(new Component::Movement());
entity->AddComponent(new Component::Render());
allEntities.push_back(entity); // std::vector
entityById[entity->id] = entity; // std::map
return entity;
Per implementare una garanzia di eccezione di base, ho potuto utilizzare un puntatore con ambito sulle new
chiamate. Ciò impedirebbe perdite di memoria se una delle chiamate generasse un'eccezione.
Tuttavia, diciamo che voglio implementare una forte garanzia di eccezione. Almeno, avrei bisogno di implementare un puntatore condiviso per i miei contenitori (non sto usando Boost), un nothrow Entity::Swap
per aggiungere atomicamente i componenti e una sorta di linguaggio per aggiungere atomicamente sia a Vector
che a Map
. Questi non solo richiederebbero molto tempo per essere implementati, ma sarebbero costosi poiché comportano una copia molto maggiore rispetto all'eccezionale soluzione non sicura.
In definitiva, mi sembra che il tempo trascorso a fare tutto ciò non sia giustificato solo perché una semplice CreateEntity
funzione è fortemente sicura dalle eccezioni. Probabilmente voglio solo che il gioco mostri un errore e chiuda comunque a quel punto.
Quanto lontano lo porti nei tuoi progetti di gioco? È generalmente accettabile scrivere un codice non sicuro di eccezione per un programma che può bloccarsi in caso di eccezione?