Jawny elseblok
Nie zgadzam się z tym jako ogólne stwierdzenie obejmujące wszystkie ifstwierdzenia, ale zdarza się, że dodanie elsebloku z przyzwyczajenia jest dobrą rzeczą.
ifOświadczenie, moim zdaniem, w rzeczywistości obejmuje dwie odrębne funkcje.
Jeśli mamy coś zrobić, zrób to tutaj.
Takie rzeczy oczywiście nie wymagają elseczęści.
if (customer.hasCataracts()) {
appointmentSuggestions.add(new CataractAppointment(customer));
}
if (customer.isDiabetic()) {
customer.assignNurse(DiabeticNurses.pickBestFor(customer));
}
aw niektórych przypadkach naleganie na dodanie elsemoże wprowadzić w błąd.
if (k > n) {
return BigInteger.ZERO;
}
if (k <= 0 || k == n) {
return BigInteger.ONE;
}
to nie to samo co
if (k > n) {
return BigInteger.ZERO;
} else {
if (k <= 0 || k == n) {
return BigInteger.ONE;
}
}
nawet jeśli jest funkcjonalnie taki sam. Pisanie pierwszego ifz pustym elsemoże doprowadzić do drugiego wyniku, który jest niepotrzebnie brzydki.
Jeśli sprawdzamy konkretny stan, często dobrym pomysłem jest dodanie pustego, elseaby przypomnieć o sytuacji
// 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;
}
}
Pamiętaj, że te zasady obowiązują tylko podczas pisania nowego kodu . IMHO Puste elseklauzule powinny zostać usunięte przed odprawą.
Testuj true, a niefalse
Ponownie jest to dobra rada na poziomie ogólnym, ale w wielu przypadkach powoduje to, że kod jest niepotrzebnie złożony i mniej czytelny.
Mimo że kod podobny
if(!customer.canBuyAlcohol()) {
// ...
}
denerwuje czytelnika, ale robi to
if(customer.canBuyAlcohol()) {
// Do nothing.
} else {
// ...
}
jest co najmniej tak źle, jeśli nie gorzej.
I kodowane w BCPL wiele lat temu iw tym języku istnieje IFklauzula iUNLESS klauzula więc można kodować wiele bardziej czytelnie jako:
unless(customer.canBuyAlcohol()) {
// ...
}
co jest znacznie lepsze, ale wciąż nie idealne.
Mój osobisty proces
Zasadniczo, gdy piszę nowy kod, często dodaję pusty elseblok do ifinstrukcji, aby przypomnieć mi, że nie opisałem jeszcze tej ewentualności. Pomaga mi to uniknąć DFSpułapki i zapewnia, że kiedy przeglądam kod, zauważam, że jest więcej do zrobienia. Zazwyczaj jednak dodaję TODOkomentarz, aby śledzić.
if (returnVal == JFileChooser.APPROVE_OPTION) {
handleFileChosen();
} else {
// TODO: Handle case where they pressed Cancel.
}
Uważam, że generalnie elserzadko używam w kodzie, ponieważ często może to wskazywać na zapach kodu.