Ném một ngoại lệ IFF, lớp không thể được đưa vào trạng thái nhất quán liên quan đến việc sử dụng ngữ nghĩa của nó. Nếu không thì không. KHÔNG BAO GIỜ cho phép một đối tượng tồn tại ở trạng thái không nhất quán. Điều này bao gồm việc không cung cấp các hàm tạo hoàn chỉnh (như có một hàm tạo trống + khởi tạo () trước khi đối tượng của bạn thực sự được xây dựng hoàn chỉnh) ... CHỈ NÓI KHÔNG!
Trong một nhúm, tất cả mọi người làm điều đó. Tôi đã làm điều đó vào một ngày khác cho một đối tượng được sử dụng rất hẹp trong phạm vi chặt chẽ. Một ngày nào đó trên đường, tôi hoặc người khác có thể sẽ trả giá cho sự trượt dốc đó trong thực tế.
Tôi nên lưu ý rằng bởi "constructor", ý tôi là thứ mà khách hàng gọi để xây dựng đối tượng. Điều đó có thể dễ dàng trở thành một cái gì đó khác hơn là một công trình thực tế có tên là "Nhà xây dựng". Ví dụ: một cái gì đó như thế này trong C ++ sẽ không vi phạm nguyên tắc 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>();
}
Vì cách duy nhất để tạo một funky_object
là bằng cách gọi build_funky
nguyên tắc không bao giờ cho phép một đối tượng không hợp lệ tồn tại vẫn còn nguyên vẹn mặc dù "Trình xây dựng" thực tế không hoàn thành công việc.
Đó là rất nhiều công việc làm thêm mặc dù cho lợi ích đáng ngờ (thậm chí có thể mất). Tôi vẫn thích con đường ngoại lệ.