这部分内容跟《程序员修炼之道》中契约式编程的前置校验的思想很是相像。在方法的入口处添加校验可以实现fail early, 避免一些报错或计算出错误的结果。同时,主动的检验参数并抛出异常,还可以帮助程序员在报错时尽快的检查出问题所在。
检查参数有效性的方法主有以下4种:
- 使用注解校验入参,如@NotNull
- 在方法入口处使用if 校验入参,这类用法在系统中极为常见:
if (!checkXxxValid(xxx)) {
OperationResult.getInstance().addErrorMessageAndBreak(failReason);
}
- 使用java自带的方法,如Objects的requireNonNull、checkFromIndexSize、 checkFromToIndex、checkIndex等
- 使用assert 断言,如 assert xxxx != null、assertEquals(x,y) 等。不过在我们的产品上这个开关是关闭的。
思考:
在方法的入口处做前置校验非常有必要,虽然我们在设计方法时,往往会跟调用方约定好“契约”, 但是代码的约束比文档或口头的约定更可靠。因此我们必须要根据契约做前置校验。
校验的范围:前置校验的范围应该跟契约保持一致,比契约多或者少都是不合理的。系统中最典型的用法应该是在接口的设计中,接口的入口处都要对入参进行校验,校验的规则与提供的文档保持一致。
读这段代码时,让我想起来了算费过程的一些方法,在计算时合同是必须的,否则会抛NPE。但是很多方法在设计时,没有做前置校验,都是在发生了报错之后再补的。