来自高级开发人员的建议:停止使用隐含的“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 的场合,但这是一位高级开发人员向我建议的:

  1. Elses 有助于使我们的条件句保持明确,以便其他人(包括未来的自己)可扩展并易于理解它们。
  2. 如果传入的参数不是我们的函数为处理而构建的,我们可以将 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 语句,其他人可以直观地阅读吗?

免责声明:
1.本站所有内容由本站原创、网络转载、消息撰写、网友投稿等几部分组成。
2.本站原创文字内容若未经特别声明,则遵循协议CC3.0共享协议,转载请务必注明原文链接。
3.本站部分来源于网络转载的文章信息是出于传递更多信息之目的,不意味着赞同其观点。
4.本站所有源码与软件均为原作者提供,仅供学习和研究使用。
5.如您对本网站的相关版权有任何异议,或者认为侵犯了您的合法权益,请及时通知我们处理。
火焰兔 » 来自高级开发人员的建议:停止使用隐含的“else”