官方 Go Code Review Comments 文档中的Interfaces规则说包应该返回具体类型而不是接口。这样做的动机是:
...可以将新方法添加到实现中,而无需进行大量重构。
我接受这可能是一件好事。
但是,如果我正在编写的类型具有依赖性,没有它就无法达到目的怎么办?如果我导出具体类型,开发人员将能够在没有该依赖性的情况下实例化实例。为了针对缺失的依赖项进行防御性编码,我必须在每个方法实现中检查它,如果不存在则返回错误。如果开发人员在我的文档中遗漏了任何不要这样做的提示,她或他将在运行时之前不会了解问题。
另一方面,如果我用客户端需要的方法声明并返回一个接口,我可以取消导出具体类型并强制使用接受依赖项作为参数并返回接口和错误的工厂方法。这似乎是确保正确使用包的更好方法。
通过这样的思考,我是否以某种方式没有正确地进入 go 精神?语言的道德规范是否可以通过不完美的封装来为开发人员提供更大的灵活性?
www说
相关分类