Это - плохая практика для инициализации переменной к фиктивному значению?

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

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

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

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

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

например.

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

)

6
задан Community 23 May 2017 в 12:11
поделиться

5 ответов

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

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

6
ответ дан 17 December 2019 в 00:05
поделиться

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

0
ответ дан 17 December 2019 в 00:05
поделиться

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

т.е.

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

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

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

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

0
ответ дан 17 December 2019 в 00:05
поделиться

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

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

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

Затем он также предполагает, что этот сегмент кода является только кодом в методе, в котором он содержится, т. Е. Метод только выполняет one thing

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

0
ответ дан 17 December 2019 в 00:05
поделиться

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

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

1
ответ дан 17 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: