Stilfrage: Bearbeitung eines Objektes



  • Hi,

    von:

    bearbeite(wort); // http://www.c-plusplus.net/forum/315721, SeppJs erster Beitrag
    

    Ich finde es ja persönlich schöner

    wort = bearbeite(wort);
    

    zu schreiben, wo bearbeite() eine const -Referenz nimmt und das Ergebnis zurückgibt, anstatt eine Referenz zu nehmen und an dieser zu arbeiten.
    Damit spart man eine Zeile, die man sonst (falls man das Ergebnis zwingend in einem neuen, separaten String braucht) für die Definition des zweiten Strings benötigt - hier kann man ja einfach bearbeite(wort) als Initializer bei der Definition nehmen.

    //... 'wort' wirt erstellt
    std::string neu{wort};
    bearbeite(neu);
    

    ➡

    //... 'wort' wird erstellt
    std::string neu = bearbeite(wort);
    

    Außerdem ist die zweite Variante theoretisch schneller, da ja in der ersten [c]wort[/c] kopiert wird, in der zweiten aber nichts (RVO), oder?(s. u. 🙄 )

    Oder welche stilistischen Argumente sprechen für die erste Variante?

    MfG



  • Kommt auf den Kontext drauf an, wie es benutzt wird, wie teuer es ist, ein Objekt zu kopieren, ob Cache eine Rolle spielt, ...

    Auch schreibst du von 'Objekt' und verwendest als Beispiel einen std::string. Bei eigenen Klassen gibt es noch die Option objekt.bearbeite(). Was, wenn es kein String von wenigen KByte ist, sondern ein Bild von vielen MByte?

    da ja in der ersten wort kopiert wird, in der zweiten aber nichts (RVO)

    Du hast sowohl das Orginal als auch die veraenderte Variante. D.h. du musst kopieren bzw. Speicher fuer die veraenderte Variante bereitstellen. D.h. deine Aussage ist falsch.

    ps: 'wirt' und 'wird' sind verschieden. 🙂


  • Mod

    Das kommt ganz drauf an, was die Funktion macht. (Ich habe in dem Beispiel übrigens bearbeite(wort); gewählt, um das Beispiel einfach zu halten.). Also nicht Stil, sondern auf Logik. Falls es irgendwie Sinn machen kann, auch

    anderes_wort = bearbeite(wort);
    

    zu schreiben, dann natürlich diese Variante, sonst wäre es schließlich nicht möglich. Falls dieser Fall von der Logik von dem was bearbeite() macht gar nicht vorkommen kann (zum Beispiel erhoehe_um_eins() ), dann klar die andere Variante.



  • Ich würde sagen, wenn es irgendwelche Vorteile hat, das Argument inplace zu bearbeiten, dann soll

    bearbeite(string& wort);
    

    bevorzugt werden, weil das schneller ist und dann auch semantisch stimmig ist.

    RVO ist hier ausserdem ein völlig falsches Stichwort, weil bei

    bearbeite(string const& wort) {
      string a = "a";
      string b = "b";
      return wort.empty() ? a : b;
    }
    

    hat es kein RVO und trotzdem ist es sinnvoll, eine const-Referenz zu übergeben.



  • Du hast sowohl das Orginal als auch die veraenderte Variante. D.h. du musst kopieren bzw. Speicher fuer die veraenderte Variante bereitstellen. D.h. deine Aussage ist falsch.

    Völliger Blödsinn, sorry - da hab ich wohl im schnellen Nachdenken was komisches gefusselt. 😃

    Ja, die Performance ist gleich, aber

    semantisch stimmig ist.

    Was soll das heißen?



  • Was, wenn es kein String von wenigen KByte ist, sondern ein Bild von vielen MByte?

    Dann hat das mit der Ausgangsfrage nix zu tun, hier ging es ja um den Stil.



  • Dann hat das mit der Ausgangsfrage nix zu tun, hier ging es ja um den Stil.

    Aehm ... warum hast du dann Performance erwaehnt. Auch hast du danach gefragt, was noch fuer/gegen die einzelnen Varianten spricht.

    Desweiteren ist unser Verstaendniss von "schoen" verschieden. Schoen ist bei mir in der Programmierung immer problembezogen.


Log in to reply