Явный else
блок
Я не согласен с этим как с общим заявлением, охватывающим все if
утверждения, но бывают случаи, когда добавление else
блока по привычке - это хорошо.
На if
мой взгляд, заявление на самом деле охватывает две разные функции.
Если мы должны что-то сделать, сделайте это здесь.
Вещи как это, очевидно, не нуждаются в else
части.
if (customer.hasCataracts()) {
appointmentSuggestions.add(new CataractAppointment(customer));
}
if (customer.isDiabetic()) {
customer.assignNurse(DiabeticNurses.pickBestFor(customer));
}
и в некоторых случаях настаивание на добавлении else
может ввести в заблуждение.
if (k > n) {
return BigInteger.ZERO;
}
if (k <= 0 || k == n) {
return BigInteger.ONE;
}
это не то же самое, что
if (k > n) {
return BigInteger.ZERO;
} else {
if (k <= 0 || k == n) {
return BigInteger.ONE;
}
}
хотя это функционально то же самое. Запись первого if
с пустым else
может привести вас ко второму результату, который излишне уродлив.
Если мы проверяем определенное состояние, часто хорошей идеей является добавление пустого, else
чтобы напомнить вам о необходимости скрыть эту возможность.
// Count wins/losses.
if (doors[firstChoice] == Prize.Car) {
// We would have won without switching!
winWhenNotSwitched += 1;
} else {
// We win if we switched to the car!
if (doors[secondChoice] == Prize.Car) {
// We picked right!
winWhenSwitched += 1;
} else {
// Bad choice.
lost += 1;
}
}
Помните, что эти правила применяются только тогда, когда вы пишете новый код . ИМХО Пустые else
пункты должны быть удалены до регистрации.
Тест для true
, а не дляfalse
Опять же, это хороший совет на общем уровне, но во многих случаях это делает код излишне сложным и менее читаемым.
Хотя код как
if(!customer.canBuyAlcohol()) {
// ...
}
раздражает читателя, но делает это
if(customer.canBuyAlcohol()) {
// Do nothing.
} else {
// ...
}
по крайней мере так же плохо, если не хуже.
Я закодирован в BCPL много лет назад , и в этом языке есть IF
пункт иUNLESS
положение , чтобы вы могли закодировать гораздо более читаемы , как:
unless(customer.canBuyAlcohol()) {
// ...
}
что значительно лучше, но все же не идеально.
Мой личный процесс
Обычно, когда я пишу новый код, я часто добавляю пустой else
блок в if
оператор, чтобы напомнить мне, что я еще не рассмотрел эту возможность. Это помогает мне избежать DFS
ловушки и гарантирует, что, когда я просматриваю код, я замечаю, что есть еще что сделать. Тем не менее, я обычно добавляю TODO
комментарий, чтобы отслеживать.
if (returnVal == JFileChooser.APPROVE_OPTION) {
handleFileChosen();
} else {
// TODO: Handle case where they pressed Cancel.
}
Я нахожу, что обычно я else
редко использую в своем коде, поскольку это часто может указывать на запах кода.