This commit is contained in:
Xargin 2016-10-05 13:45:41 +08:00
parent f2df739842
commit 4991d9c975

View File

@ -1,9 +1,9 @@
## 7.15. 一些建议
当设计一个新的包时,新的Go程序员总是通过创建一个接口的集合开始和后面定义满足它们的具体类型。这种方式的结果就是有很多的接口,它们中的每一个仅只有一个实现。不要再这么做了。这种接口是不必要的抽象;它们也有一个运行时损耗。你可以使用导出机制(§6.6)来限制一个类型的方法或一个结构体的字段是否在包外可见。接口只有当有两个或两个以上的具体类型必须以相同的方式进行处理时才需要。
当设计一个新的包时,新手Go程序员总是先创建一套接口然后再定义一些满足它们的具体类型。这种方式的结果就是有很多的接口,它们中的每一个仅只有一个实现。不要再这么做了。这种接口是不必要的抽象;它们也有一个运行时损耗。你可以使用导出机制(§6.6)来限制一个类型的方法或一个结构体的字段是否在包外可见。接口只有当有两个或两个以上的具体类型必须以相同的方式进行处理时才需要。
当一个接口只被一个单一的具体类型实现时有一个例外,就是由于它的依赖,这个具体类型不能和这个接口存在在一个相同的包中。这种情况下,一个接口是解耦这两个包的一个好方式。
当一个接口只被一个单一的具体类型实现时有一个例外,就是由于它的依赖,这个具体类型不能和这个接口存在在一个相同的包中。这种情况下,一个接口是解耦这两个包的一个好方式。
因为在Go语言中只有当两个或更多的类型实现一个接口时才使用接口它们必定会从任意特定的实现细节中抽象出来。结果就是有更少和更简单方法经常和io.Writer或 fmt.Stringer一样只有一个的更小的接口。当新的类型出现时小的接口更容易满足。对于接口设计的一个好的标准就是 ask only for what you need只考虑你需要的东西
我们完成了对methods和接口的学习过程。Go语言良好的支持面向对象风格的编程,但这不是说你仅仅只能使用它。不是任何事物都需要被当做成一个对象;独立的函数有它们自己的用处,未封装的数据类型也是这样。同时观察到这两个在本书的前五章的例子中没有调用超过两打方法像input.Scan与之相反的是普遍的函数调用如fmt.Printf。
我们完成了对methods和接口的学习过程。Go语言对面向对象风格的编程支持良好,但这并不意味着你只能使用这一风格。不是任何事物都需要被当做成一个对象;独立的函数有它们自己的用处,未封装的数据类型也是这样。观察一下在本书前五章的例子中像input.Scan这样的方法被调用不超过二十次与之相反的是普遍的函数调用如fmt.Printf。