核心问题
系统越界时,应该继续跑还是立刻停?
工程困境
坏代码:
function refund(order) {
order.status = "refunded"
}
它允许 pending、canceled、甚至 already refunded 的订单再次退款。
思想模型
断言是在守卫逻辑边界:
assert(order.status === "paid", "ONLY_PAID_ORDER_CAN_BE_REFUNDED")
如果这个条件不成立,继续运行比失败更危险。
好做法
防御性编程不是到处 try-catch,而是把关键不变量写成代码:
function refundOrder(order) {
assert(order.status === "paid", "ONLY_PAID_ORDER_CAN_BE_REFUNDED")
assert(order.refundedAt == null, "ORDER_ALREADY_REFUNDED")
return { ...order, status: "refunded", refundedAt: new Date() }
}
Atlas Action
找一个直接改 status 的地方。把它替换成命名动作,并在入口写断言。
小结
断言不是装饰,而是系统拒绝进入非法世界的门。