メソッドが変数名result
で返す変数を呼び出すのは良い習慣ですか?
例えば:
public Zorglub calculate() {
Zorglub result = [...]
[...]
return result;
}
または、タイプ別に名前を付ける必要がありますか?
public Zorglub calculate() {
Zorglub zorglub = [...]
[...]
return zorglub;
}
私はどちらも実際に見たことがありますが、どちらかを選択する必要がある場合、前者または後者(またはより良い名前)を好む理由は何ですか?
主にJavaについて考えています。
これがメソッド変数である場合、それは本当に読みやすさに依存します。
変数宣言とメソッドの戻り値の型の両方に型名が既にあるので、result
を使用することもできます。これは、変数の役割を説明するものです。
変数の名前がresult
であると、相互読み取りが容易になります。これにより、意図が明確になります。
If戻り変数が必要な場合(実際にはめったに発生しない)、常にret
と呼び、常に関数のすぐ下に定義します頭。関数にはすでに名前があり、それが返すものについてすべてを述べています。
私がmyFunction
Icouldという名前を持っている場合、それは変数myFunctionReturnValue
を返し、まったく同じことを言いますが、私だけが毎回それを明示的に言わなければなりません。関数は一般的に短いはずなので、そのような明示性は必要ありません。そして、道に迷ったとしても、宣言にジャンプして、関数定義のすぐ下に着地します。
しかし、暗黙的に(ret
またはresult
のように)、または明示的に(myFunctionReturnValue
またはmyFunctionResult
などの)状態ではない他の名前は、これが現在の関数の戻り変数は一般的すぎます。
2番目の例では、zorglub
はひどい選択です。宣言からわかるのは、変数を作成したということです。その名前は、名前のすぐ隣にある型注釈と同じです。 int someInt
またはZorglub z
とほぼ同じくらい役に立ちます。
最初の例では、コードを見ると、最初に関数名が表示され、この関数がZorglub
を計算していることがわかります。 2行目を読むと、「わかりました、ここにzorglubが返されますが、すぐに返せないため、result
変数に保存されています」注:値を再割り当てしない場合は、変数finalを宣言してそれを伝えることをお勧めします)。次に「値が返される前に、何が起こるか見てみましょう」と思います。最初の例とは異なり、thisが変数であることを知るために、実際にそれ以上読み取る必要はありません。理解したいのであれば、関数本体をフォローしたい。
Spartanプログラミング について読みたいと思うかもしれませんが、これはあなたの質問にかなり関係しています。
2番目の例では、結果のtypeをそれが何であるかと融合しています。
Zorglub zorglub;
それが2度Zorglubだと私に告げるだけです。メソッドの戻り値の型を読みたくない場合は3回。しかしながら、
double variance;
たとえば、プログラムのセマンティクスの観点から、戻り値meansについての手掛かりを教えてくれます。メソッドのサイズに応じて、単にresult
を呼び出すよりも明確である場合とそうでない場合があります。これは、各メソッドIMOの判断呼び出しです。
メソッド内で多くのZorglubオブジェクトを操作すると、間違いを犯して間違ったオブジェクトを返す可能性があります。または、他のオブジェクトに名前を付けたくなる可能性がありますzorglub1
、zorglub2
など.
result
という名前を付けた場合、そのような間違いをする可能性はありません。さらに、それは良い名前だと思います。 returnedValue
またはreturnedObject
も何度か見たことがありますが、少し長めですがはっきりしています。
個人的には、変数名としてresult
を使用することに完全に満足していません。結局のところ、関連する値はなんらかの計算の結果であることがわかります。ただし、プログラムで使用される変数/フィールドの約(またはそれ以上)は90%に当てはまると思います。
さらに、他のいくつかの回答が指摘したように、メソッド/関数から返される値をマークするために使用される場合があります。ただし、メソッドを短くして、1つのことだけに集中し、一貫して単一レベルの抽象化に留まる場合、ローカル変数は多くなく、メソッドが返すものを確認するのは簡単です。
したがって、メソッドを短く簡潔にして、囲んでいるメソッド内のローカルの役割ではなく、変数に名前を付けて、それらが保持する値の意味を表すようにします。ただし、(たとえば、レガシーコードでは)Zorglub result
はZorglub zorglub
よりも確かに理解しやすいかもしれません。
タイプ別に名前を付ければよいですか?
いいえ。これはシステムハンガリー語と呼ばれ、必要に応じていつでも変数の型を表示できるプログラムを使用するという考えによって、少し古くなっています。
コードでanythingと名付ける必要があるときはいつでも、わかりやすく、意味があり、読みやすい名前を指定する必要があります。戻り変数の場合は、人々がネーミングに満足する傾向がある場合の特に良い例です。
明確に名前が付けられている関数があり、コードが1行だけ必要な場合は、名前を完全にスキップできます。メソッドを短く単一の目的にすることは、常にあなたが目指すべき理想です。ただし、関数を数行のコードで完了する必要がある場合もあります。このような場合、関数の目的に合わせて変数に名前を付けることをお勧めします。
関数の目的が計算または決定アルゴリズムの結果を返すことである場合、result
は使用する変数にとって完全に適切な名前ですが、関数がリストから項目を返す場合はどうなりますか?関数が数学やリストとは関係のない他の目的を果たしている場合はどうなりますか?そのような場合、関数が作成された理由に関連する意味のある名前を変数に提供することをお勧めします。もちろん、結果は必要に応じて単純に使用することもできます。他の名前と競合する可能性が低いためです。ただし、読みやすさの観点からは、より意味のあるコンテキストで変数に名前を付ける方が理にかなっています。
個人的には、関数/メソッドから返される値にresult
という名前を使用しています。返される値であることを明示します。同じ型の変数が複数存在する可能性があるため、型で名前を付けるのは便利ではないようです。
違いは何ですか?同じ2つの単語が同じことをするので、本当の問題は、どちらがより明確に聞こえるかです。
「結果」または「zorglub」。
最初にZorglubResult
を使用してresult returns fromZorglub
が他の結果と比較して簡単に見えることを確認したいと思います。 。
再帰関数では、末尾呼び出しの最適化を行うために、ステップごとに結果を運ぶことが効果的であることがよくあります。ユーザーにパラメーターを提供する必要がないことを知らせるには、パラメーターに「結果」という名前を付けるのが妥当です。
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行の短い方法では、「結果」は名前の問題にはなりません。
Object Pascalでは、これは選択できません。関数のコードのどこかでResult
変数に値を割り当てる必要があります。
例:
function AddIntegers( A,B: Integer): Integer;
begin
Result := A + B;
end;
だから私にとってはかなり自然なことですが、戻り値を受け取るために "Result"(または "Retorno"、ポルトガル語で綴るので、言語の予約語との名前の競合を避けるため)変数を持っています。
当然のことながら、C派生言語での非常に単純な式の場合、結果変数を宣言する必要はありません。式を直接返します。
結果に名前を付けるだけでなく(私は 'r'に特別です)、それがどのように使用されるかも示します。たとえば、return変数を使用する場合、すべてのreturnステートメントがそれを返す必要があります。 'return r;'はありません。最後に、メソッド/関数全体に「return m * x + b;」のようなものを振ります。「r = m * x + b; return r; "代わりに。
私はそれらを組み合わせるのが好きで、それが何であるか、そしてそれが返されることを意図していることを示しています。
あなたの例ではそれはresultZorglubです
それが何であるかが実際には問題ではない場合(resultStringではなく)結果である場合
ある時点で戻り値を設定してから、条件式を使用してそれを変更する可能性のあるすべてのコードをスキップすることと、すぐにreturn
ingを行うことの間に大きな違いは見られないので、直接戻ります。 result
変数はありません。
条件付きコードによって変更される場合と変更されない場合がある中間値がある場合、それは(まだ)結果ではないので、名前を付けるべきではありません。
私がC++で作業していたとき、これはJavaで適用されたと思われます。
例えば.
int Width() const
{
Requires(....);
Requires(....);
//calculation
Ensures(...);
Ensures(...);
return Result;
}
保証ブロックはメソッドの最後にある必要があるため、これは契約による設計です。しかし、リターンは最後でなければなりません。 Resultを返すことが、ensureブロックに従うことができる唯一のものであるというルールがありました。