小接口与组合Small interfaces and composition
用尽量小的行为契约连接组件,将额外能力表达为可选接口。
- 核心约束
- 满足基础契约即可参与组合;可选路径仍须保持相同语义。
- 适用问题
- 输入输出流、存储适配层、可替换执行器及分层库接口。
- 边界与取舍
- 包装器可能隐藏可选能力;接口变小并不自动保证正确或高效。
常见操作#
以 Go io.Reader、io.Writer 和可选能力接口为例。
| 操作 | 时间成本 | 条件与说明 |
|---|---|---|
| 按最小能力调用 | 接口分派 + 被调用实现的实际工作 | 接口方法数少不意味着运行时总成本小;具体实现仍决定 I/O、分配和阻塞。 |
| 选择能力专用路径 | 类型 / 能力判断 + 专用实现 | 例如 Copy 优先使用 WriterTo 或 ReaderFrom,可省去通用缓冲循环。 |
实施成本#
- 时间成本
- 没有统一渐进界,应分析具体调用路径
- 空间成本
- 接口值、适配器及实现持有的资源
收益在于减少调用方必须了解的能力、使组合和测试更容易;过度拆分也会增加适配层和诊断成本。
工程中的应用#
3 个案例 · 附源码Go 的 HTTP 正文传输复用 io.CopyBuffer;复制器以 Reader/Writer 为基础,并探测可选的专用传输能力。
附源码片段 · 通信与流量
KVM 预先匹配设备通知地址,命中后 signal eventfd,使通知无需让 vCPU 逐次退回 QEMU 分派。
附源码片段 · 并发与一致性
libvirt 把 FD 和定时器接到 GLib 主循环,将停止监听与释放对象分开,并提高连接清理任务的优先级,避免资源用尽时清理一直排不上。
附源码片段 · 并发与一致性
原始实现与接口资料
Go 1.23 · io interfaces and copy dispatchReader / Writer 的最小契约及 WriterTo / ReaderFrom 可选优化路径。