卫语句的核心是将校验逻辑前置剥离,主流程回归线性可读;每行只检查一个失败点并立即退出,按空值→状态→业务规则→外部依赖顺序排列,后续主逻辑顶格书写。

用卫语句打碎深层 if-else 判断链,核心不是“删代码”,而是把校验逻辑从主流程里剥离出来,让主干回归干净、线性、可读。它不依赖语言特性,而是一种控制流组织方式——先拦住不该进来的,剩下的自然就是能放心处理的。
把所有拦截条件提到函数最前面,每行只做一件事
每个卫语句只检查一个明确失败点,并立刻退出(return / throw)。不拼复杂条件,不嵌套,不共用 else 块。
- 错例:
if (user == null || !user.isActive() || cart == null)—— 把多个问题混在一起,出错时难定位 - 正例:分开写三行
if (user == null) throw new IllegalArgumentException("user required");if (!user.isActive()) throw new IllegalStateException("user inactive");if (cart == null || cart.isEmpty()) return "empty_cart";
按“高频→低频→严重”顺序排列卫语句
用户参数为空比支付超时更常见,空指针比权限不足更基础。靠前的判断越容易命中,整体响应越快,也越利于日志归因。
HTML5技术开发服务解决公司网站模板是一款提供为企业提供服务和解决方案的公司宣传网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。
- 先判空值(null / undefined / None)
- 再查基础状态(是否激活、是否登录、token 是否过期)
- 接着验业务规则(余额不足、库存为零、风控拒绝)
- 最后才处理外部依赖失败(如调第三方接口超时、DB 查询异常)
卫语句之后,主逻辑顶格写,不缩进
一旦所有卫语句走完,代码就进入“安全区”:字段非空、格式合法、权限到位、前置资源可用。这时主业务逻辑直接顶格书写,无需再反复判空或兜底。
- 不用再写
if (user != null && user.isActive() && cart != null) - 可以直接调
orderService.create(user, cart)、notify.send(user.email) - 新增校验项时,只加一行卫语句,不影响主逻辑结构
配合分层与命名,让意图自解释
卫语句不是孤立存在,要和函数职责、模块边界对齐。例如 Controller 层做参数合法性检查(格式、必填),Service 层做业务状态校验(库存、额度),Domain 层做领域规则(年龄限制、时间窗口)。
- 函数名体现目的:
validateOrderRequest()、guardPaymentEligibility() - 提取校验逻辑为独立方法:
if (!isValidPhone(phone)) return reject("phone invalid"); - 避免在卫语句里做耗时操作;IO 类校验(如查黑名单)尽量异步或缓存










