返された変数に「result」という名前を付けるのは良い習慣ですか?[閉まっている]


44

メソッドが返す変数を変数名で呼び出すのは良い習慣resultですか?

例えば:

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

または、タイプ別に名前を付ける必要がありますか?

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

私は両方を野生で見ましたが、どちらかを選択する必要がある場合、前者または後者(またはより良い名前)を好む理由は何ですか?

私は主にJavaについて考えています。


73
私もofTheJediその目的で使用されているのを見ました。私はそれを見たと言って、お勧めではありません。Zorglub ofTheJedi = //...; return ofTheJedi;

7
私は通常「retval」(返す値)と呼びますが、これは「result」とほぼ同じです。
ゼータ2

5
誰もが異なる答えを持っています。それらはすべて似ていますが、異なっており、有効です。質問は喜んで主観的ではありませんが、答えはそうです。世論調査のようなものです。
ZJR

16
変数としての「結果」は問題ありませんが、関数としての「計算」は絶対にそうではありません。
カズドラゴン

2
元デルファイのプログラマーと仕事をしていますか?
ピーターターナー

回答:


48

これがメソッド変数である場合、実際には可読性に依存します。

変数の宣言とメソッドの戻り値の型の両方に既に型名があるので、使用するresultこともできます-変数の役割を説明しています。


40

変数の名前がの場合、相互読み取りが容易になりますresult。これにより、意図が明確になります。


2
+1これがポイントです。コードをちらっと見るだけで、どのようなコンテキストでも結果が何を意味するかがわかります。
-Xeoncross

1
変数型を使用しても、それを返すことを理解する助けにはなりません。これらの簡単な例では、スクロールや検索なしの戻り値を確認する方が簡単ですが、関数の戻り値が何であるかを事前に知る方が高速です。例で行われているように、初期化することも重要です。
nycynik

17

戻り変数が必要な場合(実際にはめったに起こりません)、私は常にそれretを呼び出し、常に関数ヘッドのすぐ下で定義します。関数にはすでに名前があり、返されるものについてすべてを示しています。

私が持っている場合はmyFunction、私は可能性があり、それの戻り変数に名前をmyFunctionReturnValueまったく同じことを言って、私だけは、明示的に毎回それを言う必要があるだろう。通常、関数は短くする必要があるため、そのような明示性は必要ありません。そして、たとえ道に迷ったとしても、宣言にジャンプして、関数定義のすぐ下に着地します。

しかし、暗黙的に(retまたはのようにresult)または明示的に(myFunctionReturnValueまたはのようにmyFunctionResult)状態でない、これが現在の関数の戻り変数であるその他の名前は、あまりにも一般的です。

2番目の例でzorglubは、ひどい選択です。宣言は、変数の名前が名前のすぐ隣にある型注釈に等しいという変数を作成したということだけです。int someIntまたはとほぼ同じくらい役立ちますZorglub z

最初の例では、コードを見ると、この関数がを計算することを示す関数名が最初に表示されますZorglub。2行目を読むと、「わかりました、ここに返されるzorglubがありますが、すぐには返せないので、result変数に格納されているようです」(補足として:値を再割り当てするつもりはないので、それを伝えるために変数finalを宣言するのが最善です)、「返される前に何が起こるか見てみましょう」と思います。最初の例とは異なり、これが変数であること、それが返されること、そしてそれを理解したい場合は関数本体をフォローすることを知るために、実際にそれ以上読む必要はありません。

Spartan Programmingを読んでみてください。これはあなたの質問にかなり関連しています。


8
「zorglubはひどい選択です」の+1。どのようなコンテキストでも、変数名が型名と同じである(最初の大文字を除いた)変数名を持つ理由はありません。宣言は、変数のタイプを示します。変数の名前は、変数の名前をx1、x2、x3などと呼ぶよりも優れています。変数の名前は、変数の目的または目的を表す必要があります。この特定の場合の変数の優先名はtoReturnです-変数は返すオブジェクトを参照するためです。実際、多くの変数名は「to」で始まります。
ダウッドはモニカを復活させると

21
@DavidWallace-それは絶対に強すぎる。というクラスがありContainerます。数量を変更するメソッドがある場合、メソッドvar container = getContainer(id); container.Quantity += 1; のコンテキストが単一のコンテナーでのみ動作する場合、それは確かに読み取り可能であり、それですべてです。それを呼ぶのtheContainerWeAreGoingToAdjustTheQuantityOfはばかげている。
スコットホイットロック

4
@David、私は同意しません。それぞれが異なるタイプの複数のローカル変数(たとえば、ユーザー、マネージャー、部門)がある状況を考えてみましょう。そして、タスクがユーザーを部門とマネージャーのチームにリンクすることであると仮定します。私見では、このUserインスタンスを単に呼び出すことは完全に問題ありませんuseruserToJoinThisDepartmentAndManager?または何を選択しますか?)
PéterTörök12年

10
ちょっとした選択:「ret」、「rv」、またはresult / returnValueの他の省略形を見るのは嫌です。「結果」はそれほど長くなく、キャラクターを保護する必要はありません。
クリストファージョンソン

2
@KristopherJohnson:「結果」はそれほど長くありませんが、「戻り値」を意味するわけでもありません。戻り値は常に計算の結果とは限りません。逆に、計算の結果は常に戻り値とは限りません。私はあなたの戻り値に名前を付けることができたとしreturnValueますが、ret同じように、伝統的であるintchar
-ruakh

12

2番目の例では、結果のタイプそれが何であるかと混同しています

Zorglub zorglub;

ゾーグルブだと二度言います メソッドの戻り値の型を読み取るのが面倒な場合は3回。しかしながら、

double variance;

たとえば、プログラムのセマンティクスの観点から、戻り値の意味についての手がかりを与えてくれます。resultメソッドのサイズに応じて、単に呼び出すよりも明確である場合と明確でない場合があります。これは、各メソッドIMOの判定呼び出しです。


8

あなたがプレイする場合、多くのZorglubがあなたのメソッド内のオブジェクトを、あなたはミスを犯すと、間違ったものを返す、または/および、あなたは他の人に名前を付けるように誘惑することができ、「可能性」zorglub1zorglub2など、

名前を付けた場合result、そのような間違いをする可能性はありません。さらに、それは良い名前だと思います。また、私は見てきたreturnedValueか、returnedObject少し長いが、それはまた明らかだ、数回。


5

私は個人的にresult変数名として使用することに完全に満足していません。結構なことですが、関連する値は何らかの計算の結果であることを教えてくれますが、プログラムで使用される変数/フィールドの約90%(またはそれ以上)に当てはまると思います。

さらに、他のいくつかの回答が指摘したように、メソッド/関数から返される値をマークするために使用できます。ただし、メソッドを短くし、1つのことだけを行い、単一レベルの抽象化に一貫してとどまる場合、ローカル変数はあまり多くなく、メソッドが返すものを確認するのは簡単です。

そのため、メソッドを短く簡潔に保ち、変数に名前を付けて、囲んでいるメソッド内でのローカルロールではなく、保持する値の意味を表現することを好みます。ただし、(たとえば、レガシーコードの場合)の方Zorglub resultが確かに理解しやすいかもしれませんZorglub zorglub


12
何らかの計算のresult結果であるため、呼び出されません。この計算のresult結果であるため、呼び出されます。可能な限り最も具体的な意味でなくても、それはIMOの意味としても機能します。意味を表現することは黄金ですが、意図イディオムも価値があります。この場合、それは少しトレードオフです。
12

@Supr:他の計算の結果を説明するためにどの名前を使用しますか。次のステートメントでのみ使用されます(たとえばif (result >= 0) numChars+=result; else break;、その計算は問題の計算から明らかですか?)それがされますから返されるこの呼び出されるべき関数ret値ながら、最後呼び出された関数から返されたがどうあるべきresultresult関数の戻り値が、たとえば数量またはエラーコードを表す場合、長い名前よりも意味があることに注意してください。
-supercat

@supercat、計算が何であるか、または値の使用目的に基づいて名前を付けます。次の計算でのみ使用される場合でも、名前が適切であれば読みやすくなります。あなたの例でresultは、コードの意味が何であるか、またはコードが実際に上位レベルで何をするのか分かりません。その値がどこから来て何であるかを見るために、どこに設定されているかを参照する必要があります。以下のようなものaddedCharsか、matchedCharsより透明で助けになるコードが何をしているのか明らかにし、これと関連ジャグリング精神的に必要としませresult = ...:)を
Supr

@Supr:問題は、多くの場合、戻り値の範囲が異なると意味が異なる可能性があることです。たとえば、指定されたサイズのバッファーにパケットを読み込むルーチンは、パケットが受信された場合はバイト数を返し、バッファーに対して大きすぎるパケットが保留中であることを示す負の数を返します。または、他のエラーを示す非常に大きな負の数。リターンを保存し、resultそれらの基準に対してチェックすることは、それらすべてをカバーする説明的な名前を思い付くよりも自然に思えます。
supercat

@supercat、ret代わりにを使用することはresult私には問題ないようです。それは短縮されており、名詞のようではないので、私の意見では少し明確ではありませんが、一貫して使用される場合、それはと同等resultです。
12

1

私は個人的にresult関数/メソッドから返される値の名前を使用しています。返される値であることを明示します。同じタイプの変数が複数存在する可能性があるため、タイプごとに名前を付けることは有用ではないようです。


ええ、確かに、返される前に「戻る」と言うという事実は十分に明白ですか?あなたはそれで何をするのか、今は「方法」を説明する必要があります。なぜあなたのコード意志準備「リターン合計」または類似した...その後、合計、結果、または目的の他の何かの記述を、それを呼び出すことはありませ
デイブ

@Dave必ずしも必要ではありません。特に、すべての候補が返される同じタイプのオブジェクトをいくつか持っている場合、メソッドの目的は、どちらが適切かを判断することです。
アンディ

@Andy私はあなたの主張を知っていますが、実際には、そのような関数を書くことは想像できません。それがそのような関数を書く理由であるならば、それはより小さくより理解しやすい関数に分解されるべきであるように聞こえます。
デイブ

1

違いは何ですか?同じことをする2つの異なる単語があるので、本当の問題はどちらがより明確に聞こえますか?

「結果」または「ゾルグルブ」。

私はZorglubResultスターターに使用して、結果があなたが持っているかもしれない他の結果とあなたが見ることができるその結果と比較するのがより Zorglub簡単であることを見るのを好むでしょう。


1

タイプ別に名前を付ける必要がありますか?

いいえ。これは、Systems Hungarianと呼ばれ、必要なときに変数の型を表示できるプログラムを使用するという考えにより、時代遅れになっています。


1

コードで何かに名前を付ける必要があるときはいつでも、わかりやすく、意味があり、読みやすい名前を付ける必要があります。戻り値変数の場合は、ネーミングに慣れる傾向がある場所の特に良い例です。

明確に名前が付けられた関数があり、1行のコードのみが必要な場合は、命名を完全にスキップできます。メソッドを短く、単一の目的にすることは、常にあなたが目指すべき理想です。ただし、場合によっては、数行のコードで関数を完了する必要があります。そのような場合、関数の目的に合わせて変数に名前を付けることを常にお勧めします。

関数の目的が計算または決定アルゴリズムの結果を返すことである場合result、変数が使用するのに完全に適切な名前ですが、関数がリストから項目を返す場合はどうでしょうか?関数が数学やリストとは関係のない他の目的に役立っている場合はどうなりますか?そのような場合は、関数が作成された理由に関連する意味のある名前を変数に指定することをお勧めします。もちろん、他の名前と衝突する可能性が低い名前なので、必要に応じて単に結果を使用できますが、読みやすさの観点からは、より意味のあるコンテキストで変数に名前を付ける方が理にかなっています。


0

私はそれらを組み合わせるのが好きで、それが何であり、返されることを意図していることを示しています。

あなたの例ではresultZorglubになります

結果が(resultStringではなく)単なるものであるよりも実際に重要でない場合


悪くはありませんが、戻り値の型が変更された場合、変数の名前を変更する必要があると思います。とにかく、最近のIDEでは、1回か2回のクリックで完了します。
ジャレイン

@Jalaynはい。ただし、型が名前から除外されていた場合、それはまったく変更する必要がない変更です。(メソッドが長すぎて単純な名前が明確でない場合は、おそらく長すぎてリファクタリングする必要があります。)
ドナルフェローズ

@DonalFellows私はあなたに完全に同意します。ソースリポジトリから更新するときに表示される変更が少ないほど優れています。
ジャレイン

わかりましたが、戻り値の型を変更するとき、変数名でもそれを変更するのを忘れる可能性があることに同意しました、それは問題です。今までそれは私にとって問題ではありませんでした。私はまだ名前にダブルインテントを表示するのが好きですが、すでに小さく表示されているインテントコードでは、過剰すぎるかもしれません。君たちは私を納得させた。今後、この方法で変数を呼び出す必要があると感じた場合は、必要性がなくなるまでリファクタリングします。ありがとう
-KeesDijk

0

ある時点で戻り値を設定してから、条件を使用してそれを変更する可能性のあるすべてのコードをスキップすることと、returnすぐに実行することとの間に大きな違いは見られないため、直接戻りに行くため、result変数はありません。

条件付きコードによって変更される場合と変更されない場合がある中間値がある場合、それは結果ではありません(まだ)。


0

私がC ++で作業していたときに、Javaでこれが当てはまると思います。

例えば

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

    //calculation

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

確認ブロックはメソッドの最後にある必要があるため、これは契約による設計です。しかし、リターンは最後でなければなりません。確認ブロックに続くことができるのは、結果を返すというルールのみでした。


0

再帰関数では、多くの場合、結果をステップごとに運び、末尾呼び出しの最適化を行うことが効果的です。ユーザーにパラメーターを提供する必要がないことを知らせるには、パラメーターに「result」という名前を付けるのが妥当です。

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)
}

しかし、多くの場合、「キャリー」と「これまで」を使用します。これらは、ほとんどの場合、野外で見たものであり、アイディアが少し良くなっています。

もちろん、2番目の理由は、算術評価を行う場合など、トピックが「結果」という単語を示唆している場合です。数式を解析し、変数を値に置き換え、最終的に結果を計算します。

3番目の理由はすでに述べましたが、私は少し逸脱しています:何らかの仕事を実行するメソッドを記述します。たとえば、 '' max ''の形式を評価するとしましょう。

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

結果 '' result ''を呼び出す代わりに、 '' max ''と呼ぶこともできますが、一部の言語ではメソッドを呼び出すときに括弧を省略できるため、maxはメソッド自体の再帰呼び出しになります。

一般的に、結果が何であるかを示す名前を好むでしょう。ただし、GUIフィールド、文字列表現、数値、データベース用の1つがあるため、別の名前を使用すると、混乱の可能性が高くなります。3から7行の短い方法では、「結果」は名前の問題ではないはずです。


0

Object Pascalでは、これは選択肢ではありません。Result関数のコード内のどこかに変数に値を割り当てる必要があります。

例:

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

だから私にとっては、戻り値を受け取るための「結果」(または、言語の予約語との名前の競合を避けるためにポルトガル語で綴る「レトルノ」)変数がかなり自然です。

当然ですが、C派生言語での非常に単純な式であれば、結果変数を宣言する必要はありません-式を直接返します。


0

結果に名前を付けるだけでなく(「r」に特化しています)、その使用方法も同じです。たとえば、戻り変数を使用する場合、すべてのreturnステートメントがそれを返す必要があります。'return r;'はありません。最後に、メソッド/関数全体に「return m * x + b;」のようなものを振りかけますuse "r = m * x + b; 代わりにreturn r; "


-1

結果は良好です。変数名が目的を果たすように、一目でコードを理解することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.