Eine Ausnahme auslösen, wenn die Klasse in Bezug auf ihre semantische Verwendung nicht in einen konsistenten Zustand versetzt werden kann. Ansonsten nicht. NIEMALS zulassen, dass ein Objekt in einem inkonsistenten Zustand existiert. Dazu gehört, dass keine vollständigen Konstruktoren bereitgestellt werden (z. B. ein leerer Konstruktor + initialize (), bevor Ihr Objekt tatsächlich vollständig erstellt wurde) ... SAGEN SIE NUR NEIN!
Zur Not macht es jeder. Ich habe es neulich für ein sehr eng genutztes Objekt in einem engen Rahmen gemacht. Eines Tages werde ich oder jemand anderes wahrscheinlich den Preis für diesen Zettel in der Praxis bezahlen.
Ich sollte beachten, dass mit "Konstruktor" das gemeint ist, was der Client aufruft, um das Objekt zu erstellen. Das könnte genauso gut etwas anderes als ein tatsächliches Konstrukt sein, das den Namen "Konstruktor" trägt. Zum Beispiel würde so etwas in C ++ das Prinzip IMNSHO nicht verletzen:
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>();
}
Da der einzige Weg, ein Objekt zu erstellen, darin funky_object
besteht, build_funky
das Prinzip aufzurufen, niemals zuzulassen, dass ein ungültiges Objekt existiert, bleibt es intakt, obwohl der eigentliche "Konstruktor" den Job nicht beendet.
Das ist eine Menge zusätzlicher Arbeit für fragwürdigen Gewinn (vielleicht sogar Verlust). Ich würde immer noch die Ausnahmeroute bevorzugen.