Za każdym razem, gdy zastanawiam się, czy mój kod jest wyjątkowo bezpieczny, uzasadniam, że tego nie robię, ponieważ byłoby to tak czasochłonne. Rozważ ten stosunkowo prosty fragment:
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;
Aby wdrożyć podstawową gwarancję wyjątku, mógłbym użyć wskaźnika zasięgu w new
połączeniach. Zapobiegnie to wyciekom pamięci, jeśli którekolwiek z wywołań zgłosi wyjątek.
Powiedzmy jednak, że chcę wdrożyć silną gwarancję wyjątku. Przynajmniej musiałbym zaimplementować wspólny wskaźnik dla moich kontenerów (nie używam Boost), nothrow Entity::Swap
do dodawania atomów atomowo i jakiś idiom do atomowego dodawania zarówno do, jak Vector
i Map
. Wdrożenie byłoby nie tylko czasochłonne, ale także kosztowne, ponieważ wymaga znacznie więcej kopiowania niż rozwiązanie niebezpieczne.
Ostatecznie wydaje mi się, że czas spędzony na robieniu tego wszystkiego nie byłby usprawiedliwiony tylko dlatego, że prosta CreateEntity
funkcja jest wyjątkowo bezpieczna. Prawdopodobnie chcę po prostu wyświetlić błąd i zamknąć go w tym momencie.
Jak daleko posuwasz się w swoich własnych projektach gier? Czy ogólnie dopuszczalne jest pisanie niebezpiecznego kodu wyjątku dla programu, który może ulec awarii, gdy wystąpi wyjątek?