Кожен раз, коли я вважаю зробити свій код сильним винятком безпечним, я виправдовую, що не роблю цього, оскільки це забирає багато часу. Розглянемо цей відносно простий фрагмент:
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;
Для реалізації основної гарантії винятків я міг би використовувати покажчик масштабу для new
дзвінків. Це дозволить уникнути витоку пам'яті, якщо будь-який з дзвінків повинен бути винятком.
Однак, скажімо, я хочу застосувати чітку гарантію виключення. Принаймні, мені потрібно було б реалізувати спільний покажчик для своїх контейнерів (я не використовую Boost), nothrow Entity::Swap
для додавання компонентів атомарним чином, і якусь ідіому для атомного додавання до Vector
і Map
. Це не тільки забирає багато часу для впровадження, але й коштуватиме дорого, оскільки воно передбачає набагато більше копіювання, ніж небезпечне рішення виключення.
Зрештою, мені здається, що той час, витрачений на все це, не було б виправданим лише для того, щоб проста CreateEntity
функція була виключно безпечною. Я, мабуть, просто хочу, щоб гра відображала помилку і закривалась у цьому випадку.
Наскільки далеко ви приймаєте це у власних ігрових проектах? Чи взагалі прийнятно писати небезпечний код для виключення для програми, яка може просто вийти з ладу, коли є виняток?