【发布时间】:2019-03-08 10:46:13
【问题描述】:
官方 Go Code Review Comments 文档中的 Interfaces 规则说包应该返回具体类型而不是接口。这样做的动机是:
...无需大量重构即可将新方法添加到实现中。
我接受这可能是件好事。
但是,如果我正在编写的类型具有依赖项,没有它就无法达到目的怎么办?如果我导出具体类型,开发人员将能够实例化没有这种依赖关系的实例。为了对缺失的依赖进行防御性编码,我必须在每个方法实现中检查它,如果不存在则返回错误。如果开发人员在我的文档中错过了不要这样做的任何提示,她或他将在运行时才知道问题。
另一方面,如果我声明并返回带有客户端所需方法的接口,我可以取消导出具体类型并强制使用工厂方法,该方法接受依赖项作为参数并返回接口和错误.这似乎是确保正确使用包的更好方法。
我是不是因为这样想而没有正确地进入围棋精神?语言的伦理是否允许有一个不太完美的封装来为开发人员提供更多的灵活性?
【问题讨论】:
标签: go struct constructor interface