别让公开函数互相调用:一条小而实用的经验法则
来源:matklad.github.io — 2026-10-29
📋 概述
matklad 提出一条小规模规则:公开函数不应直接调用另一个公开函数。DRY 的直觉会让人在 foo 里复用 bar,但公开 API 的目标是让调用点好用,一旦内部也复用这个接口,为了同时服务内外两种用法,函数会不断长出用户根本不该设置的可选参数,接口随时间劣化——而且劣化发生在代码共享之后,回头改的成本更高。做法是把共享实现抽成私有 helper,让两个公开函数各自调用它。唯一例外是「捷径 API」:公开函数本就该是若干公开调用的组合,此时反而禁止私有调用。
🔑 核心要点
- 反例很直白:foo() 里 return bar(.{ .frobnicate = true }) 等于让公开接口替内部语义背锅。
- 公开函数被内部复用后,会被迫增加用户不该设置的可选参数,接口逐步退化。
- 抽成私有 helper 后,helper 的签名可以随时改,因为改动是廉价而局部的。
- 例外是捷径 API:公开函数本就是常用调用链的组合,这时不允许私有调用,以免退化成多余的中间层。
- 顺带批评「为单测方便而 mock 方法」:该 mock 的是 IO,测的是软件功能,而不是方法。
💡 金句
你应该因为规则背后的理由去应用它,而不是因为它被写在了不可更改的圣典里。
👍 0
👎 0
← 返回 Lobsters 首页