如何在请求校验流程中替换大量嵌套if语句?
避免嵌套if的重构方案
针对你这段多层嵌套的请求校验代码,最直接有效的优化方式是使用提前返回(守卫条款),把每个错误条件优先判断并返回结果,让主逻辑留在代码末尾,彻底消除嵌套。
重构思路
- 把所有失败的校验条件放在前面,一旦触发就直接返回对应错误响应,不再进入后续逻辑
- 保留合法情况下的主逻辑在代码最后,避免层层缩进
- 补充潜在异常的捕获处理,让校验逻辑更健壮
重构后的代码
public <T> ResponseEntity<T> validateRequest(Request request) { // 校验agent是否存在,不存在直接返回错误 if (!agentRepository.findAgentByRequestPoint(request.getPoint()).isPresent()) { return ResponseEntity.ok((T) ErrorDTO.from(bundle.getString("point.not.set"))); } // 校验function是否为CheckAcc,不是则直接返回错误 if (!"CheckAcc".equals(request.getAdvanced().getFunction())) { return ResponseEntity.ok((T) response.wrongCheck(1, 1)); } // 校验serviceId格式合法性及服务是否存在 try { Long serviceId = Long.parseLong(request.getAdvanced().getService()); if (!ServiceRepository.findServiceByServiceId(serviceId).isPresent()) { return ResponseEntity.ok((T) response.wrongCheck(1, 4)); } } catch (NumberFormatException e) { // 补充serviceId格式错误的处理逻辑,可根据实际需求调整错误码 return ResponseEntity.ok((T) response.wrongCheck(1, 5)); } // 所有校验通过,执行后续主逻辑 // ... 此处编写原嵌套最内层的业务逻辑 return ResponseEntity.ok((T) yourSuccessResponse); // 替换为实际成功响应对象 }
优化点说明
- 彻底消除三层嵌套,代码逻辑线性展开,可读性和维护性大幅提升
- 每个校验条件独立,后续新增或修改规则时,直接在对应位置调整即可,不会影响其他逻辑
- 新增了
Long.parseLong的异常捕获,避免格式错误导致的运行时异常,完善校验边界
内容的提问来源于stack exchange,提问作者Akbar Amanov
相关产品推荐
相关产品推荐

