Вы обычно устанавливаете значение по умолчанию раньше или устанавливаете его в другом? - PullRequest
6 голосов
/ 04 января 2009

Что из следующего вы делаете:

var = true;
if (...) var = false;

Или

if (...) var = false;
else var = true;

Есть ли причина, по которой вы выбираете или другая?

Я работаю в предположении, что с вар. Следующая строка кода может выглядеть примерно так:

if (var) { ... }

Ответы [ 13 ]

9 голосов
/ 04 января 2009

как насчет var = {...} напрямую, поскольку это логическое значение?

5 голосов
/ 04 января 2009

Я предпочитаю второе в Java, делая что-то вроде этого:

int x;
if (cond) {
  x = 1;
} else {
  x = 5;
}

потому что, если что-то будет изменено позже (например, я превращаю блок else в else if), компилятор скажет мне, что переменная не была инициализирована, что я мог бы пропустить, если бы использовал ваш первый стратегия.

3 голосов
/ 04 января 2009

Вы также можете использовать троичный оператор, если ваш язык поддерживает его:)

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

2 голосов
/ 04 января 2009

Если вы установите значение по умолчанию, то позже вы снова сбросите его на что-то другое, хотя это очень небольшое количество, но все равно это пустая трата ресурсов. Таким образом, большую часть времени для большей части кода сбалансированный синтаксис if / else или даже синтаксис (? :) более понятен и более уместен, за исключением:

Иногда, если вы создаете резервный код (или функцию принятия решения), где вы начинаете с определенного условия, а затем тестируете целый ряд других условий, чтобы увидеть, изменится ли это, тогда вы определенно хотите сначала установите значение по умолчанию:

int final = 27;

if ( some condition ) final = 86;

if ( another condition ) {
    final = 98;
    return final;
}

if ( some state ) {
   final += 2;
}

return final;

Или что-то похожее на это.

Кстати: в вашем примере, если вы установите 'var', то следующая строка просто проверяет 'var', вам действительно не нужен 'var', не так ли? Если условие настолько безобразно, что использование 'var' помогает сделать его читабельным, тогда, вероятно, лучше всего переместить условие в его собственную функцию, если допустить, что дополнительный вызов функции предназначен для удобства чтения. В общем, вы можете тратить ресурсы, если и только если получите взамен что-то значительное, например, читабельность.

Paul.

1 голос
/ 04 января 2009

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

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

if (a==b) {
  if (a==c) {
    [new logic]
    var=false
  }
}
else {
  var = false
}

На первый взгляд, это выглядит маловероятным, но это случается тревожно часто (честно говоря, часто ситуация возникает после оригинала, если она стала намного сложнее). Первоначальная инициализация предотвращает это.

1 голос
/ 04 января 2009

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

1 голос
/ 04 января 2009

Зависит от контекста. Я хотел бы использовать второй вариант, когда ясно, что 'var' должен быть истинным, если IF терпит неудачу.

0 голосов
/ 05 января 2009

Везде, где вы пишете if (), также пишите else - даже если оно пустое.
Компилятор оптимизирует его, но заставляет вас (и всех программистов после вас) задумываться о том, когда if () не срабатывает, каковы последствия?

0 голосов
/ 05 января 2009

Если инициализация настолько сложна, что прямое выражение не может быть написано без ошибок, я иногда нахожу полезным обрабатывать этот случай как

boolean isFoo = determineWhetherFoo(...);

где determineWhetherFoo принимает любые аргументы, необходимые для определения, и возвращает соответствующий логический результат. Это очень ясно показывает, что означает переменная и от чего она зависит. Инициализация переменной к возможно неправильному значению, сопровождаемая пачкой кода, который может изменить ее значение, может иногда скрывать то, что выражается.

0 голосов
/ 04 января 2009

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

int timeout = 100;
if (moreTime) timeout = 1000;

int searchOption = null;
if (sometest1) searchOption = 1;
if (sometest2) searchOption = 2;

// then later..
if (searchOption != null)
  .....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...