Ist es eine gute Praxis, die zurückgegebene Variable "result" zu nennen? [geschlossen]


44

Ist es eine gute Praxis, die Variable aufzurufen, die eine Methode mit einem Variablennamen zurückgibt result?

Zum Beispiel:

public Zorglub calculate() {
    Zorglub result = [...]
    [...]
    return result;
}

Oder soll ich es nach Typ benennen?

public Zorglub calculate() {
    Zorglub zorglub = [...]
    [...]
    return zorglub;
}

Ich habe beides in freier Wildbahn gesehen. Wenn ich eines auswählen muss, aus welchen Gründen könnte ich das erstere oder letztere (oder einen besseren Namen) bevorzugen?

Ich denke hauptsächlich an Java.


73
Ich habe auch ofTheJediverwendet für diesen Zweck gesehen. Keine Empfehlung, nur zu sagen, dass ich es gesehen habe. Zorglub ofTheJedi = //...; return ofTheJedi;

7
Normalerweise nenne ich es "retval" (value to return), aber das ist mehr oder weniger dasselbe wie "result", über das ich abstimmen würde.
Zeta Two

5
Jeder hat eine andere Antwort, sie sind alle ähnlich, aber unterschiedlich und gültig, die Frage ist nicht freiwillig subjektiv, aber die Antworten sind. Es ist eher eine Umfrage.
ZJR,

16
Ich würde sagen, dass "result" als Variable in Ordnung ist, aber "berechne" als Funktion absolut nicht.
Kaz Dragon

2
Arbeiten Sie mit vielen ehemaligen Delphi-Programmierern zusammen?
Peter Turner

Antworten:


48

Wenn es sich um eine Methodenvariable handelt, hängt dies wirklich von der Lesbarkeit ab.

Da Sie den Typnamen bereits in der Variablendeklaration und im Methodenrückgabetyp haben, können Sie ihn auch verwenden result- er beschreibt die Rolle der Variablen.


40

Das gegenseitige Lesen wird erleichtert, wenn die Variable benannt wird result. Dies macht Ihre Absicht klar.


2
+1 Dies ist der Hauptpunkt. Ich weiß, was das Ergebnis in jedem Kontext bedeutet, wenn ich nur auf den Code schaue.
Xeoncross

1
Ich stimme zu, die Verwendung des Variablentyps hilft Ihnen nicht zu verstehen, dass Sie ihn zurückgeben werden. In diesen einfachen Beispielen ist es einfacher, die Rückgabe zu sehen, ohne zu scrollen oder zu suchen, aber es ist schneller, im Voraus zu wissen, was der zurückgegebene Wert der Funktion ist. Es ist auch wichtig, es zu initialisieren, wie im Beispiel getan.
Nycynik

17

Wenn ich eine Rückgabevariable brauche (was eigentlich selten vorkommt), rufe ich sie immer auf retund definiere sie immer direkt unter dem Funktionskopf. Die Funktion hat bereits einen Namen, der besagt, was zurückgegeben wird.

Wenn ich hätte, könntemyFunction ich seine Rückgabevariable benennen, um genau dasselbe zu sagen, nur müsste ich es jedes Mal explizit sagen. Da Funktionen in der Regel kurz sein sollten, ist eine solche Aussage nicht erforderlich. Und selbst wenn ich den Überblick verliere, kann ich zur Deklaration springen und lande direkt unter der Funktionsdefinition.myFunctionReturnValue

Jeder andere Name, der nicht implizit (wie retoder result) oder explizit (wie myFunctionReturnValueoder myFunctionResult) angibt, dass dies die aktuelle Rückgabevariable für Funktionen ist, ist zu generisch.

In Ihrem zweiten Beispiel zorglubist eine schreckliche Wahl. Die einzige Erklärung, die mir wirklich sagt, ist, dass Sie eine Variable erstellt haben, deren Name der Typanmerkung entspricht, die sich direkt neben dem Namen befindet. Es ist ungefähr so ​​hilfreich wie int someIntoder Zorglub z.

Wenn ich in Ihrem ersten Beispiel den Code betrachte, sehe ich zuerst den Funktionsnamen, der mir sagt, dass diese Funktion a berechnet Zorglub. Während ich die zweite Zeile lese, sehe ich "ok, hier ist der Zorglub, der zurückgegeben wird, aber offensichtlich nicht sofort zurückgegeben werden kann und daher in der resultVariablen gespeichert wird" (als Randnotiz: Wenn Sie Wenn Sie den Wert nicht neu zuweisen möchten, deklarieren Sie am besten die Variable final, um dies mitzuteilen. Ich denke dann: "Nun wollen wir sehen, was damit passiert, bevor es zurückgegeben wird." Anders als im ersten Beispiel muss ich nicht weiter lesen, um zu wissen, dass dies die Variable ist, die zurückgegeben wird und der ich im Funktionskörper folgen möchte, wenn ich ihn verstehen will.

Vielleicht möchten Sie sich über die spartanische Programmierung informieren , die sich eher auf Ihre Frage bezieht.


8
+1 für "Zorglub ist eine schreckliche Wahl". Es gibt keinen irdischen Grund, einen Variablennamen zu haben, der in irgendeinem Zusammenhang mit dem Typnamen identisch ist (abzüglich des Anfangskapitals). Die Deklaration gibt Ihnen Auskunft über den Typ der Variablen. Die Benennung Ihrer Variablen nach dem Typ ist nicht besser als der Aufruf Ihrer Variablen x1, x2, x3 usw. Der Name einer Variablen sollte ausdrücken, wofür die Variable gedacht ist oder was sie tut. Mein bevorzugter Name für eine Variable in diesem speziellen Fall ist toReturn, da die Variable auf das zurückzugebende Objekt verweist. Tatsächlich beginnen viele meiner Variablennamen mit "bis".
Laut Dawood wird Monica

21
@DavidWallace - das ist absolut zu stark. Ich habe eine Klasse angerufen Container. Wenn ich eine Methode habe, die die Menge ändert, könnte ich sagen, var container = getContainer(id); container.Quantity += 1; das ist sicher lesbar, wenn der Kontext der Methode nur für einen einzelnen Container gilt und das ist alles, was sie tut. Es zu nennen theContainerWeAreGoingToAdjustTheQuantityOfist einfach lächerlich.
Scott Whitlock

4
@ David, ich bin anderer Meinung. Nehmen wir eine Situation an, in der Sie mehrere lokale Variablen haben, von denen jede einen anderen Typ hat (sagen wir Benutzer, Manager und Abteilung). Angenommen, die Aufgabe besteht darin, den Benutzer mit der Abteilung und dem Manager-Team zu verknüpfen. IMHO ist es vollkommen in Ordnung, diese Benutzerinstanz einfach aufzurufen user(im Gegensatz zu userToJoinThisDepartmentAndManager? Oder was wäre Ihre Wahl?)
Péter Török

10
Kleiner Trottel: Ich hasse es, "ret" oder "rv" oder andere abgekürzte Varianten von result / returnValue zu sehen. "result" ist nicht sehr lang und niemand muss Zeichen speichern.
Kristopher Johnson

2
@KristopherJohnson: "result" ist nicht sehr lang, aber es bedeutet auch nicht "Rückgabewert". Rückgabewerte sind nicht immer Ergebnisse von Berechnungen, und umgekehrt sind Ergebnisse von Berechnungen nicht immer Rückgabewerte. Ich nehme an, Sie könnten Ihren Rückgabewert nennen returnValue, aber es retist traditionell, genau wie intund char.
Ruakh

12

In Ihrem zweiten Beispiel verbinden Sie den Typ des Ergebnisses mit dem, was es ist .

Zorglub zorglub;

sagt mir nur, es ist ein Zorglub, zweimal. Dreimal, wenn ich mir die Mühe mache, den Rückgabetyp der Methode zu lesen. Jedoch,

double variance;

zum Beispiel, gibt mir einen Anhaltspunkt über , was den Rückgabewert Mittel in Bezug auf die Programmsemantik. resultAbhängig von der Größe der Methode kann es klarer sein oder auch nicht, als sie nur aufzurufen - das ist ein Bewertungsaufruf für jede IMO-Methode.


8

Wenn Sie mit spielen viele Zorglub in Ihre Methoden - Objekte, Sie „könnte“ einen Fehler machen und das falsche zurückzukehren, oder / und man konnte die andere versucht sein , zu nennen zorglub1, zorglub2usw.

Wenn Sie es nennen result, haben Sie keine Chance, einen solchen Fehler zu machen. Außerdem finde ich, dass das ein guter Name ist; Ich habe es auch schon öfter gesehen returnedValueoder returnedObjectes ist auch klar, wenn auch etwas langwierig.


5

Ich persönlich fühle mich mit der Verwendung resultals Variablenname nicht ganz wohl . Gut genug, es sagt mir, dass der zugehörige Wert das Ergebnis einer Berechnung ist - ich schätze jedoch, dass dies ungefähr (oder mehr als) 90% der in einem Programm verwendeten Variablen / Felder entspricht.

Darüber hinaus kann es, wie mehrere andere Antworten angemerkt haben, verwendet werden, um den Wert zu markieren, der von einer Methode / Funktion zurückgegeben werden soll. Wenn ich jedoch meine Methoden kurz fasse, mich auf eine Sache konzentriere und konsequent auf einer einzelnen Abstraktionsebene bleibe, werden nicht viele lokale Variablen vorhanden sein, und es ist trivial zu sehen, was eine Methode zurückgibt.

Deshalb ziehe ich es vor, meine Methoden kurz und übersichtlich zu halten und meine Variablen so zu benennen, dass sie die Bedeutung des Wertes ausdrücken, den sie haben, und nicht die lokale Rolle innerhalb der einschließenden Methode. Allerdings kann (z. B. in Legacy-Code) Zorglub resultleichter zu verstehen sein als Zorglub zorglub.


12
Es wird nicht genannt , resultweil es das Ergebnis ist einige Berechnung; es wird aufgerufen, resultweil es das Ergebnis dieser Berechnung ist. Das funktioniert auch als Bedeutung IMO, auch wenn es nicht die spezifischste mögliche Bedeutung ist. Sinn auszudrücken ist golden, aber Absichten und Redewendungen können auch wertvoll sein. In diesem Fall ist es ein Kompromiss.
Am

@Supr: Welchen Namen würden Sie verwenden, um das Ergebnis einer anderen Berechnung zu beschreiben, die nur in den nächsten ein oder zwei Anweisungen verwendet wird (z. B. if (result >= 0) numChars+=result; else break;und deren Bedeutung sich aus der fraglichen Berechnung ergibt?) , das wird von zurückgegeben wurde diese Funktion aufgerufen werden soll ret, während der Wert, wurde von der letzten aufgerufenen Funktion zurückgegeben werden soll result. Beachten Sie, dass resultdies aussagekräftiger sein kann als ein längerer Name, wenn der Rückgabewert der Funktion z. B. entweder eine Menge oder einen Fehlercode darstellt.
Superkatze

@supercat, ich würde es basierend darauf benennen, was die Berechnung war oder wofür der Wert verwendet werden soll. Auch wenn es nur in der nächsten Berechnung verwendet wird, hilft es der Lesbarkeit, wenn es gut benannt ist. In Ihrem Beispiel habe ich keine Ahnung, was die Bedeutung resultist oder was der Code tatsächlich auf einer höheren Ebene tut. Ich müsste mich darauf beziehen, wo es eingestellt ist, um zu sehen, woher sein Wert kommt und was es ist. Etwas wie addedCharsoder matchedCharswürde transparenter sein und dabei helfen, aufzudecken, was der Code tut, und dies und die damit verbundenen result = ...
Dinge

@Supr: Das Problem ist, dass in vielen Fällen unterschiedliche Bereiche von Rückgabewerten unterschiedliche Bedeutungen haben können. Beispielsweise kann eine Routine zum Lesen eines Pakets in einen Puffer einer bestimmten Größe eine Anzahl von Bytes zurückgeben, wenn ein Paket empfangen wurde, oder eine negative Zahl, um anzuzeigen, dass ein Paket aussteht (und noch aussteht), das für den Puffer zu groß ist. oder eine wirklich große negative Zahl, um auf einen anderen Fehler hinzuweisen. Das Speichern der Rückkehr in resultund das anschließende Überprüfen anhand dieser Kriterien erscheint natürlicher als der Versuch, einen aussagekräftigen Namen zu finden, der alle Kriterien abdeckt.
Superkatze

@supercat, Mit retanstelle von resultscheint mir in Ordnung. Meiner Meinung nach ist es etwas weniger klar, weil es abgekürzt und nicht wie ein Substantiv ist, aber wenn es konsequent verwendet wird, ist es äquivalent zu result.
11.

1

Ich persönlich benutze den Namen resultfür den Wert, der von der Funktion / Methode zurückgegeben werden soll. Es wird explizit angegeben, dass es sich um den zurückzugebenden Wert handelt. Die Benennung nach Typ erscheint nicht sinnvoll, da möglicherweise mehr als eine Variable desselben Typs vorhanden ist.


Ähm, ist die Tatsache, dass "return" steht, bevor es zurückgegeben wird, eindeutig genug? Sie sollten beschreiben, was Sie damit machen, jetzt das "Wie". Warum nennst du es nicht total, result oder etwas anderes, das den Zweck beschreibt, dann ist dein Code bereit, "total" oder ähnliches zurückzugeben ...
Dave

@ Dave Nicht unbedingt erforderlich, insbesondere wenn Sie einige Objekte desselben Typs haben, bei denen es sich um Canidates handelt, die zurückgegeben werden sollen. Mit dieser Methode soll herausgefunden werden, welches Objekt das richtige ist.
Andy

@Andy, ich verstehe deinen Standpunkt, aber in Wirklichkeit kann ich mir nicht vorstellen, eine solche Funktion zu schreiben. Wenn dies der Grund für das Schreiben einer solchen Funktion ist, sollte sie in kleinere, verständlichere Funktionen unterteilt werden.
Dave

1

Was ist der Unterschied? Es gibt nur 2 verschiedene Wörter, die das Gleiche tun. Das eigentliche Problem ist also, welches klingt für Sie klarer?

Das "Ergebnis" oder "Zorglub".

Ich würde es vorziehen, ZorglubResultfür den Anfang zu verwenden, um zu sehen, dass das Ergebnis Zorglub leichter mit anderen Ergebnissen zu vergleichen ist, die Sie möglicherweise haben, und es ist ein Ergebnis, wie Sie sehen können.


1

soll ich es nach Typ benennen?

Nein niemals. Dies nennt sich Systems Hungarian und ist durch die Idee, ein Programm zu verwenden, das den Typ einer Variablen jederzeit anzeigen kann, wenn Sie es benötigen, trivial veraltet.


1

Wann immer Sie etwas im Code benennen müssen, sollten Sie Namen bereitstellen, die beschreibend, aussagekräftig und lesbar sind. Der Fall einer Rückgabevariable ist ein besonders gutes Beispiel dafür, wo Menschen dazu neigen, sich über das Benennen zu beklagen.

Wenn Sie eine Funktion haben, die eindeutig benannt ist, und Sie nur eine einzige Codezeile benötigen, können Sie die Benennung vollständig überspringen. Ihre Methoden kurz und zweckgebunden zu halten, ist immer das Ideal, das Sie anstreben sollten. Es kann jedoch vorkommen, dass Sie eine Funktion mit mehreren Codezeilen ausführen müssen. In diesen Fällen ist es immer ratsam, Ihre Variable so zu benennen, dass sie dem Zweck Ihrer Funktion entspricht.

Wenn der Zweck der Funktion darin besteht, das Ergebnis einer Berechnung oder eines Entscheidungsalgorithmus zurückzugeben, resultist der Name für Ihre Variable vollkommen ausreichend. Was geschieht jedoch, wenn Ihre Funktion ein Element aus einer Liste zurückgibt? Was ist, wenn Ihre Funktion einem anderen Zweck dient, der nichts mit Mathematik oder Listen zu tun hat? In diesen Fällen ist es besser, der Variablen einen aussagekräftigen Namen zu geben, der den Grund für die Erstellung der Funktion angibt. Sicher, Sie könnten einfach result verwenden, wenn Sie möchten, da es sich um einen Namen handelt, der wahrscheinlich nicht mit irgendetwas anderem in Konflikt steht. Aus Sicht der Lesbarkeit ist es jedoch sinnvoller, Ihre Variable aussagekräftiger und kontextbezogen zu benennen.


0

Ich kombiniere sie gerne, zeige, was es ist und dass es zurückgegeben werden soll.

also in deinem Beispiel wäre es resultZorglub

Wenn das, was es ist, keine Rolle spielt, ist es nur das Ergebnis (nicht resultString).


Nicht schlecht, aber ich denke, Sie müssten Ihre Variable umbenennen, wenn sich der Rückgabetyp ändert. Mit der modernen IDE ist es sowieso mit ein oder zwei Klicks erledigt, denke ich.
Jalayn,

@Jalayn Ja, aber wenn der Typ aus dem Namen herausgehalten würde, wäre das eine Änderung, die überhaupt nicht durchgeführt werden müsste. (Wenn eine Methode lang genug ist, dass ein einfacher Name nicht klar ist, ist sie wahrscheinlich zu lang und sollte überarbeitet werden.)
Donal Fellows

@DonalFellows Ich stimme dir vollkommen zu. Je weniger Änderungen Sie beim Aktualisieren aus dem Quellrepository sehen, desto besser.
Jalayn,

Okay, wenn Sie den Rückgabetyp ändern, vergessen Sie möglicherweise, ihn auch im Variablennamen zu ändern. Dies ist ein Problem. Bis jetzt war es für mich noch nie ein Problem. Ich mag es immer noch, die doppelte Absicht im Namen zu zeigen, aber bei kleineren, bereits guten Intent-Codes könnte es auch übertrieben sein. Ihr habt mich überzeugt. Wenn ich das Bedürfnis verspüre, meine Variablen auf diese Weise aufzurufen, überarbeite ich sie, bis ich das Bedürfnis nicht mehr verspüre. Vielen Dank
KeesDijk

0

Ich sehe keinen großen Unterschied zwischen dem Festlegen eines Rückgabewerts an einem bestimmten Punkt und dem Verwenden von Bedingungen, um den gesamten Code zu überspringen, der ihn möglicherweise ändert, und dem returnsofortigen Ausführen, sodass ich mich für die direkte Rückgabe entscheide. Daher gibt es keine resultVariable.

Wenn Sie einen Zwischenwert haben, der durch bedingten Code geändert werden kann oder nicht, dann ist er (noch) kein Ergebnis, daher sollte er mit Sicherheit nicht so benannt werden.


0

Als ich in C ++ gearbeitet habe und ich vermute, dass dies in Java zutrifft, habe ich es getan.

z.B

int Width() const
{
    Requires(....);
    Requires(....);

    //calculation

    Ensures(...);
    Ensures(...);
    return Result;
}

Dies ist vertraglich festgelegt, da der Sicherstellungsblock am Ende der Methode sein sollte. Aber die Rückkehr muss zuletzt sein. Wir hatten die Regel, dass return Result das einzige war, was dem sure-Block folgen konnte.


0

In einer rekursiven Funktion ist es häufig effektiv, das Ergebnis von Schritt zu Schritt zu übertragen, um eine Optimierung des Tail-Calls zu erreichen. Um dem Benutzer zu signalisieren, dass er keinen Parameter angeben muss, kann es sinnvoll sein, einen Parameter "result" zu nennen:

def removeOccurence [A] (slice: Seq[A], original: Seq[A]) = {
  @scala.annotation.tailrec
  def remove (leftOriginal: Seq[A], result: Seq[A]) : Seq[A] =
    trimStart (slice, leftOriginal) match {
      case (h :: tail) => remove (tail, h +: result)
      case (Nil)       => result.reverse
    }
    remove (original, Nil)
}

Aber häufiger verwende ich "Carry" und "Sofar", die ich in der Natur gesehen habe und die die Idee in den meisten Fällen sogar ein bisschen besser tragen.

Ein zweiter Grund ist natürlich, wenn Ihr Thema das Wort '' result '' vorschlägt, zum Beispiel, wenn Sie eine arithmetische Auswertung durchführen. Sie können die Formel analysieren, Variablen durch Werte ersetzen und am Ende ein Ergebnis berechnen.

Ein dritter Grund wurde bereits genannt, aber ich habe eine kleine Abweichung: Sie schreiben eine Methode, die einen Job ausführt, sagen wir, sie bewertet eine Form von '' max ''.

def max = {
  val result = somethingElseToDo
  if (foo) result else default 
}

Anstatt das Ergebnis '' result '' aufzurufen, könnten wir es '' max '' nennen, aber in einigen Sprachen können Sie beim Aufrufen einer Methode Klammern weglassen, sodass max ein rekursiver Aufruf der Methode selbst wäre.

Im Allgemeinen würde ich einen Namen vorziehen, der sagt, was das Ergebnis ist. Wenn dieser Name jedoch bereits vergeben ist, möglicherweise von mehr als einer Variablen, einem Attribut oder einer Methode, da es ein GUI-Feld, eine Zeichenfolgendarstellung, eine numerische und eine für die Datenbank gibt und eine andere verwendet, erhöht dies die Wahrscheinlichkeit von Verwechslungen. Bei kurzen Methoden mit 3 bis 7 Zeilen sollte '' result '' für einen Namen kein Problem darstellen.


0

In Object Pascal ist dies keine Wahl. Sie müssen der ResultVariablen irgendwo im Code der Funktion einen Wert zuweisen .

Beispiel:

function AddIntegers( A,B: Integer): Integer;
begin
  Result := A + B; 
end; 

Also für mich ist es ziemlich natürlich, eine "Result" (oder "Retorno", wie ich es in Portugiesisch schreibe, um Namenskonflikte mit den reservierten Wörtern der Sprache zu vermeiden) Variable zu haben, um einen Rückgabewert zu erhalten.

Wenn es sich um einen sehr einfachen Ausdruck in einer von C abgeleiteten Sprache handelt, werde ich natürlich keine Ergebnisvariable deklarieren und den Ausdruck direkt zurückgeben.


0

Es ist nicht nur das, was Sie das Ergebnis nennen (ich bin besonders auf "r"), sondern auch, wie es verwendet wird. Wenn Sie beispielsweise eine Rückgabevariable haben, sollte jede return-Anweisung diese zurückgeben. habe nicht 'return r;' am Ende, aber streuen Sie Dinge wie 'return m * x + b; "in der gesamten Methode / Funktion. Verwenden Sie" r = m * x + b; return r; "stattdessen.


-1

Ergebnis ist in Ordnung. Ich kann den Code auf den ersten Blick verstehen, sodass der Variablenname den Zweck erfüllt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.