Бросить исключение IFF, класс не может быть приведен в согласованное состояние в отношении его семантического использования. В противном случае нет. НИКОГДА не позволяйте объекту существовать в несогласованном состоянии. Это включает в себя не предоставление полных конструкторов (например, наличие пустого конструктора + initialize () до того, как ваш объект фактически полностью построен) ... ПРОСТО СКАЗАТЬ НЕТ!
В крайнем случае, все это делают. Я сделал это на днях для очень узко используемого объекта в ограниченном объеме. Однажды в будущем я или кто-то другой, вероятно, заплатит цену за этот промах на практике.
Я должен отметить, что под «конструктором» я подразумеваю то, что клиент вызывает для создания объекта. Это также может быть что-то иное, чем реальная конструкция, которая называется «Конструктор». Например, что-то подобное в 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>();
}
Поскольку единственный способ создать это funky_object
- вызвать build_funky
принцип, согласно которому недопустимый недопустимый объект остается неизменным, даже если фактический «Конструктор» не завершает работу.
Это много дополнительной работы, хотя для сомнительной выгоды (возможно, даже потери). Я все еще предпочел бы маршрут исключения.