関数の出力を確認するために新しい変数を作成することは良い習慣ですか?


8

次の2種類の実装を検討してください。

public int add(int x, int y) {
    return mysteriousAdd(x, y);
}


public int add(int x, int y) {
    int output = mysteriousAdd(x, y);
    return output;
}

私の同僚は、デバッグ中にmysteriousAdd返される変数を見ることができ、スタックに追加の変数を作成するのはそれほどオーバーヘッドがないため、2番目の実装の方が優れていると述べています。今日のほとんどのコンパイラーは、追加の変数なしでデバッグ中に関数の応答を示すことができ、スタックでの追加の変数の作成も回避しているため、最初の実装の方が適切であり、彼のポイントはそれほど有効ではないと思います。

スタックでの参照変数の作成は安価な操作ですか?上記の2つの方法のうち、コーディングに適しているのはどれですか。その理由は何ですか。


2
C#に対する同様の質問:softwareengineering.stackexchange.com/questions/141711/…、ほぼ重複しています。
Doc Brown

回答:


16

このような2つの関数のアセンブリ、バイトコード、ILなどの出力を比較すると、両方が同じであることがわかります。ほとんどのブッシュリーグのコンパイラを除くすべてが、余分な値を最適化します。

したがって、パフォーマンス/メモリに関する考慮事項はすべて破棄する必要があります。

だから、読みやすさに関してあなたの選択をしてください。この例では、戻る前に戻り値を識別する値は実際にはありません。ただし、20行の計算などの最下部にいる場合は、返される前に名前付きの値を作成することは価値があることがよくあります。その名前は、計算が何をもたらすかについての情報を読者に示すことができるためです。


4
ブレークポイントを設定して返されようとしている値をチェックすることが可能であるため、私は厳密に必要ではない変数を作成することがよくあります。
Simon B

3
@SimonB、「変数のデバッグ」を回避する別のアプローチは、テストを作成することです。テストにより、デバッグ時間が90%削減されます。
Fabio

@Fabio、もちろんテストが失敗し、デバッグする必要がある場合を除いて、変数をブレークアウトしてブレークポイントを設定できます:D
Hangman4358

1
@ Hangman4358 true of time of 10%:)しかし、テストでは常に出力結果をアサートするコンシューマがいるため、テストレベルで常に戻り値をキャッチします。特定のテストがある場合は、テストが失敗した理由がわかります;)
Fabio

私が(ほぼ)ローカルにいる場合は、常にそれを返します(それがないと、より複雑になるため)、通常はresult(省略形かもしれません)呼び出します。その名前は本当にそれをすべて言います。
Deduplicator

1

プログラミング環境で、変数を使用せずに関数呼び出しの結果を、一時変数を使用せずに簡単に読み取ることができることを示します。私は非常に優れたコーディング環境だと思っているものを使用していますが、使用できません。

だからそれを実証する。可能であれば、同僚は何かを学びました。できない場合は、何かを学びました。

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