Этим вопросом является результат ответов на этот вопрос, который я просто задал.
Утверждалось, что этот код "ужасен", потому что это инициализирует переменную к значению, которое никогда не будет читаться:
String tempName = null;
try{
tempName = buildFileName();
}
catch(Exception e){
...
System.exit(1);
}
FILE_NAME = tempName;
Это - действительно плохая практика? Нужно постараться не инициализировать переменные к фиктивным значениям, которые никогда не будут на самом деле использоваться?
(РЕДАКТИРОВАНИЕ - И что относительно того, чтобы инициализировать Строковую переменную к ""
перед циклом, который свяжет значения к Строке...? Или это находится в отдельной категории?
например.
String whatever = "";
for(String str : someCollection){
whatever += str;
}
)
Я думаю, нет смысла инициализировать переменные значениями, которые не будут использоваться, если этого не требует язык.
Например, в C # значение по умолчанию для объявленной строковой переменной - null, так что вы даже ничего не получите, если явно выпишете ее. В основном это выбор стиля, но поскольку строки неизменяемы, инициализация их чем-то другим фактически выделит дополнительную строку в памяти, которую вы все равно просто выбросите. Другие языки могут налагать другие соображения.
Это зависит от компилятора. Компилятор C # требует, чтобы переменная была инициализирована перед использованием. Но в CLR этого требования нет. Во время выполнения CLR проверяет, инициализирована ли переменная или нет. Если нет, это вызовет исключение с нулевой ссылкой.
Как практика, я склонен избегать установки переменных на произвольные значения, и вместо этого инициализирую их значением по умолчанию.
т.е.
int x = 0;
string name = "";
bool done = false;
Person randomGuy = null; //or = new Person();
Мне больше всего нравится этот метод, потому что он привносит чувство единообразия в ваш код, не заставляя следующего человека, который придет, разбираться с такими вещами, как: string name = "luke skywalker";
Это все скорее личные предпочтения, поэтому у разных программистов они будут разными.
В крайнем случае, вы должны следовать стандартам, установленным в вашем проекте. Вы будете иметь представление о том, как унаследованный код обрабатывает эти вещи, и, вероятно, лучше соответствовать им, чтобы общий стиль кодирования был одинаковым для всей системы.
На мой взгляд, было бы правильнее сослаться на нее как «запах кода» - в смысле слова Мартина Фаулера.
Я не думаю, что вы можете изменить инициализацию по умолчанию изолированно - это нужно делать вместе с другими методами рефакторинга. Также предполагается, что вы провели рефакторинг своего кода, так что вам не нужны временные переменные:
try{
FILE_NAME = buildFileName();
//Do other stuff with file name
}
catch(Exception e){
...
System.exit(1);
}
Затем он также предполагает, что этот сегмент кода является только кодом в методе, в котором он содержится, т. Е. Метод только выполняет one thing
Когда я кодирую, меня беспокоит, что я использую фиктивные значения с временными переменными, но я бы изменил их только тогда, когда я закончу кодирование этого раздела, и это решит проблему, как задумано - и только в сочетании с другим рефакторингом шаги.
Что касается строкового цикла, если вы измените его на StringBuilder, вам даже не придется об этом думать.
Edit: удаленные биты, на которые лучше отвечают другие.