0

多くの場合、コードでは、一時変数が必要なシナリオに行き着きます-例:

文字列tempUserName = input.getUserName();
tempUserName = sanitzie(tempUserName);
検証 (一時ユーザー名);
// ... tempUserName で別の処理を行う

文字列tempUserNickName = input.getUserNickName();
tempUserNickName = sanitzie(tempUserNickName);
検証 (tempUserNickName);
// ... tempUserNickName で別の処理を行う

...
...

一部の人々は、次のような目的で単一の一時変数を使用していることを知っています。

文字列temp = input.getUserName();
temp = sanitzie(一時);
検証 (一時);
// ... temp で別の処理を行う

temp = input.getUserNickName();
temp = sanitzie(一時);
検証 (一時);
// ... temp で別の処理を行う

...
...

私の意見では、私の書き方はより明確で、エラーが発生しにくいものです。

私の質問は、次の単一の一時変数を使用する利点はありますか?

  1. メモリ消費の観点
  2. パフォーマンスの観点
  3. その他の視点

質問の範囲をString変数のみに制限しましょう。ただし、より一般的なフィードバックをいただければ幸いです。

4

5 に答える 5

2

メモリ消費量とパフォーマンスは関係ありませんが、すべての非最終変数はコードを読みにくくします。再割り当てされている場所を一目で正確に確認することはできません。探しているバグがある場合、これは困難を伴います。私の提案、そして私がコードで日常的に行っていることは、呼び出し側でローカル変数さえ必要としないようにメソッドに抽出することです。常に関数合成の観点からコードを書く傾向があります。

于 2012-05-29T10:03:58.080 に答える
2

また、ローカル変数を再利用しないことを好みます。パフォーマンスの側面はここでは重要ではありません。無視できるほどのごくわずかな時間の増減があるからです。そして、JITはとにかく両方に対して同じネイティブコードを生成することができます。

重要なのは読みやすさと保守性です。そして、私があなたのコードで見ているのは、元のコードが次のようになるように、追加のメソッドが必要であるということです。

sanitizeAndValidate(input.getUserName());
sanitizeAndValidate(input.getUserNickName());

これにより、コードがより明確になり、テストしやすくなり、繰り返しが回避され、一時変数がsanitizeAndValidate()メソッドで1回だけ定義されるため、最初の質問は無関係になります。

于 2012-05-29T10:05:04.473 に答える
1

これに対する私の主な答えは、これらの種類のステートメントのシリーズがある場合、グループ化を、呼び出す別の関数に分割することです。(これには一時変数が1つだけあります。)例:

private String handleInput(String val) {
    val = sanitzie(val);
    validate(val);
    // ... Do something else with val

    return val;
}

使用法:

String finalPlaceForUserName     = handleInput(input.getUserName());
String finalPlaceForUserNickName = handleInput(input.getUserNickName());

...無効または危険な入力などhandleInputが返される可能性があります。上記よりも多くのパラメータを設定する必要がある場合があります。nullhandleInput

あなたが提起した視点に答えてください:

メモリ消費の観点

技術的には、一時変数が1つしかない場合、以前のメモリは以前のガベージコレクションの対象になります(たとえば、メソッドが後でではなく実行されている間)しかし、それが現実の世界に違いをもたらすとは思えません。

パフォーマンスの観点

想像もできません。

その他の視点

私たちはおそらくここでスタイルに行き着きますが、それは主に個人的な好みの問題です。繰り返しになりますが、私はそれを関数に分割します。これは、質問のエンドランのようなものです。:-)

于 2012-05-29T10:05:01.930 に答える
0

パフォーマンスの違い (メモリに関して) は考慮に入れるには小さすぎます。

さらに重要なことは、コードを読みやすくし、重要な部分を最適化することです。

于 2012-05-29T10:07:18.277 に答える
0

それらはいいスタイルではありませんが、それらの繰り返しが発生します。私はよくします:

{
    String s = ...
    something with s;
}
{
    String s = ...
    something with s;
}
于 2012-05-29T10:10:31.533 に答える