此代码是否违反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
答案 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;
}
现在,无论哪种方式,您都可以轻松地将对任何可能的错误的处理放入更有意义的地方。您可以在哪里识别错误,也可以在哪里处理错误。