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.
programming-practices
naming
variables
Nicolas Raoul
quelle
quelle
ofTheJedi
verwendet für diesen Zweck gesehen. Keine Empfehlung, nur zu sagen, dass ich es gesehen habe.Zorglub ofTheJedi = //...; return ofTheJedi;
Antworten:
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.quelle
Das gegenseitige Lesen wird erleichtert, wenn die Variable benannt wird
result
. Dies macht Ihre Absicht klar.quelle
Wenn ich eine Rückgabevariable brauche (was eigentlich selten vorkommt), rufe ich sie immer auf
ret
und definiere sie immer direkt unter dem Funktionskopf. Die Funktion hat bereits einen Namen, der besagt, was zurückgegeben wird.Wenn ich hätte, könnte
myFunction
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
ret
oderresult
) oder explizit (wiemyFunctionReturnValue
odermyFunctionResult
) angibt, dass dies die aktuelle Rückgabevariable für Funktionen ist, ist zu generisch.In Ihrem zweiten Beispiel
zorglub
ist 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 wieint someInt
oderZorglub 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 derresult
Variablen 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.
quelle
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 nennentheContainerWeAreGoingToAdjustTheQuantityOf
ist einfach lächerlich.user
(im Gegensatz zuuserToJoinThisDepartmentAndManager
? Oder was wäre Ihre Wahl?)returnValue
, aber esret
ist traditionell, genau wieint
undchar
.In Ihrem zweiten Beispiel verbinden Sie den Typ des Ergebnisses mit dem, was es ist .
sagt mir nur, es ist ein Zorglub, zweimal. Dreimal, wenn ich mir die Mühe mache, den Rückgabetyp der Methode zu lesen. Jedoch,
zum Beispiel, gibt mir einen Anhaltspunkt über , was den Rückgabewert Mittel in Bezug auf die Programmsemantik.
result
Abhä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.quelle
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
,zorglub2
usw.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 gesehenreturnedValue
oderreturnedObject
es ist auch klar, wenn auch etwas langwierig.quelle
Ich persönlich fühle mich mit der Verwendung
result
als 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 result
leichter zu verstehen sein alsZorglub zorglub
.quelle
result
weil es das Ergebnis ist einige Berechnung; es wird aufgerufen,result
weil 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.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 sollret
, während der Wert, wurde von der letzten aufgerufenen Funktion zurückgegeben werden sollresult
. Beachten Sie, dassresult
dies aussagekräftiger sein kann als ein längerer Name, wenn der Rückgabewert der Funktion z. B. entweder eine Menge oder einen Fehlercode darstellt.result
ist 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 wieaddedChars
odermatchedChars
würde transparenter sein und dabei helfen, aufzudecken, was der Code tut, und dies und die damit verbundenenresult = ...
result
und das anschließende Überprüfen anhand dieser Kriterien erscheint natürlicher als der Versuch, einen aussagekräftigen Namen zu finden, der alle Kriterien abdeckt.ret
anstelle vonresult
scheint 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 zuresult
.Ich persönlich benutze den Namen
result
fü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.quelle
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,
ZorglubResult
für den Anfang zu verwenden, um zu sehen, dass das ErgebnisZorglub
leichter mit anderen Ergebnissen zu vergleichen ist, die Sie möglicherweise haben, und es ist ein Ergebnis, wie Sie sehen können.quelle
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.
quelle
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,
result
ist 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.quelle
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).
quelle
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
return
sofortigen Ausführen, sodass ich mich für die direkte Rückgabe entscheide. Daher gibt es keineresult
Variable.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.
quelle
Als ich in C ++ gearbeitet habe und ich vermute, dass dies in Java zutrifft, habe ich es getan.
z.B
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.
quelle
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:
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 ''.
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.
quelle
In Object Pascal ist dies keine Wahl. Sie müssen der
Result
Variablen irgendwo im Code der Funktion einen Wert zuweisen .Beispiel:
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.
quelle
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.
quelle
Ergebnis ist in Ordnung. Ich kann den Code auf den ersten Blick verstehen, sodass der Variablenname den Zweck erfüllt.
quelle