6

この質問は、私が今尋ねたこの質問への回答の結果です。

このコードは、変数を決して読み取られない値に初期化するため、「醜い」と主張されました。

String tempName = null;
try{
    tempName = buildFileName();
}
catch(Exception e){
    ...
    System.exit(1);
}
FILE_NAME = tempName;

これは本当に悪い習慣ですか?実際には決して使用されないダミー値に変数を初期化することを避けるべきですか?

(編集-そして、""値を文字列に連結するループの前に文字列変数を初期化するのはどうですか...?またはこれは別のカテゴリにありますか?

例えば

String whatever = "";
for(String str : someCollection){
   whatever += str;
}

)。

4

5 に答える 5

6

言語で必要とされない限り使用されない値に変数を初期化しても意味がないと思います。

たとえば、C# では、宣言された文字列変数の既定値は null であるため、明示的に書き出しても何も得られません。これは主にスタイルの選択ですが、文字列は不変であるため、それを別のものに初期化すると、実際には余分な文字列がメモリに割り当てられ、とにかく捨てることになります。他の言語では、他の考慮事項が必要になる場合があります。

于 2010-05-05T14:39:35.213 に答える
1

文字列ループに関しては、代わりに StringBuilder に変更すれば、それについて考える必要さえありません。

編集:他の人がよりよく答えたビットを削除しました。

于 2010-05-05T14:42:47.707 に答える
0

習慣として、私は変数を任意の値に設定することを避け、代わりにデフォルト値に初期化する傾向があります。

すなわち

int x = 0;
string name = "";
bool done = false;
Person randomGuy = null; //or = new Person();

私がこの方法を最も気に入っている理由は、コードに統一感をもたらしながら、次の担当者に次のような処理を強制することがないからです。string name = "luke skywalker";

これは個人的な好みなので、プログラマーによって異なります。

少なくとも、プロジェクトが設定した基準に従う必要があります。レガシー コードがこれらのことをどのように処理するかについてのアイデアが得られます。システム全体で全体的なコーディング スタイルが同じになるように、それに準拠するのがおそらく最善です。

于 2010-05-05T14:37:53.033 に答える
0

コンパイラに依存します。C# コンパイラでは、使用する前に変数を初期化する必要があります。しかし、CLR にはこの要件がありません。実行時に、CLR は変数が初期化されているかどうかを確認します。そうでない場合は、nullreference 例外がスローされます。

于 2010-05-05T14:39:04.027 に答える
0

私の意見では、Martin Fowler の言葉の意味で、「コードの匂い」と呼ぶ方が正確かもしれません。

デフォルトの初期化を単独で変更できるとは思いません。他のリファクタリング方法と組み合わせて行う必要があります。また、一時変数が不要になるようにコードをリファクタリングしたことも前提としています。

try{  
    FILE_NAME = buildFileName();  
    //Do other stuff with file name
}  
catch(Exception e){  
    ...  
    System.exit(1);  
} 

また、このコード セグメントは、それが含まれているメソッド内のコードのみであると仮定します。つまり、メソッドは 1 つのことだけを行います。

私がコーディングしているとき、私は一時変数でダミー値を使用していることを心配しますが、そのセクションのコーディングが終了したときにのみ変更し、意図したとおりに問題を解決し、他のリファクタリング手順と組み合わせてのみ変更します.

于 2010-05-05T14:47:24.460 に答える