显式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
很少在我的代码中使用它,因为它通常可以指示代码气味。