主要观点:
- 书中探讨“深”与“浅”模块的区别,最佳模块应提供强大功能且接口简单,以 Go 中的
interface
类型为例。 io.Reader
是深接口的典范,简单易用,底层实现可复杂但不影响用户,对核心频繁使用的功能很重要。- 近期使用的
redis-go
客户端的Cmdable
是浅接口的例子,方法多且简单,实现单一,用户需理解各方法细节,代码审查时较难一眼看出发生了什么。 - 浅接口有方法小易测试、贴近系统 mental map 等优点,深接口如
io.Reader
可容易适配其他用例、保持稳定、便于组合等。
关键信息:
- 深接口
io.Reader
接口定义简单,有众多实现,如读文件、网络连接等。 - 浅接口
redis-go
的Cmdable
包含 45 个方法及 19 个接口扩展,约 200 个方法。 - 浅接口编写更自然,如
aws-sdk-go
的session Options
、Viper
的公共 API,但深接口有其优势。
重要细节:
io.Reader
的 docstring 告知用户所需知道的一切,使用时无需关心底层实现细节。redis-go
的Cmdable
方法简单,每个做一件事,用户需理解各方法差异。- 深接口如
go-kit/log.Logger
和http.Handler
在实际中体现了相关概念。 - 设计或审查抽象时应思考接口的“深度”,使其对用户隐藏复杂性并减少认知负担。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。