Setiap kali saya menganggap membuat kode saya sangat aman, saya membenarkan tidak melakukannya karena itu akan sangat memakan waktu. Pertimbangkan cuplikan yang relatif sederhana ini:
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;
Untuk menerapkan jaminan pengecualian dasar, saya bisa menggunakan pointer lingkup pada new
panggilan. Ini akan mencegah kebocoran memori jika ada panggilan yang melempar pengecualian.
Namun, katakanlah saya ingin menerapkan jaminan pengecualian yang kuat. Setidaknya, saya perlu menerapkan pointer bersama untuk kontainer saya (saya tidak menggunakan Boost), sebuah nothrow Entity::Swap
untuk menambahkan komponen secara atom, dan semacam idiom untuk menambahkan secara atom ke keduaVector
dan Map
. Tidak hanya akan memakan waktu untuk mengimplementasikan, tetapi mereka akan mahal karena melibatkan lebih banyak menyalin daripada pengecualian solusi yang tidak aman.
Pada akhirnya, saya merasa seperti waktu yang dihabiskan untuk melakukan semua itu tidak akan dibenarkan hanya karena CreateEntity
fungsi sederhana sangat pengecualian aman. Saya mungkin hanya ingin game menampilkan kesalahan dan menutup pada titik itu pula.
Seberapa jauh Anda mengambil ini dalam proyek game Anda sendiri? Apakah secara umum dapat diterima untuk menulis pengecualian kode tidak aman untuk suatu program yang bisa crash ketika ada pengecualian?