Best practice für TryDoSomething Methoden



  • Hallo zusammen,

    ich versuche mich nun schon länger an C++ und frage mich nun, wie man in C++ eine TryDoSomeThing Methode implementiert, z.B. eine TryConvertString Methode.

    Mein Ansatz wäre

    bool TryConvert(std::string text, uint** value);
    

    Doch würde ich gern wissen, ob es vielleicht nicht schönere Ansätze gibt, z.B. ohne Pointer.

    Schöne Grüße
    Quaneu


  • Mod

    Was soll das denn überhaupt tun und wieso denkst du hier Zeiger, noch dazu Zeiger auf Zeiger, zu benötigen?



  • Es sollte nur ein Beispiel sein. Wenn man z.B. aus einem string einen int machen will. Ich weiß, dass es hierfür schon was gibt, soll nur ein Beispiel sein. Dann würde ich gerne diese Methode Aufrufen. Da ich von C# komme und dies hier wie folgt gemacht hätte

    bool TryConvert(string text, out int value)
    

    Habe ich versucht es ähnlich zu machen.

    Aufrufen will ich es z.B. so (hier mit ** gelöst)

    uint* value;
    if(TryConvert("1", &value))
    {
    // Do something with value
    }
    

    Warum ich ** benutzt habe, ist eine gute Frage, ich glaube ich habe damals Beispiele gesehen und diese so Stellenweise übernommen.



  • Nimm einfach eine Referenz und wirf eine Exception, falls ein Fehler auftritt.

    Und sieh zu, dass es niemals zu dieser Exception kommt.



  • Nimm einfach eine Referenz und wirf eine Exception, falls ein Fehler auftritt.
    Und sieh zu, dass es niemals zu dieser Exception kommt.

    Das geht leider nicht, da es immer passieren kann, dass es nicht möglich ist zu konvertieren, daher brauche ich einen bool, der angibt, ob die Konvertierung funktioniert hat um dann entsprechend zu reagieren.



  • Nochmals: warum mit diesem komischen Doppelpointer? "Habe ich irgendwo gesehen" ist keine sinnvolle Antwort.

    Möglich wäre unter anderem:

    bool tryConvert(const std::string &text, int &converted);
    // oder
    bool tryConvert(const std::string &text, int *converted);
    // oder
    boost::optional<int> tryConvert(const char *text);
    

    Das angenehme bei der letzten Variante ist, dass man nicht diesen komischen zweiten Parameter hat, sondern einfach ganz normal einen Rückgabewert bekommt. Auch kann man diesen nicht leise ignorieren.

    Du solltest den ersten Parameter jedenfalls als const übergeben. Bei string würde ich per default immer als const& übergeben. Alternativ tut es vielleicht auch const char* .



  • Nochmals: warum mit diesem komischen Doppelpointer? "Habe ich irgendwo gesehen" ist keine sinnvolle Antwort.

    Du hast recht, es ist keine Antwort und es macht wirklich keinen Sinn. Daher tendiere ich zu deinem ersten Vorschlag, dies ist eigentlich die 1:1 Umsetzung aus C#.



  • Ja, richtig.

    Aber was passiert, wenn jemand das Resultat TryConvert nicht testet? Welchen Wert hat die int-Variable dann?

    Schau dir ruhig mal das optional an. Die haben in ihrer Doku sogar string to int als Beispielanwendung drin:

    http://www.boost.org/doc/libs/1_63_0/libs/optional/doc/html/boost_optional/quick_start.html



  • Das ist die einzige Unschönheit, aber ich denke man kann nicht immer alles vermeiden. Wenn man es optional macht (in C++17 enthalten), würde man in eine Exception laufen, wenn man es nicht prüft und in dem jetzigen Beispiel würde vielleicht irgendwas passieren... aber kann und soll man den Anwender immer vor allem "schützen"? Oder ist es hier nicht "klar?



  • Ich würde hier mal pragmatisch sagen, doch, wenn eine Funktion "tryXxx" heisst ist klar dass sie vermutlich "silent" (=ohne Exception) fehlschlagen* kann. Wer dann nicht auf die Idee kommt sich mal den Returnwert anzugucken, ob dieser vielleicht interessant sein könnte, ... also man muss nicht alles abdecken.

    Ansonsten ja, optional<T> ist schon nett. Allerdings für bool ... ich weiss nicht. Müsste man sich mal angucken wie der generierte Code aussieht bevor man anfängt das überall dranzuschreiben. Oder auch nicht - hängt vermutlich vom Projekt ab. Gibt ja durchaus Projekte wo so "dezenter" Code-Bloat kein all zu wichtiges Thema ist.

    Hat das schonmal jemand probiert?

    *: Wobei "fehlschlagen" genaugenommen vielleicht der falsche Ausdruck ist. Die Funktion trägt ja "try" im Namen, und versucht hat sie es ja in jedem Fall. Aber ich denke es ist klar was gemeint ist.



  • Vielen Dank für deine Antwort. Leider habe ich noch nichts mit optional gemacht.


Anmelden zum Antworten