diff --git a/README.md b/README.md index 7514593..84ace39 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ Go tips from [Phuong Le](https://twitter.com/func25). | 53 | | | | 54 | | | | 55 | | | -| 56 | | | +| 56 | Simplify interfaces and only ask for what you really need | cannian1 | | 57 | | | | 58 | | | | 59 | | | diff --git a/src/056.md b/src/056.md new file mode 100644 index 0000000..6e04aa1 --- /dev/null +++ b/src/056.md @@ -0,0 +1,43 @@ +# Tip #56 简化接口并只要求你真正需要的东西 + +> 原始链接:[Golang Tip #56: Simplify interfaces and only ask for what you really need](https://twitter.com/func25/status/1771187871032176691) + +在Go中定义接口时,请遵循以下技巧: + +1. 只有在实际需要时才定义接口。 +2. 接受接口并返回具体类型。 +3. 将接口放在它们被使用的地方(消费者),而不是它们被创建的地方(生产者)。([Tip #18](./018.md)) + +技巧[3](#3) 实际上是基于技巧[1](#1)的。 + +但是还有一个额外的技巧,让我们遵循"[2. 接受接口并返回具体类型。](#2)" + +你能在下面的例子中发现一个问题吗? + +![](./images/056/1.png) + +上述示例仅用于展示提示的目的,可能不符合最佳实践、命名规范等。 + +问题是,LogUserDetails(…) 函数**仅仅**需要 GetUser 方法,而不需要 CreateUser 或 UpdateUser 方法。 + +这种设置并不理想,因为它将函数与一个广泛的接口绑定在一起,这使得测试变得更加困难,降低了灵活性,并且可读性较差。 + + +接口有助于实现抽象,但是**接口越庞大,它就变得越不抽象**。 + +> “为什么这对测试来说是不利的?” + +当我们进行测试时,我们不应该搞清楚输入接口的哪些方法被使用了,对吧? + +而且,设置一个我们不需要的庞大的 Mock 对象也很麻烦。 + +那么,怎么做更好呢? + +你可能已经猜到了,我们的函数应该请求一个只有**它需要的东西**的接口: + +![](./images/056/2.png) + + +任何符合 UserManager 的具体类型也同样应该符合 UserGetter。 + +这个简单的改变使得代码更易于测试,也更清晰。 \ No newline at end of file diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 84c1b1f..aa364f1 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -21,6 +21,7 @@ - [Tip #44 有意地使用Must函数来停止程序](./044.md) - [Tip #47 表驱动测试,测试集和并行运行测试](./047.md) - [Tip #50 使结构体不可比较](./050.md) +- [Tip #56 简化接口并只要求你真正需要的东西](./056.md) - [Tip #60 sync.Once是执行单次操作的最佳方式](./060.md) - [Tip #71 用泛型让 sync.Pool 类型安全](./071.md) - [Tip #63 避免使用time.Sleep(),它不能被context感知且无法被中断](./063.md) diff --git a/src/images/056/1.png b/src/images/056/1.png new file mode 100644 index 0000000..6c14db3 Binary files /dev/null and b/src/images/056/1.png differ diff --git a/src/images/056/2.png b/src/images/056/2.png new file mode 100644 index 0000000..ed9c068 Binary files /dev/null and b/src/images/056/2.png differ