Was ist schönerer Code - return Wert alleinstehend oder mit Berechnung?



  • SeppJ schrieb:

    Wenn das endwert wirklich verändert werden soll, dann auf jeden Fall das Erste. Soll das wirklich += sein?

    Ja, das += habe ich für das Beispiel eingebaut, weil man ja auch ansonsten einfach:

    // Vorheriger Bereich der Funktion
      ...
      return (x + (y - (bla % 10 - ext)/3));
    }
    

    hätte schreiben können.

    Also musste ich dafür sorgen, dass am Ende im Prinzip der Wert einer Variable zurückgegeben werden soll und die Notwendigkeit der Variable bringt man eben dadurch zum Ausdruck, in dem man sie mit der Berechnung verrechnet.

    Oder hättest du eine Berechnung erst in eine Variable gespeichert, um sie erst dann zurückzuliefern?
    Also so:

    // Vorheriger Bereich der Funktion
      ...
      double endwert = (x + (y - (bla % 10 - ext)/3));
      return endwert;
    }
    

    Anstatt += wäre natürlich auch:

    endwert = endwert +  x + (y - (bla % 10 - ext)/3);
    

    gegangen, aber das war mir dann zu viel Schreibarbeit. 😉


  • Mod

    volkard schrieb:

    SeppJ schrieb:

    Ich vermeide sogar Inkremente in Ausdrücken (außer als alleinstehender Ausdruck natürlich), außer es geht um irgendwelche Angebereien, wer das kürzeste strcpy schreiben kann.

    Und außer in *out++= (in C) hoffe ich mal.

    Ja, das ist halt so ein typischer strcpy-Hack. Wobei ein durch ein Gleichheitszeichen abgetrennter Ausdruck schon fast als Alleinstehend zählen kann. Da ist es in Ordnung, so etwas auf einer Seite stehen zu haben*.

    *: Und dann wird sich natürlich prompt irgendjemand finden, der *out++ = *out + 1 schreibt und mich zitiert, dass ich so etwas gutgeheißen hätte 🙄

    --------------------
    @Syntaktischer Zucker: Ich weiß nicht, ob du wirklich verstanden hast, wieso sich alle an dem += stören: Es geht da drum, dass durch das += im return eben die wichtige Information untergeht, dass das die Variable endwert selber noch verändert wird. Dies ist eine sehr wichtige Information (sonst würde man es ja nicht tun) und zudem sehr ungewöhnlich (wann hat man schon nicht-lokale Variablen zur Speicherung eines Ergebnisses?). Da sollte man unbedingt Wert darauf legen, dass dieser Vorgang auch gut sichtbar ist und den nicht in einer Rechnung verstecken.



  • hustbaer schrieb:

    Nur bevor ich

    int x = ...;
    x += 123;
    x = blah(x);
    ...
    

    schreibe, geb ich lieber jedem Zwischenergebnis einen neuen Namen.
    Weil's beim Code Lesen dadurch viel einfacher zu sehen ist was abgeht.

    Dann steigt aber auch der Speicherverbrauch.
    Und die Performance leidet ebenfalls darunter.

    Bei Variablen, die im Prinzip zum rechnen gleich weiterbenutzt werden, kann der Compiler z.B. dafür sorgen, das die in einem Register bleiben und das ist eben schneller, als wenn man den Wert wieder aus einer Speicheradresse holen müsste.
    Selbst mit 2nd Level Cache sind die Register schneller und seit AMD64 gibt's ja genug davon.


  • Mod

    Syntaktischer Zucker schrieb:

    hustbaer schrieb:

    Nur bevor ich

    int x = ...;
    x += 123;
    x = blah(x);
    ...
    

    schreibe, geb ich lieber jedem Zwischenergebnis einen neuen Namen.
    Weil's beim Code Lesen dadurch viel einfacher zu sehen ist was abgeht.

    Dann steigt aber auch der Speicherverbrauch.
    Und die Performance leidet ebenfalls darunter.

    Bei Variablen, die im Prinzip zum rechnen gleich weiterbenutzt werden, kann der Compiler z.B. dafür sorgen, das die in einem Register bleiben und das ist eben schneller, als wenn man den Wert wieder aus einer Speicheradresse holen müsste.
    Selbst mit 2nd Level Cache sind die Register schneller und seit AMD64 gibt's ja genug davon.

    Und das kann der Compiler im anderen Fall warum nicht?

    Ich habe übrigens noch eine Antwort auf deinen vorherigen Post in meinen vorherigen Post reineditiert (da ich ein Doppelposting vermeiden wollte), während du anscheindend schon wieder geantwortet hast.



  • Syntaktischer Zucker schrieb:

    hustbaer schrieb:

    Nur bevor ich

    int x = ...;
    x += 123;
    x = blah(x);
    ...
    

    schreibe, geb ich lieber jedem Zwischenergebnis einen neuen Namen.
    Weil's beim Code Lesen dadurch viel einfacher zu sehen ist was abgeht.

    Dann steigt aber auch der Speicherverbrauch.
    Und die Performance leidet ebenfalls darunter.

    Ach was. Wir sind doch nicht in der Compilersteinzeit. Gerade wenn man an SSA denkt, wird schnell klar, dass es für die Performance ziemlich egal ist, ob eine neue Variable eingeführt oder eine alte wiederverwendet wird.



  • SeppJ schrieb:

    Ich habe übrigens noch eine Antwort auf deinen vorherigen Post in meinen vorherigen Post reineditiert (da ich ein Doppelposting vermeiden wollte), während du anscheindend schon wieder geantwortet hast.

    Hab's jetzt gelesen.
    Also mir würde das += auffallen.



  • Ich bevorzuge einzeilige Funktionen mit direktem Rueckgabewert, solange die Zeile nicht zu lang wird.
    Das liegt daran, dass ich funktionale Sprachen sehr gerne mag und es da nur den Rueckgabewert gibt und gar keine anderen Moeglichkeiten, ausser man definiert sich mit where oder let irgendwelche zusaetzlichen Variablen hin.
    Ansonsten finde ich neue Variablen verwenden schoener, weil eine Variable eine feste Bedeutung haben sollte und sich die nicht veraendern sollte.



  • Syntaktischer Zucker schrieb:

    Also mir würde das += auffallen.

    Es ist nicht übersichtlich.
    Es irritiert.
    Mag sein dass es "auffällt", aber "auffällig" ist nicht unbedingt gut beim Lesen von Code. Übersichtlich ist besser.



  • SeppJ schrieb:

    Kellerautomat schrieb:

    ich finde die return += variante am besten, wuerde aber die unnoetigen klammern weglassen.

    *Schauder*

    Wer Nebeneffekte in Ausdrücken versteckt, der macht auch ... keine Ahnung, such dir was aus, dass du nicht leiden kannst 🙂

    Ich finde das nicht versteckt. Vielleicht ists nur mein trainiertes Auge, aber "return foo += expr;" ist m.M.n. ziemlich offensichtlich. Das einzige, was ich u.U. machen wuerde, ist eine Variable fuer expr einzufuehren.



  • Kellerautomat schrieb:

    Ich finde das nicht versteckt. Vielleicht ists nur mein trainiertes Auge, aber "return foo += expr;" ist m.M.n. ziemlich offensichtlich. Das einzige, was ich u.U. machen wuerde, ist eine Variable fuer expr einzufuehren.

    Übersehen w+rde och es wohl auch nicht. Aber das Konstrukt ist so selten, daß es meinen Lesefluss stört. Und es ist so nutzlos im Vergleich zu zwei lesbaren Zeilen kede mit einem Zweck, daß ich mich vielleicht drüber ärgere. Das wollen wir doch alle nicht.



  • volkard schrieb:

    Kellerautomat schrieb:

    Ich finde das nicht versteckt. Vielleicht ists nur mein trainiertes Auge, aber "return foo += expr;" ist m.M.n. ziemlich offensichtlich. Das einzige, was ich u.U. machen wuerde, ist eine Variable fuer expr einzufuehren.

    Übersehen w+rde och es wohl auch nicht. Aber das Konstrukt ist so selten, daß es meinen Lesefluss stört.

    Es ist doch nur selten, bei dem, der es nie nutzt.

    Ich nutze es ständig, ich bin nämlich schreibfaul und so ist gleich klar was gemeint ist.
    Bei so etwas wie:

    ergebnis = ergebnis + ...
    

    Muss man nämlich erstmal lesen, was das zweite Wort ist.
    Das mag bei so nem kurzen Wort wie ergebnis noch sofort auffallen.
    Aber bei Variablen mit Kamelcase, die es vielleicht deswegen auch in andere Form gibt, kann das schon wieder ganz anders aussehen.

    Und es ist so nutzlos im Vergleich zu zwei lesbaren Zeilen kede mit einem Zweck,

    Es ist nicht nutzlos.
    Wie schon gesagt, bei der anderen Variante muss man die zweite Variable erstmal lesen, das kostet Zeit, bei += ist sofort klar was gemeint ist.



  • Syntaktischer Zucker schrieb:

    volkard schrieb:

    Kellerautomat schrieb:

    Ich finde das nicht versteckt. Vielleicht ists nur mein trainiertes Auge, aber "return foo += expr;" ist m.M.n. ziemlich offensichtlich. Das einzige, was ich u.U. machen wuerde, ist eine Variable fuer expr einzufuehren.

    Übersehen w+rde och es wohl auch nicht. Aber das Konstrukt ist so selten, daß es meinen Lesefluss stört.

    Es ist doch nur selten, bei dem, der es nie nutzt.

    Ich nutze es ständig, ich bin nämlich schreibfaul und so ist gleich klar was gemeint ist.
    Bei so etwas wie:

    ergebnis = ergebnis + ...
    

    Muss man nämlich erstmal lesen, was das zweite Wort ist.
    Das mag bei so nem kurzen Wort wie ergebnis noch sofort auffallen.
    Aber bei Variablen mit Kamelcase, die es vielleicht deswegen auch in andere Form gibt, kann das schon wieder ganz anders aussehen.

    Und es ist so nutzlos im Vergleich zu zwei lesbaren Zeilen kede mit einem Zweck,

    Es ist nicht nutzlos.
    Wie schon gesagt, bei der anderen Variante muss man die zweite Variable erstmal lesen, das kostet Zeit, bei += ist sofort klar was gemeint ist.

    Nee! Es ging nicht um
    rau+=17;
    sondern um
    return rau+=17;


Anmelden zum Antworten