Lance uma exceção IFF, a classe não pode ser colocada em um estado consistente com relação ao seu uso semântico. Caso contrário, não. NUNCA permita que um objeto exista em um estado inconsistente. Isso inclui não fornecer construtores completos (como ter um construtor vazio + inicializar () antes que seu objeto seja completamente construído) ... APENAS DIGA NÃO!
Em uma pitada, todo mundo faz isso. Fiz isso outro dia para um objeto usado de maneira muito restrita, dentro de um escopo restrito. Algum dia, no futuro, eu ou outra pessoa provavelmente pagaremos o preço por esse recibo na prática.
Devo observar que, por "construtor", quero dizer o que o cliente chama para criar o objeto. Isso poderia facilmente ser algo diferente de uma construção real chamada de "Construtor". Por exemplo, algo assim em C ++ não violaria o princípio 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>();
}
Como a única maneira de criar um funky_object
é chamar build_funky
o princípio de nunca permitir que um objeto inválido exista permaneça intacto, mesmo que o "Construtor" real não termine o trabalho.
Isso dá muito trabalho extra para ganho questionável (talvez até perda). Eu ainda preferiria a rota de exceção.