深度与浅度 Go 接口

主要观点

  • 书中探讨“深”与“浅”模块的区别,最佳模块应提供强大功能且接口简单,以 Go 中的interface类型为例。
  • io.Reader是深接口的典范,简单易用,底层实现可复杂但不影响用户,对核心频繁使用的功能很重要。
  • 近期使用的redis-go客户端的Cmdable是浅接口的例子,方法多且简单,实现单一,用户需理解各方法细节,代码审查时较难一眼看出发生了什么。
  • 浅接口有方法小易测试、贴近系统 mental map 等优点,深接口如io.Reader可容易适配其他用例、保持稳定、便于组合等。

关键信息

  • 深接口io.Reader接口定义简单,有众多实现,如读文件、网络连接等。
  • 浅接口redis-goCmdable包含 45 个方法及 19 个接口扩展,约 200 个方法。
  • 浅接口编写更自然,如aws-sdk-gosession OptionsViper的公共 API,但深接口有其优势。

重要细节

  • io.Reader的 docstring 告知用户所需知道的一切,使用时无需关心底层实现细节。
  • redis-goCmdable方法简单,每个做一件事,用户需理解各方法差异。
  • 深接口如go-kit/log.Loggerhttp.Handler在实际中体现了相关概念。
  • 设计或审查抽象时应思考接口的“深度”,使其对用户隐藏复杂性并减少认知负担。
阅读 6
0 条评论