来自高级开发人员的建议:停止使用隐含的“else”
我认为有一种趋势——至少在初级开发人员中——认为代码越短越好。 (重复一遍:越短并不总是越好。)我当然会成为这种思路的牺牲品,尽管我知道这是错误的。 这就是为什么当我发现它时,我认为隐含的 else 是自切片以来最好的东西。
直到一位高级开发人员对我进行了其他教育。
这个隐含的“else”是什么?
如果我们已经熟悉该概念,请跳至下一部分。 对于其他所有人,请继续往下看:
将隐式 else 与 if 语句一起使用可以利用 return 语句结束函数执行这一事实。 在某些情况下,这可以让我们消除 else 语句,从而缩短代码。
看看下面的函数 giveMeFood
和 giveMeFoodImplicit
。 从技术上讲,我们不需要 else,因为如果你给我吃巧克力(只是说),该函数会提前返回“yum”并停止执行。 如果你不这样做,那么它会返回“no thank”。
/* 这两个函数给出相同的结果,
因为 return 结束了函数的执行。 */
function giveMeFood(food) {
if (food === 'chocolate') {
return 'yum';
} else {
return 'no thanks';
}
}
/* 如果食物是巧克力,函数执行将返回 'yum' 并终止——
无需其他声明! */
function giveMeFoodImplicit(food) {
if (food === 'chocolate') {
return 'yum';
}
return 'no thanks';
}
事实上,我可以添加更多 if...return
语句来代替 if...else
,并在末尾添加一个默认返回! 看起来更干净,不是吗? 这是否意味着我们可以永远吻别 else 呢?
function giveMeFoodChain(food) {
if (food === 'chocolate') {
return 'yum';
}
if (food === 'banana') {
return 'hmmmm';
}
if (food === 'papaya') {
return 'yikes';
}
return 'no thanks';
}
为什么以及何时避免隐含的“else”
肯定有使用隐式 else 的场合,但这是一位高级开发人员向我建议的:
- Elses 有助于使我们的条件句保持明确,以便其他人(包括未来的自己)可扩展并易于理解它们。
- 如果传入的参数不是我们的函数为处理而构建的,我们可以将 final else 用作剩余的情况或处理错误。
这是一个例子来说明他的意思。
假设我们有一个函数可以检查用户选择的国家,并返回一个拨号代码。 目前,checkCountryCode
仅用于处理“United States”和“United Kingdom”作为参数。 使用隐式 else 完全省略第二个条件并缩短代码是很诱人的。
/*
此功能旨在检查用户是否
来自美国或英国,并返回相应的国家代码。
*/
function checkCountryCodeExplicit(country) {
if (country === 'United States') {
return '+1';
} else if (country === 'United Kingdom') {
return '+44';
}
}
/*
使用隐式 else 使代码看起来更短是很诱人的——
但这不是好的做法!
*/
function checkCountryCodeImplicit(country) {
if (country === 'United States') {
return '+1';
}
return '+44';
}
如果我们以后想要扩展该功能以处理更多国家(例如乌拉圭和乌兹别克斯坦),就会出现问题。 隐式返回应该处理的内容很容易忘记或混淆(在这种情况下,如果输入是“United Kingdom”,它应该返回 +44)!
function checkCountryCodeImplicit(country) {
if (country === 'United States') {
return '+1';
}
if (country === 'Uruguay') {
return '+598';
}
if (country === 'Uzbekistan') {
return '+998';
}
// 很容易忘记这次返回的条件是什么!
return '+44';
}
现在这是用显式 else 重写的代码。 它肯定更长,但现在如果有人经过我们尚未考虑的国家/地区,则会引发错误——如果此函数嵌套在更大的代码库中,这将特别有用。
function checkCountryCode(country) {
if (country === 'United States') {
return '+1';
} else if (country === 'Uzbekistan') {
return '+998';
} else if (country === 'Uruguay') {
return '+598';
} else if (country === 'United Kingdom') {
return '+44';
} else {
// 如果传入了我们的函数尚未处理的国家/地区,这会提醒我们
throw new Error('This input is not supported at the moment.');
}
}
是的,我们可以在没有最后的 else 的情况下抛出错误,但这是我们需要问自己的一个基本问题:
省略左、右和居中的其他元素是否实际上使我的代码更易于理解? 如果有一堆 if...returns
,然后在底部突然出现一个 throw 语句,其他人可以直观地阅读吗?