Подтвердить что ты не робот

Ненужное выражение 'else'

Как вы знаете, в Eclipse вы можете включить проверку "Ненужное другое", которое будет запускаться на if-then-else с преждевременным возвратом. И, по моему опыту, есть две наиболее возможные ситуации, когда используется такое утверждение:

1) Предварительная проверка:

if (!validate(arg1)) {
    return false;
}
doLotOfStuff();

2) После проверки:

doLotOfStuff();
if (condition) { 
    return foo; 
} else {
    return bar; 
}

Во втором случае, если триггер включен, Eclipse предложит вам изменить код на:

doLotOfStuff();
if (condition) { 
    return foo; 
} 
return bar; 

Однако, я думаю, что выражение return with else более читаемо, поскольку оно похоже на прямое отображение бизнес-логики. Таким образом, я являюсь любопытным, если это соглашение об условном выражении "Ненужное" еще распространено или более предпочтительным является код с инструкцией else?

4b9b3361

Ответ 1

Как правило, я бы предпочел, чтобы структура кода соответствовала структуре лежащей в основе "бизнес-логики". В этом случае мой подход будет зависеть от того, что представляет condition. Если это, например, проверка на ошибку, которая обычно не будет удалена, но может иногда использоваться, то асимметрия второй формы соответствует асимметрии логики.

doLotOfStuff();
if (condition) { 
    return foo; 
} 
return bar; 

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

doLotOfStuff();
if (condition) { 
    return foo; 
} else {
    return bar; 
}

Код для программиста читается, а не компилятор.

Ответ 2

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

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

То, что стоит последнего, может быть лучше выражено как:

return condition ? foo : bar;

Предполагая, что condition не слишком длинный.

Не слишком беспокоитесь о предполагаемом "чистоте" кода. Это нерелевантное отвлечение. Сделайте все читаемым и, как правило, последовательным.

Ответ 3

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

Мои преподаватели в университете всегда мучили меня, что я должен писать такие вещи, как это было опубликовано кем-то раньше:

String result = null;
doLotOfStuff();
if (condition) {
    result = foo;
} else {
    result = bar;
}
return result;

Результат переменной теперь имеет довольно большой объем. В дополнение к большому количеству вложенности это, как правило, очень нечитаемо, если вы немного больше здесь, скажем, у вас есть еще один цикл for-loop.

Я думаю, что это намного лучше:

doLotOfStuff();
return condition ? foo : bar;

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

Мне очень нравится

  • Свернуть область действия
  • Свести к минимуму отступ (чтобы избежать фигурных скобок)
  • Минимизировать длину метода

Предупреждение "Ненужное другое выражение" помогает в этом.

Ответ 4

Ну, я думаю, что использование множественного возврата не читается.

Я предпочитаю код как:

String result = null;

doLotOfStuff();
if (condition) { 
    result = foo; 
} else {
    result = bar; 
}

return result;

Несколько возвратов сложно понять. Но в вашем случае я предпочту postCheck

doLotOfStuff();
if (condition) { 
    return foo; 
} else {
    return bar; 
}

Ответ 5

Я нахожу эту форму

doLotOfStuff();
if (condition) { 
    return foo; 
}
return bar; 

чтобы быть более читаемым, чем тот, у которого есть else, он меньше кода и более интуитивно понятен, если вы думаете об этом как остерегающий, как в Рефакторинге Фаулера.

Вопрос о множественных точках возврата.

Ответ 6

Я знаю, что без проверки IDE для меня я почти всегда использую ненужное выражение else. Часто я нахожу, что сначала он лучше читает с ним, но обычно удаляет его, когда он указывается, поскольку я вижу, что он не нужен, и затем он меня обманывает...

Ответ 7

Назовите меня плохим мальчиком, но я бы обычно пошел с:

doLotOfStuff();
return condition ? foo : bar;

Операция с одним возвратом, очень читаемая.

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

public String myMethod(input) {
    if (!validate(input)) {
        return "invalid input";
    }

    operation1();
    if (someCondition) {
        operation2();
    } else {
        operation3();
    }
    operation4();
    operation5();
    return operation6();
}