Null Object 模式
用一个实现了目标接口、行为中性(什么都不做或返回安全默认值)的对象替代 null,避免调用方做 null 检查,同时保证接口契约不被破坏。
定义
Null Object 模式是一种行为型设计模式。当某个对象可能为 null 时,不返回 null,而是返回一个实现了同一接口但行为"中性"的对象——它不做任何有意义的操作,但合法地满足接口契约。
核心价值
- 消除 null 检查:调用方无需
if (obj !== null)分支,直接调用方法 - 保持接口一致:Null Object 和真实对象实现同一接口,对调用方透明
- 明确意图:
isLoopFinished()比stopWhen: undefined更能表达"我想要自然终止"的意图
典型示例(vercel/ai)
typescript
// stop-condition.ts:L37-L39
export function isLoopFinished(): StopCondition<any, any> {
return () => false; // 永远返回 false,不干预循环终止
}
isLoopFinished() 是一个标准的 Null Object:它实现了 StopCondition 接口,但行为是"永远不停止"——把循环终止的决定权完全交给自然终止机制(LLM 返回 stop finish reason)。
与 Sentinel Value 的区别
- Sentinel Value:用一个特殊值(如 -1、
"DONE")标记特殊状态,关注值的语义 - Null Object:用一个合法对象的中性行为替代 null,关注行为的委托
isLoopFinished() 是 Null Object 而非 Sentinel,因为它在做"真实的事"(评估是否停止),只是结论永远是"不停止"。
命名陷阱
isLoopFinished 这个名字具有误导性——字面意思是"循环已完成",但实际语义是"让循环自然完成,不人为干预"。这类命名问题在使用 Null Object 时很常见,建议用 neverStop 或 naturalTermination 等更直白的名字。
引用本术语的文章