Явный 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редко использую в своем коде, поскольку это часто может указывать на запах кода.