【问题标题】:Does violate DRY principle code with multiple return values?是否违反具有多个返回值的 DRY 原则代码?
【发布时间】:2019-01-25 05:09:16
【问题描述】:

此代码是否违反 DRY 原则?

if (notAuthorized) {
    return sendErrorCode(new ForbiddenException())
} else if (notValid) {
    return sendErrorCode(new InvalidArgumentException())
} else if (outDated) {
    return sendErrorCode(new Error())
} else {
    return sendResult(result)
}

我的意思是所有这些带有 sendErrorCode 的行都是错误处理代码。
现在我只是在发生错误时发送错误代码,但是如果我需要记录错误或向分析发送请求或其他我需要编辑三行代码的东西怎么办。
也许我应该将 sendErrorCode 包装在一个更通用的函数中,比如 handleError

【问题讨论】:

  • 你在哪里重复这个if?在每个请求处理程序中?
  • “如果我需要记录错误或向分析或其他方式发送请求”在sendErrorCode 中进行操作。
  • 我投票结束这个问题,因为问题属于codereview.stackexchange.com
  • @NikKyriakides 现在它只在一个请求处理程序中
  • @Kaiido 那么 sendErrorCode 会丢失语义

标签: javascript dry


【解决方案1】:

是的,这违反了Don't Repeat Yourself 原则,因为它在多个地方包含了对错误处理程序的调用。尽管它仍然是一个需要修改的地方,但只修改一个地方会更好,并且每个块都保留一个单独的关注点。因此sendErrorCode 总是这样。它也不是一个隐藏的错误记录器。

为了更接近 DRY,您实际上应该将决策处理逻辑包装到新函数或块中,然后再决定是否要稍后发送错误代码。

这里我选择了一个函数,它带有一个可能的错误库和一个可能的结果。如果识别出错误,则返回它。否则返回结果。

const isThereAProblem = ({ notAuthorized, notValid, outDated }, result) => {
  if (notAuthorized) return new ForbiddenException();
  if (notValid) return new InvalidArgumentException();
  if (outDated) return new Error();
  return result;
}

您可以使用分支逻辑轻松做到这一点,但您明白了。设置一次,处理一次。

稍后在您的代码中

const result = isThereAProblem(possibleErrors, possibleResult);

if (result instanceof Error) return sendErrorCode(result);

return sendResult(result)

现在您有一个要修改的区域。只要确保您的例外是Error 的扩展,您就可以使用instanceof 运算符对其进行检查。要成为DRY,您必须使用语言提供给您的工具。

您应该将在多个地方调用的任何代码或函数提取到它们自己的区域中,以便在需求发生变化时可以轻松地对其进行修改。通过将错误检查移动到一个地方,从而消除对其自身区域的任何特殊处理,然后只检查通用案例,您将拥有更具适应性的代码。现在,如果您想在发回错误之前做一些事情,您可以在处理程序处展开 if 块:

if (result instanceof Error) {
  console.error(result);
  return sendErrorCode(result);
}

修改的地方。需要更专业的逻辑来处理不同类型的错误?放到isThereAProblem函数中

const isThereAProblem = ({ notAuthorized, notValid, outDated }, result) => {
  if (notAuthorized) {...}
  if (notValid) {...}
  if (outDated) {...}
  return result;
}

现在,无论哪种方式,您都可以轻松地将任何可能的错误的处理放到更有意义的地方。无论是您识别错误的位置,还是您处理错误的位置。

【讨论】:

  • 感谢您的回复。我在您的代码中看到类型检查。你认为我们无法避免吗? github.com/ryanmcdermott/…
  • 我认为您误解了那篇文章。无论你做什么类型检查,如果你做任何 if 语句来检查真实性。问题是你是否更早展开它,打破 DRY,并招致更多的开发人员债务,或者你是否稍后才这样做,使用类型检查,并招致更少的开发人员债务。我喜欢不太复杂的代码。一个单一的类型检查是一个很好的交换来管理我以后扩展我的代码的功能。
猜你喜欢
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多