Handhabe einer Fehlerprüfung
-
Hallo Leute,
ich habe eine Frage zur Überprüfung von übergebenen String-Werten.
Und zwar habe ich mit boost::regex eine Prüfung in den Konstruktor meines Objekts gebaut. Wird der Konstruktor der einen String erwartet aufgerufen und stimmt der String mit einer gewissen Form nicht überein wird eine Exception geworfen.
Schön. Was aber wenn in vielen anderen Objekten die selben Prüfungen notwendig sind? Immer und immer wieder den Code wiederholen? Oder soll ich viele fast banale Prüfungen in eigene Objekte ausgliedern und mittels Vererbung meinen eigentlichen Objekten zugänglich machen? Oder eine große Fehlerklasse? Dann aber wären Objekt und Prüfung getrennt.
Was tun?
Besten Dank und verzeiht das ich keine Bsp. gebracht habe. Ist schon spät...
Gruß
Goran
-
goran schrieb:
Oder soll ich viele fast banale Prüfungen in eigene Objekte ausgliedern
Ja.
goran schrieb:
und mittels Vererbung meinen eigentlichen Objekten zugänglich machen?
Nein.
Schreib eine freie Funktion, die diese Prüfung durchführt, oder meinetwegen eine Klasse, die die Prüfung in ihrem Konstruktor macht. Aber bitte, bitte keine Vererbung.
-
wenn die objekte nichts gemein haben, außer dieser validierung, dann brächte vererbung eine beziehung zustande, die nicht gewollt ist.
was sinn machen könnte ist, objekte dieser art von einer factory generieren zu lassen, deren create methode einen string und einen validator erwartet. diese validatoren können wunderbar in einer vererbungshierarchie aufgestellt werden und die factory polymorphie nutzen, um die strings zu überprüfen. das hat den vorteil, dass auch wirklich nur dann objekte generiert werden, wenn die valdierung erfolgreich war. eine objekterzeugung im konstruktor abzubrechen ist immer ein wenig halbgar meiner meinung nach.
class Validator { public: virtual bool validate(std::string) = 0; }; class A { private: A(); }; class Factory { public: static A createA(std::string, *Validator); static B createB(std::string, *Validator); };
-
Das Bsp. gefällt mir
Aber eine Frage habe ich noch....Und zwar kann ich mit
static A createA(std::string, *Validator);ein Objekt A zurückgeben wenn ich das richtig sehe. Also etwas wie
A myA; string myString = "Bla"; Validator * myValidator = new("someRegex"); myA = createA(myString, myValidator);Dann verstehe ich aber nicht
das hat den vorteil, dass auch wirklich nur dann objekte generiert werden, wenn die valdierung erfolgreich war.
Aber "myA" ist doch schon deklariert worden. Oder kapier ich nicht "static functions". Die Verhalten sich doch genauso mit der Ausnahme das sie erreichbar sind ohne ein Objekt der entsprechenden Klasse zu instanziieren. Also
Factory::createA(aString, aValidator);Was habe ich übersehen?
Gruß