Chaque fois que je songe à sécuriser fortement mon code, je justifie de ne pas le faire car cela prendrait tellement de temps. Considérez cet extrait relativement simple:
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;
Pour implémenter une garantie d'exception de base, je pourrais utiliser un pointeur de portée sur les new
appels. Cela empêcherait les fuites de mémoire si l'un des appels levait une exception.
Cependant, disons que je veux implémenter une garantie d'exception forte. Au moins, j'aurais besoin d'implémenter un pointeur partagé pour mes conteneurs (je n'utilise pas Boost), un nothrow Entity::Swap
pour ajouter les composants atomiquement et une sorte d'idiome pour ajouter atomiquement à la fois à Vector
et Map
. Non seulement leur mise en œuvre prendrait beaucoup de temps, mais elle serait coûteuse car elle implique beaucoup plus de copies que la solution d'exception non sûre.
En fin de compte, il me semble que le temps passé à faire tout cela ne serait pas justifié juste pour que la CreateEntity
fonction a simple soit fortement protégée contre les exceptions. Je veux probablement juste que le jeu affiche une erreur et se ferme à ce point de toute façon.
Jusqu'où prenez-vous cela dans vos propres projets de jeu? Est-il généralement acceptable d'écrire du code d'exception non sûr pour un programme qui peut simplement se bloquer en cas d'exception?