是否违反具有多个返回值的DRY原理代码?

时间:2019-01-25 05:09:17

标签: javascript dry

此代码是否违反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

1 个答案:

答案 0 :(得分: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;
}

现在,无论哪种方式,您都可以轻松地将对任何可能的错误的处理放入更有意义的地方。您可以在哪里识别错误,也可以在哪里处理错误。