标准答案
- 调用方只依赖需要的方法,减少实现者负担和变更影响。
- 隐式实现适合通过依赖注入替换真实客户端、Fake 和测试实现。
- 接口方法增加会让已有实现不再满足,公共库要谨慎演进。
- 具体类型需要保留时不要为了抽象而过早返回 interface。
题目解析
Go 接口由方法集合隐式实现,调用方可以定义只包含实际需要的方法,从而减少替换和演进成本。接口的价值在于行为边界,而不是隐藏所有具体类型。
公共接口增加方法会让已有实现失效,因此要谨慎演进。小接口也不能碎到失去语义,应该按稳定的消费场景组合。
测试可通过接口替换客户端和 Fake,但简单值对象不必为了 mock 强行抽象。需要返回具体类型时保留具体能力,避免过早使用 interface。
常见误区
- 误区:定义包含几十个方法的万能接口。改正:按调用方所需行为拆分,并用组合表达更大能力。
- 误区:接口由实现者先定义。改正:让消费者定义最小使用边界,减少不必要依赖。
- 误区:为了 mock 把所有结构体都改成接口。改正:只对外部依赖和变化边界抽象,值对象保持具体。