Это плохая практика для инициализации переменной фиктивным значением? - PullRequest
6 голосов
/ 05 мая 2010

Этот вопрос является результатом ответов на этот вопрос , которые я только что задал.

Было заявлено, что этот код "уродлив", поскольку он инициализирует переменную значением, которое никогда не будет прочитано:

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

Это действительно плохая практика? Следует ли избегать инициализации переменных фиктивными значениями, которые фактически никогда не будут использоваться?

(РЕДАКТИРОВАТЬ - А как насчет инициализации переменной String в "" перед циклом, который объединит значения в String ...? Или это в отдельной категории?

например.

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

)

Ответы [ 5 ]

6 голосов
/ 05 мая 2010

Я думаю, что нет смысла инициализировать переменные значениями, которые не будут использоваться, если этого не требует язык.

Например, в C # значение по умолчанию для объявленной строковой переменной равно нулю, так что вы даже ничего не получаете, явно записывая это. В основном это выбор стиля, но поскольку строки неизменны, инициализация их чем-то другим фактически выделит дополнительную строку в памяти, которую вы все равно просто выбросите. Другие языки могут навязывать другие соображения.

1 голос
/ 05 мая 2010

Что касается строкового цикла, если вы замените его на StringBuilder, вам даже не придется об этом думать.

Редактировать: удаленные биты лучше отвечают другим.

0 голосов
/ 05 мая 2010

На мой взгляд, было бы точнее назвать его «запахом кода» - в смысле слова Мартина Фаулера.

Я не думаю, что вы можете изменить свою инициализацию по умолчанию изолированно - это должно быть сделано в сочетании с другими методами рефакторинга. Также предполагается, что вы реорганизовали свой код, так что вам не нужны временные переменные:

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

Затем также делается предположение, что этот сегмент кода является только кодом в методе, в котором он содержится, то есть метод делает только одну вещь

Когда я пишу код, меня будет беспокоить, что я использую фиктивные значения с временными переменными, но я буду меняться только тогда, когда закончу кодирование этого раздела, и это решит проблему по назначению - и только в сочетании с другими шагами рефакторинга.

0 голосов
/ 05 мая 2010

Это зависит от компилятора. Компилятор C # требует инициализации переменной перед использованием. Но у CLR нет этого требования. Во время выполнения CLR проверяет, инициализирована ли переменная или нет. Если нет, то возникнет исключение нулевой ссылки.

0 голосов
/ 05 мая 2010

Как правило, я стараюсь избегать установки переменных в произвольные значения, а вместо этого инициализирую их значениями по умолчанию.

т.е.

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

Мне больше нравится этот метод, потому что он приносит ощущение единообразия в ваш код, не заставляя следующего парня, который придет, заняться такими вещами, как: string name = "luke skywalker";

Это все больше личного предпочтения, поэтому он будет отличаться у разных программистов.

По крайней мере, вы должны следовать стандартам, установленным вашим проектом. У вас будет представление о том, как унаследованный код справляется с этими вещами, и, вероятно, лучше всего соответствовать этому, чтобы общий стиль кодирования был одинаковым во всей системе.

...