Melempar pengecualian IFF kelas tidak dapat dimasukkan ke dalam keadaan yang konsisten sehubungan dengan penggunaan semantiknya. Kalau tidak, jangan. JANGAN PERNAH membiarkan objek ada dalam keadaan tidak konsisten. Ini termasuk tidak menyediakan konstruktor lengkap (seperti memiliki konstruktor kosong + inisialisasi () sebelum objek Anda benar-benar dibangun) ... HANYA KATAKAN TIDAK!
Dalam keadaan darurat, semua orang melakukannya. Saya melakukannya kemarin untuk benda yang sangat sempit digunakan dalam lingkup yang ketat. Suatu hari nanti, saya atau orang lain mungkin akan membayar harga untuk slip itu dalam praktik.
Saya harus mencatat bahwa dengan "konstruktor" maksud saya hal yang klien panggil untuk membangun objek. Itu bisa dengan mudah menjadi sesuatu selain konstruk yang sebenarnya dengan nama "Konstruktor". Misalnya, sesuatu seperti ini di C ++ tidak akan melanggar prinsip IMNSHO:
struct funky_object
{
...
private:
funky_object();
bool initialize(std::string);
friend boost::optional<funky_object> build_funky(std::string);
};
boost::optional<funky_object> build_funky(std::string str)
{
funky_object fo;
if (fo.initialize(str)) return fo;
return boost::optional<funky_object>();
}
Karena satu-satunya cara untuk membuat funky_object
adalah dengan memanggil build_funky
prinsip tidak pernah membiarkan objek yang tidak valid tetap ada meskipun "Pembuat" yang sebenarnya tidak menyelesaikan pekerjaan.
Itu banyak pekerjaan ekstra meskipun untuk keuntungan yang dipertanyakan (bahkan mungkin kerugian). Saya masih lebih suka rute pengecualian.