空对象模式的目的:消除空指针分支

副标题 / 摘要 空对象模式用“可用但无效果”的对象替代 null,减少分支判断与空指针风险。本文给出适用场景与示例。 目标读者 频繁处理空指针的工程师 需要简化分支逻辑的开发者 关注代码可读性的团队 背景 / 动机 到处写 if obj is None 会让代码变得难读且易遗漏。 空对象模式通过提供“默认实现”,让调用方无需关心空值。 核心概念 空对象:实现相同接口但执行空操作 统一接口:调用方不区分真实对象与空对象 可替代性:替代 null 而不破坏逻辑 实践指南 / 步骤 定义统一接口 实现真实对象与空对象 在创建阶段选择真实/空对象 调用方不写 null 分支 可运行示例 class Notifier: def send(self, msg: str) -> None: raise NotImplementedError class EmailNotifier(Notifier): def send(self, msg: str) -> None: print("email:", msg) class NullNotifier(Notifier): def send(self, msg: str) -> None: pass def get_notifier(enabled: bool) -> Notifier: return EmailNotifier() if enabled else NullNotifier() if __name__ == "__main__": notifier = get_notifier(False) notifier.send("hello") # 不需要 if 判断 解释与原理 空对象模式把“缺失”变成一个合法对象。 这样调用方无需分支判断,避免空指针错误。 ...

2026年1月24日 · 1 分钟 · map[name:Jeanphilo]

空引用为何危险:Null Reference 的问题与移除代价

副标题 / 摘要 空引用(null reference)是许多语言里最常见、最隐蔽的错误来源。本文解释它的问题根源,并讨论如果从语言层面移除 null,工程上会发生哪些变化。 目标读者 在日常开发中经常遇到 NPE 的工程师 关注类型系统与语言设计的中级开发者 需要制定团队空值规范的技术负责人 背景 / 动机 空引用让“缺失”变成一个运行时炸弹:它绕过了编译期检查,把错误延后到线上。 Tony Hoare 将 null 称为 “Billion-Dollar Mistake”,并不夸张,因为这类错误难复现、难定位、损失巨大。 核心概念 Null Reference:指向“无对象”的引用值 可空类型(Nullable):类型系统中显式标注“可能不存在” Option/Maybe:用代数数据类型表达“有值 / 无值” Null Object:用默认对象代替 null,消除分支 实践指南 / 步骤 边界处标注可空:DB/JSON/外部 API 都可能产生缺失字段。 优先使用 Option/Maybe:让“可能缺失”变成类型的一部分。 可空值进入核心域之前要处理:转换成默认值或显式错误。 开启静态检查:例如 TypeScript strictNullChecks。 必要时用 Null Object:减少分支,保持业务逻辑纯净。 示例配置(TypeScript): { "compilerOptions": { "strictNullChecks": true } } 可运行示例 下面用 Null Object 消除空引用: class User: def __init__(self, name: str): self.name = name def greeting(self) -> str: return f"Hello, {self.name}" class NullUser(User): def __init__(self): super().__init__("Guest") def greeting(self) -> str: return "Hello, Guest" def find_user(user_id: int) -> User: if user_id == 1: return User("Alice") return NullUser() if __name__ == "__main__": print(find_user(1).greeting()) print(find_user(404).greeting()) 解释与原理 空引用的问题不在“值为 null”,而在它把“业务状态”变成了“控制流”。 一旦你忘记判断,就会在运行期炸裂。 移除 null 的语言(如 Rust、Haskell)强迫你在类型层面处理缺失情况,换来更强的可维护性与可测试性。 ...

2026年1月24日 · 1 分钟 · map[name:Jeanphilo]