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 时很常见,建议用 neverStopnaturalTermination 等更直白的名字。

引用本术语的文章