web-dev-qa-db-ja.com

返される変数に「結果」という名前を付けるのは良い習慣ですか?

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

例えば:

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

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

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

私はどちらも実際に見たことがありますが、どちらかを選択する必要がある場合、前者または後者(またはより良い名前)を好む理由は何ですか?

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

44
Nicolas Raoul

これがメソッド変数である場合、それは本当に読みやすさに依存します。

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

48
Oded

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

40
mouviciel

If戻り変数が必要な場合(実際にはめったに発生しない)、常にretと呼び、常に関数のすぐ下に定義します頭。関数にはすでに名前があり、それが返すものについてすべてを述べています。

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

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

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

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

Spartanプログラミング について読みたいと思うかもしれませんが、これはあなたの質問にかなり関係しています。

17
back2dos

2番目の例では、結果のtypeそれが何であるかと融合しています。

Zorglub zorglub;

それが2度Zorglubだと私に告げるだけです。メソッドの戻り値の型を読みたくない場合は3回。しかしながら、

double variance;

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

12
Useless

メソッド内で多くのZorglubオブジェクトを操作すると、間違いを犯して間違ったオブジェクトを返す可能性があります。または、他のオブジェクトに名前を付けたくなる可能性がありますzorglub1zorglub2など.

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

8
Jalayn

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

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

したがって、メソッドを短く簡潔にして、囲んでいるメソッド内のローカルの役割ではなく、変数に名前を付けて、それらが保持する値の意味を表すようにします。ただし、(たとえば、レガシーコードでは)Zorglub resultZorglub zorglubよりも確かに理解しやすいかもしれません。

5
Péter Török

タイプ別に名前を付ければよいですか?

いいえ。これはシステムハンガリー語と呼ばれ、必要に応じていつでも変数の型を表示できるプログラムを使用するという考えによって、少し古くなっています。

1
DeadMG

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

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

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

1
S.Robins

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

1
Juraj Blaho

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

「結果」または「zorglub」。

最初にZorglubResultを使用してresult returns fromZorglubが他の結果と比較して簡単に見えることを確認したいと思います。 。

1
Berker Yüceer

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

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フィールド、文字列表現、数値、およびデータベース用のGUIフィールドがあるため、別の変数を使用すると混乱の可能性が高くなります。 3〜7行の短い方法では、「結果」は名前の問題にはなりません。

0
user unknown

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

例:

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

だから私にとってはかなり自然なことですが、戻り値を受け取るために "Result"(または "Retorno"、ポルトガル語で綴るので、言語の予約語との名前の競合を避けるため)変数を持っています。

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

0
Fabricio Araujo

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

0
rbp

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

あなたの例ではそれはresultZorglubです

それが何であるかが実際には問題ではない場合(resultStringではなく)結果である場合

0
KeesDijk

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

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

0
Simon Richter

私がC++で作業していたとき、これはJavaで適用されたと思われます。

例えば.

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

    //calculation

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

保証ブロックはメソッドの最後にある必要があるため、これは契約による設計です。しかし、リターンは最後でなければなりません。 Resultを返すことが、ensureブロックに従うことができる唯一のものであるというルールがありました。

0
ctrl-alt-delor