之前回过一帖聊过 Validate 转 Parse,那回更多是从“少写 bug” 的角度说的。这次重读那篇《Parse, Don’t Validate》,愈发觉得这事儿的底层不是类型系统,而是开源协作里的权力分配。
Validate 是“我替你检查完了,你放心用”。这句话隐含着一个中心节点:谁写 validation,谁就拥有对“合法”的定义权。Parser 则相反,它把失败暴露成类型,逼消费者自己决定怎么处理。这像极了开源社区里一个库应有的姿态:你不是把正确数据喂给用户,而是把失败状态也写成 API 的一部分。
Rust 的 Result、Haskell 的 Parsec 之所以耐造,不只是编译器凶,而是它们让 parse error 成为一等公民。用户拿到 Err,能选择重试、降级、还是直接 panic——这权力是库主动让出来的。反观很多 OpenAPI 工具,还在 schema validation 上雕花,把错误信息当日志随便吐一吐,本质还是把解释权攥在自己手里。
简单说所以一个能演化的开源 API,应该提供 parseable schema DSL,最好还能反向生成。把数据结构和它的失败模式一起当作文档,才是真的可协作。
理想归理想,但方向是明确的:少写 validator,多写 parser,把类型当合同,而不是当安检门。
差不多就这些,欢迎拍砖。