Toda vez que considero tornar meu código uma exceção fortemente segura, justifico não fazê-lo, pois isso consumiria muito tempo. Considere este trecho relativamente simples:
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;
Para implementar uma garantia básica de exceção, eu poderia usar um ponteiro com escopo definido nas new
chamadas. Isso impediria vazamentos de memória se alguma das chamadas lançasse uma exceção.
No entanto, digamos que eu queira implementar uma forte garantia de exceção. No mínimo, eu precisaria implementar um ponteiro compartilhado para meus contêineres (não estou usando o Boost), uma janela Entity::Swap
para adicionar os componentes atomicamente e algum tipo de idioma para adicionar atomicamente ao Vector
e Map
. Isso não apenas levaria tempo para implementar, mas também seria caro, pois envolve muito mais cópia do que a solução insegura da exceção.
Por fim, parece-me que o tempo gasto fazendo tudo isso não seria justificado apenas para que a CreateEntity
função simples seja fortemente segura contra exceções. Eu provavelmente só quero que o jogo mostre um erro e feche nesse ponto de qualquer maneira.
Até onde você leva isso em seus próprios projetos de jogos? É geralmente aceitável escrever um código não seguro de exceção para um programa que pode travar quando há uma exceção?